mirror of
				https://gitea.com/gitea/tea.git
				synced 2025-10-31 01:05:26 +01:00 
			
		
		
		
	Add Makefile / .drone.yml, use go module with vendor (#20)
* add Makefile / .drone.yml, use go module with vendor * Update .drone.yml Co-Authored-By: lunny <xiaolunwen@gmail.com>
This commit is contained in:
		
							
								
								
									
										20
									
								
								vendor/code.gitea.io/sdk/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/code.gitea.io/sdk/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| Copyright (c) 2016 The Gitea Authors | ||||
| Copyright (c) 2014 The Gogs Authors | ||||
|  | ||||
| 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. | ||||
							
								
								
									
										22
									
								
								vendor/code.gitea.io/sdk/gitea/admin_org.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/code.gitea.io/sdk/gitea/admin_org.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| // Copyright 2015 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // AdminCreateOrg create an organization | ||||
| func (c *Client) AdminCreateOrg(user string, opt CreateOrgOption) (*Organization, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	org := new(Organization) | ||||
| 	return org, c.getParsedResponse("POST", fmt.Sprintf("/admin/users/%s/orgs", user), | ||||
| 		jsonHeader, bytes.NewReader(body), org) | ||||
| } | ||||
							
								
								
									
										22
									
								
								vendor/code.gitea.io/sdk/gitea/admin_repo.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/code.gitea.io/sdk/gitea/admin_repo.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| // Copyright 2015 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // AdminCreateRepo create a repo | ||||
| func (c *Client) AdminCreateRepo(user string, opt CreateRepoOption) (*Repository, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	repo := new(Repository) | ||||
| 	return repo, c.getParsedResponse("POST", fmt.Sprintf("/admin/users/%s/repos", user), | ||||
| 		jsonHeader, bytes.NewReader(body), repo) | ||||
| } | ||||
							
								
								
									
										85
									
								
								vendor/code.gitea.io/sdk/gitea/admin_user.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								vendor/code.gitea.io/sdk/gitea/admin_user.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| // Copyright 2015 The Gogs Authors. All rights reserved. | ||||
| // Copyright 2019 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // CreateUserOption create user options | ||||
| type CreateUserOption struct { | ||||
| 	SourceID  int64  `json:"source_id"` | ||||
| 	LoginName string `json:"login_name"` | ||||
| 	// required: true | ||||
| 	Username string `json:"username" binding:"Required;AlphaDashDot;MaxSize(40)"` | ||||
| 	FullName string `json:"full_name" binding:"MaxSize(100)"` | ||||
| 	// required: true | ||||
| 	// swagger:strfmt email | ||||
| 	Email string `json:"email" binding:"Required;Email;MaxSize(254)"` | ||||
| 	// required: true | ||||
| 	Password           string `json:"password" binding:"Required;MaxSize(255)"` | ||||
| 	MustChangePassword *bool  `json:"must_change_password"` | ||||
| 	SendNotify         bool   `json:"send_notify"` | ||||
| } | ||||
|  | ||||
| // AdminCreateUser create a user | ||||
| func (c *Client) AdminCreateUser(opt CreateUserOption) (*User, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	user := new(User) | ||||
| 	return user, c.getParsedResponse("POST", "/admin/users", jsonHeader, bytes.NewReader(body), user) | ||||
| } | ||||
|  | ||||
| // EditUserOption edit user options | ||||
| type EditUserOption struct { | ||||
| 	SourceID  int64  `json:"source_id"` | ||||
| 	LoginName string `json:"login_name"` | ||||
| 	FullName  string `json:"full_name" binding:"MaxSize(100)"` | ||||
| 	// required: true | ||||
| 	// swagger:strfmt email | ||||
| 	Email                   string `json:"email" binding:"Required;Email;MaxSize(254)"` | ||||
| 	Password                string `json:"password" binding:"MaxSize(255)"` | ||||
| 	MustChangePassword      *bool  `json:"must_change_password"` | ||||
| 	Website                 string `json:"website" binding:"MaxSize(50)"` | ||||
| 	Location                string `json:"location" binding:"MaxSize(50)"` | ||||
| 	Active                  *bool  `json:"active"` | ||||
| 	Admin                   *bool  `json:"admin"` | ||||
| 	AllowGitHook            *bool  `json:"allow_git_hook"` | ||||
| 	AllowImportLocal        *bool  `json:"allow_import_local"` | ||||
| 	MaxRepoCreation         *int   `json:"max_repo_creation"` | ||||
| 	ProhibitLogin           *bool  `json:"prohibit_login"` | ||||
| 	AllowCreateOrganization *bool  `json:"allow_create_organization"` | ||||
| } | ||||
|  | ||||
| // AdminEditUser modify user informations | ||||
| func (c *Client) AdminEditUser(user string, opt EditUserOption) error { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = c.getResponse("PATCH", fmt.Sprintf("/admin/users/%s", user), jsonHeader, bytes.NewReader(body)) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // AdminDeleteUser delete one user according name | ||||
| func (c *Client) AdminDeleteUser(user string) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/admin/users/%s", user), nil, nil) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // AdminCreateUserPublicKey create one user with options | ||||
| func (c *Client) AdminCreateUserPublicKey(user string, opt CreateKeyOption) (*PublicKey, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	key := new(PublicKey) | ||||
| 	return key, c.getParsedResponse("POST", fmt.Sprintf("/admin/users/%s/keys", user), jsonHeader, bytes.NewReader(body), key) | ||||
| } | ||||
							
								
								
									
										92
									
								
								vendor/code.gitea.io/sdk/gitea/attachment.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								vendor/code.gitea.io/sdk/gitea/attachment.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| // Copyright 2017 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 gitea // import "code.gitea.io/sdk/gitea" | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"mime/multipart" | ||||
| 	"net/http" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // Attachment a generic attachment | ||||
| // swagger:model | ||||
| type Attachment struct { | ||||
| 	ID            int64  `json:"id"` | ||||
| 	Name          string `json:"name"` | ||||
| 	Size          int64  `json:"size"` | ||||
| 	DownloadCount int64  `json:"download_count"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Created     time.Time `json:"created_at"` | ||||
| 	UUID        string    `json:"uuid"` | ||||
| 	DownloadURL string    `json:"browser_download_url"` | ||||
| } | ||||
|  | ||||
| // ListReleaseAttachments list release's attachments | ||||
| func (c *Client) ListReleaseAttachments(user, repo string, release int64) ([]*Attachment, error) { | ||||
| 	attachments := make([]*Attachment, 0, 10) | ||||
| 	err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/%d/assets", user, repo, release), | ||||
| 		nil, nil, &attachments) | ||||
| 	return attachments, err | ||||
| } | ||||
|  | ||||
| // GetReleaseAttachment returns the requested attachment | ||||
| func (c *Client) GetReleaseAttachment(user, repo string, release int64, id int64) (*Attachment, error) { | ||||
| 	a := new(Attachment) | ||||
| 	err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/%d/assets/%d", user, repo, release, id), | ||||
| 		nil, nil, &a) | ||||
| 	return a, err | ||||
| } | ||||
|  | ||||
| // CreateReleaseAttachment creates an attachment for the given release | ||||
| func (c *Client) CreateReleaseAttachment(user, repo string, release int64, file io.Reader, filename string) (*Attachment, error) { | ||||
| 	// Write file to body | ||||
| 	body := new(bytes.Buffer) | ||||
| 	writer := multipart.NewWriter(body) | ||||
| 	part, err := writer.CreateFormFile("attachment", filename) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	if _, err = io.Copy(part, file); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err = writer.Close(); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// Send request | ||||
| 	attachment := new(Attachment) | ||||
| 	err = c.getParsedResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/%d/assets", user, repo, release), | ||||
| 		http.Header{"Content-Type": {writer.FormDataContentType()}}, body, &attachment) | ||||
| 	return attachment, err | ||||
| } | ||||
|  | ||||
| // EditReleaseAttachment updates the given attachment with the given options | ||||
| func (c *Client) EditReleaseAttachment(user, repo string, release int64, attachment int64, form EditAttachmentOptions) (*Attachment, error) { | ||||
| 	body, err := json.Marshal(&form) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	attach := new(Attachment) | ||||
| 	return attach, c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/releases/%d/assets/%d", user, repo, release, attachment), jsonHeader, bytes.NewReader(body), attach) | ||||
| } | ||||
|  | ||||
| // DeleteReleaseAttachment deletes the given attachment including the uploaded file | ||||
| func (c *Client) DeleteReleaseAttachment(user, repo string, release int64, id int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/releases/%d/assets/%d", user, repo, release, id), nil, nil) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // EditAttachmentOptions options for editing attachments | ||||
| // swagger:model | ||||
| type EditAttachmentOptions struct { | ||||
| 	Name string `json:"name"` | ||||
| } | ||||
							
								
								
									
										5
									
								
								vendor/code.gitea.io/sdk/gitea/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								vendor/code.gitea.io/sdk/gitea/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| // Copyright 2016 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 gitea // import "code.gitea.io/sdk/gitea" | ||||
							
								
								
									
										39
									
								
								vendor/code.gitea.io/sdk/gitea/fork.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								vendor/code.gitea.io/sdk/gitea/fork.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| // Copyright 2016 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // ListForks list a repository's forks | ||||
| func (c *Client) ListForks(user, repo string) ([]*Repository, error) { | ||||
| 	forks := make([]*Repository, 10) | ||||
| 	err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/forks", user, repo), | ||||
| 		nil, nil, &forks) | ||||
| 	return forks, err | ||||
| } | ||||
|  | ||||
| // CreateForkOption options for creating a fork | ||||
| type CreateForkOption struct { | ||||
| 	// organization name, if forking into an organization | ||||
| 	Organization *string `json:"organization"` | ||||
| } | ||||
|  | ||||
| // CreateFork create a fork of a repository | ||||
| func (c *Client) CreateFork(user, repo string, form CreateForkOption) (*Repository, error) { | ||||
| 	body, err := json.Marshal(form) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	fork := new(Repository) | ||||
| 	err = c.getParsedResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/forks", user, repo), | ||||
| 		jsonHeader, bytes.NewReader(body), &fork) | ||||
| 	return fork, err | ||||
| } | ||||
							
								
								
									
										14
									
								
								vendor/code.gitea.io/sdk/gitea/git_blob.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/code.gitea.io/sdk/gitea/git_blob.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| // Copyright 2019 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 gitea | ||||
|  | ||||
| // GitBlobResponse represents a git blob | ||||
| type GitBlobResponse struct { | ||||
| 	Content  string `json:"content"` | ||||
| 	Encoding string `json:"encoding"` | ||||
| 	URL      string `json:"url"` | ||||
| 	SHA      string `json:"sha"` | ||||
| 	Size     int64  `json:"size"` | ||||
| } | ||||
							
								
								
									
										54
									
								
								vendor/code.gitea.io/sdk/gitea/git_hook.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								vendor/code.gitea.io/sdk/gitea/git_hook.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| // Copyright 2019 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // GitHook represents a Git repository hook | ||||
| type GitHook struct { | ||||
| 	Name     string `json:"name"` | ||||
| 	IsActive bool   `json:"is_active"` | ||||
| 	Content  string `json:"content,omitempty"` | ||||
| } | ||||
|  | ||||
| // GitHookList represents a list of Git hooks | ||||
| type GitHookList []*GitHook | ||||
|  | ||||
| // ListRepoGitHooks list all the Git hooks of one repository | ||||
| func (c *Client) ListRepoGitHooks(user, repo string) (GitHookList, error) { | ||||
| 	hooks := make([]*GitHook, 0, 10) | ||||
| 	return hooks, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/hooks/git", user, repo), nil, nil, &hooks) | ||||
| } | ||||
|  | ||||
| // GetRepoGitHook get a Git hook of a repository | ||||
| func (c *Client) GetRepoGitHook(user, repo, id string) (*GitHook, error) { | ||||
| 	h := new(GitHook) | ||||
| 	return h, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/hooks/git/%s", user, repo, id), nil, nil, h) | ||||
| } | ||||
|  | ||||
| // EditGitHookOption options when modifying one Git hook | ||||
| type EditGitHookOption struct { | ||||
| 	Content string `json:"content"` | ||||
| } | ||||
|  | ||||
| // EditRepoGitHook modify one Git hook of a repository | ||||
| func (c *Client) EditRepoGitHook(user, repo, id string, opt EditGitHookOption) error { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = c.getResponse("PATCH", fmt.Sprintf("/repos/%s/%s/hooks/git/%s", user, repo, id), jsonHeader, bytes.NewReader(body)) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // DeleteRepoGitHook delete one Git hook from a repository | ||||
| func (c *Client) DeleteRepoGitHook(user, repo, id string) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/hooks/git/%s", user, repo, id), nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										125
									
								
								vendor/code.gitea.io/sdk/gitea/gitea.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								vendor/code.gitea.io/sdk/gitea/gitea.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| // Copyright 2014 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // Version return the library version | ||||
| func Version() string { | ||||
| 	return "0.12.3" | ||||
| } | ||||
|  | ||||
| // Client represents a Gogs API client. | ||||
| type Client struct { | ||||
| 	url         string | ||||
| 	accessToken string | ||||
| 	sudo        string | ||||
| 	client      *http.Client | ||||
| } | ||||
|  | ||||
| // NewClient initializes and returns a API client. | ||||
| func NewClient(url, token string) *Client { | ||||
| 	return &Client{ | ||||
| 		url:         strings.TrimSuffix(url, "/"), | ||||
| 		accessToken: token, | ||||
| 		client:      &http.Client{}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // NewClientWithHTTP creates an API client with a custom http client | ||||
| func NewClientWithHTTP(url string, httpClient *http.Client) { | ||||
| 	client := NewClient(url, "") | ||||
| 	client.client = httpClient | ||||
| } | ||||
|  | ||||
| // SetHTTPClient replaces default http.Client with user given one. | ||||
| func (c *Client) SetHTTPClient(client *http.Client) { | ||||
| 	c.client = client | ||||
| } | ||||
|  | ||||
| // SetSudo sets username to impersonate. | ||||
| func (c *Client) SetSudo(sudo string) { | ||||
| 	c.sudo = sudo | ||||
| } | ||||
|  | ||||
| func (c *Client) doRequest(method, path string, header http.Header, body io.Reader) (*http.Response, error) { | ||||
| 	req, err := http.NewRequest(method, c.url+"/api/v1"+path, body) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if len(c.accessToken) != 0 { | ||||
| 		req.Header.Set("Authorization", "token "+c.accessToken) | ||||
| 	} | ||||
| 	if c.sudo != "" { | ||||
| 		req.Header.Set("Sudo", c.sudo) | ||||
| 	} | ||||
| 	for k, v := range header { | ||||
| 		req.Header[k] = v | ||||
| 	} | ||||
|  | ||||
| 	return c.client.Do(req) | ||||
| } | ||||
|  | ||||
| func (c *Client) getResponse(method, path string, header http.Header, body io.Reader) ([]byte, error) { | ||||
| 	resp, err := c.doRequest(method, path, header, body) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	defer resp.Body.Close() | ||||
|  | ||||
| 	data, err := ioutil.ReadAll(resp.Body) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	switch resp.StatusCode { | ||||
| 	case 403: | ||||
| 		return nil, errors.New("403 Forbidden") | ||||
| 	case 404: | ||||
| 		return nil, errors.New("404 Not Found") | ||||
| 	case 409: | ||||
| 		return nil, errors.New("409 Conflict") | ||||
| 	case 422: | ||||
| 		return nil, fmt.Errorf("422 Unprocessable Entity: %s", string(data)) | ||||
| 	} | ||||
|  | ||||
| 	if resp.StatusCode/100 != 2 { | ||||
| 		errMap := make(map[string]interface{}) | ||||
| 		if err = json.Unmarshal(data, &errMap); err != nil { | ||||
| 			// when the JSON can't be parsed, data was probably empty or a plain string, | ||||
| 			// so we try to return a helpful error anyway | ||||
| 			return nil, fmt.Errorf("Unknown API Error: %d %s", resp.StatusCode, string(data)) | ||||
| 		} | ||||
| 		return nil, errors.New(errMap["message"].(string)) | ||||
| 	} | ||||
|  | ||||
| 	return data, nil | ||||
| } | ||||
|  | ||||
| func (c *Client) getParsedResponse(method, path string, header http.Header, body io.Reader, obj interface{}) error { | ||||
| 	data, err := c.getResponse(method, path, header, body) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(data, obj) | ||||
| } | ||||
|  | ||||
| func (c *Client) getStatusCode(method, path string, header http.Header, body io.Reader) (int, error) { | ||||
| 	resp, err := c.doRequest(method, path, header, body) | ||||
| 	if err != nil { | ||||
| 		return -1, err | ||||
| 	} | ||||
| 	defer resp.Body.Close() | ||||
|  | ||||
| 	return resp.StatusCode, nil | ||||
| } | ||||
							
								
								
									
										543
									
								
								vendor/code.gitea.io/sdk/gitea/hook.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										543
									
								
								vendor/code.gitea.io/sdk/gitea/hook.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,543 @@ | ||||
| // Copyright 2014 The Gogs Authors. All rights reserved. | ||||
| // Copyright 2017 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	// ErrInvalidReceiveHook FIXME | ||||
| 	ErrInvalidReceiveHook = errors.New("Invalid JSON payload received over webhook") | ||||
| ) | ||||
|  | ||||
| // Hook a hook is a web hook when one repository changed | ||||
| type Hook struct { | ||||
| 	ID     int64             `json:"id"` | ||||
| 	Type   string            `json:"type"` | ||||
| 	URL    string            `json:"-"` | ||||
| 	Config map[string]string `json:"config"` | ||||
| 	Events []string          `json:"events"` | ||||
| 	Active bool              `json:"active"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Updated time.Time `json:"updated_at"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Created time.Time `json:"created_at"` | ||||
| } | ||||
|  | ||||
| // HookList represents a list of API hook. | ||||
| type HookList []*Hook | ||||
|  | ||||
| // ListOrgHooks list all the hooks of one organization | ||||
| func (c *Client) ListOrgHooks(org string) (HookList, error) { | ||||
| 	hooks := make([]*Hook, 0, 10) | ||||
| 	return hooks, c.getParsedResponse("GET", fmt.Sprintf("/orgs/%s/hooks", org), nil, nil, &hooks) | ||||
| } | ||||
|  | ||||
| // ListRepoHooks list all the hooks of one repository | ||||
| func (c *Client) ListRepoHooks(user, repo string) (HookList, error) { | ||||
| 	hooks := make([]*Hook, 0, 10) | ||||
| 	return hooks, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/hooks", user, repo), nil, nil, &hooks) | ||||
| } | ||||
|  | ||||
| // GetOrgHook get a hook of an organization | ||||
| func (c *Client) GetOrgHook(org string, id int64) (*Hook, error) { | ||||
| 	h := new(Hook) | ||||
| 	return h, c.getParsedResponse("GET", fmt.Sprintf("/orgs/%s/hooks/%d", org, id), nil, nil, h) | ||||
| } | ||||
|  | ||||
| // GetRepoHook get a hook of a repository | ||||
| func (c *Client) GetRepoHook(user, repo string, id int64) (*Hook, error) { | ||||
| 	h := new(Hook) | ||||
| 	return h, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/hooks/%d", user, repo, id), nil, nil, h) | ||||
| } | ||||
|  | ||||
| // CreateHookOption options when create a hook | ||||
| type CreateHookOption struct { | ||||
| 	// required: true | ||||
| 	// enum: gitea,gogs,slack,discord | ||||
| 	Type string `json:"type" binding:"Required"` | ||||
| 	// required: true | ||||
| 	Config map[string]string `json:"config" binding:"Required"` | ||||
| 	Events []string          `json:"events"` | ||||
| 	// default: false | ||||
| 	Active bool `json:"active"` | ||||
| } | ||||
|  | ||||
| // CreateOrgHook create one hook for an organization, with options | ||||
| func (c *Client) CreateOrgHook(org string, opt CreateHookOption) (*Hook, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	h := new(Hook) | ||||
| 	return h, c.getParsedResponse("POST", fmt.Sprintf("/orgs/%s/hooks", org), jsonHeader, bytes.NewReader(body), h) | ||||
| } | ||||
|  | ||||
| // CreateRepoHook create one hook for a repository, with options | ||||
| func (c *Client) CreateRepoHook(user, repo string, opt CreateHookOption) (*Hook, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	h := new(Hook) | ||||
| 	return h, c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/hooks", user, repo), jsonHeader, bytes.NewReader(body), h) | ||||
| } | ||||
|  | ||||
| // EditHookOption options when modify one hook | ||||
| type EditHookOption struct { | ||||
| 	Config map[string]string `json:"config"` | ||||
| 	Events []string          `json:"events"` | ||||
| 	Active *bool             `json:"active"` | ||||
| } | ||||
|  | ||||
| // EditOrgHook modify one hook of an organization, with hook id and options | ||||
| func (c *Client) EditOrgHook(org string, id int64, opt EditHookOption) error { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = c.getResponse("PATCH", fmt.Sprintf("/orgs/%s/hooks/%d", org, id), jsonHeader, bytes.NewReader(body)) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // EditRepoHook modify one hook of a repository, with hook id and options | ||||
| func (c *Client) EditRepoHook(user, repo string, id int64, opt EditHookOption) error { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = c.getResponse("PATCH", fmt.Sprintf("/repos/%s/%s/hooks/%d", user, repo, id), jsonHeader, bytes.NewReader(body)) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // DeleteOrgHook delete one hook from an organization, with hook id | ||||
| func (c *Client) DeleteOrgHook(org string, id int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/org/%s/hooks/%d", org, id), nil, nil) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // DeleteRepoHook delete one hook from a repository, with hook id | ||||
| func (c *Client) DeleteRepoHook(user, repo string, id int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/hooks/%d", user, repo, id), nil, nil) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // Payloader payload is some part of one hook | ||||
| type Payloader interface { | ||||
| 	SetSecret(string) | ||||
| 	JSONPayload() ([]byte, error) | ||||
| } | ||||
|  | ||||
| // PayloadUser represents the author or committer of a commit | ||||
| type PayloadUser struct { | ||||
| 	// Full name of the commit author | ||||
| 	Name string `json:"name"` | ||||
| 	// swagger:strfmt email | ||||
| 	Email    string `json:"email"` | ||||
| 	UserName string `json:"username"` | ||||
| } | ||||
|  | ||||
| // FIXME: consider using same format as API when commits API are added. | ||||
| //        applies to PayloadCommit and PayloadCommitVerification | ||||
|  | ||||
| // PayloadCommit represents a commit | ||||
| type PayloadCommit struct { | ||||
| 	// sha1 hash of the commit | ||||
| 	ID           string                     `json:"id"` | ||||
| 	Message      string                     `json:"message"` | ||||
| 	URL          string                     `json:"url"` | ||||
| 	Author       *PayloadUser               `json:"author"` | ||||
| 	Committer    *PayloadUser               `json:"committer"` | ||||
| 	Verification *PayloadCommitVerification `json:"verification"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Timestamp time.Time `json:"timestamp"` | ||||
| 	Added     []string  `json:"added"` | ||||
| 	Removed   []string  `json:"removed"` | ||||
| 	Modified  []string  `json:"modified"` | ||||
| } | ||||
|  | ||||
| // PayloadCommitVerification represents the GPG verification of a commit | ||||
| type PayloadCommitVerification struct { | ||||
| 	Verified  bool   `json:"verified"` | ||||
| 	Reason    string `json:"reason"` | ||||
| 	Signature string `json:"signature"` | ||||
| 	Payload   string `json:"payload"` | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	_ Payloader = &CreatePayload{} | ||||
| 	_ Payloader = &DeletePayload{} | ||||
| 	_ Payloader = &ForkPayload{} | ||||
| 	_ Payloader = &PushPayload{} | ||||
| 	_ Payloader = &IssuePayload{} | ||||
| 	_ Payloader = &IssueCommentPayload{} | ||||
| 	_ Payloader = &PullRequestPayload{} | ||||
| 	_ Payloader = &RepositoryPayload{} | ||||
| 	_ Payloader = &ReleasePayload{} | ||||
| ) | ||||
|  | ||||
| // _________                        __ | ||||
| // \_   ___ \_______   ____ _____ _/  |_  ____ | ||||
| // /    \  \/\_  __ \_/ __ \\__  \\   __\/ __ \ | ||||
| // \     \____|  | \/\  ___/ / __ \|  | \  ___/ | ||||
| //  \______  /|__|    \___  >____  /__|  \___  > | ||||
| //         \/             \/     \/          \/ | ||||
|  | ||||
| // CreatePayload FIXME | ||||
| type CreatePayload struct { | ||||
| 	Secret  string      `json:"secret"` | ||||
| 	Sha     string      `json:"sha"` | ||||
| 	Ref     string      `json:"ref"` | ||||
| 	RefType string      `json:"ref_type"` | ||||
| 	Repo    *Repository `json:"repository"` | ||||
| 	Sender  *User       `json:"sender"` | ||||
| } | ||||
|  | ||||
| // SetSecret modifies the secret of the CreatePayload | ||||
| func (p *CreatePayload) SetSecret(secret string) { | ||||
| 	p.Secret = secret | ||||
| } | ||||
|  | ||||
| // JSONPayload return payload information | ||||
| func (p *CreatePayload) JSONPayload() ([]byte, error) { | ||||
| 	return json.MarshalIndent(p, "", "  ") | ||||
| } | ||||
|  | ||||
| // ParseCreateHook parses create event hook content. | ||||
| func ParseCreateHook(raw []byte) (*CreatePayload, error) { | ||||
| 	hook := new(CreatePayload) | ||||
| 	if err := json.Unmarshal(raw, hook); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// it is possible the JSON was parsed, however, | ||||
| 	// was not from Gogs (maybe was from Bitbucket) | ||||
| 	// So we'll check to be sure certain key fields | ||||
| 	// were populated | ||||
| 	switch { | ||||
| 	case hook.Repo == nil: | ||||
| 		return nil, ErrInvalidReceiveHook | ||||
| 	case len(hook.Ref) == 0: | ||||
| 		return nil, ErrInvalidReceiveHook | ||||
| 	} | ||||
| 	return hook, nil | ||||
| } | ||||
|  | ||||
| // ________         .__          __ | ||||
| // \______ \   ____ |  |   _____/  |_  ____ | ||||
| //  |    |  \_/ __ \|  | _/ __ \   __\/ __ \ | ||||
| //  |    `   \  ___/|  |_\  ___/|  | \  ___/ | ||||
| // /_______  /\___  >____/\___  >__|  \___  > | ||||
| //         \/     \/          \/          \/ | ||||
|  | ||||
| // PusherType define the type to push | ||||
| type PusherType string | ||||
|  | ||||
| // describe all the PusherTypes | ||||
| const ( | ||||
| 	PusherTypeUser PusherType = "user" | ||||
| ) | ||||
|  | ||||
| // DeletePayload represents delete payload | ||||
| type DeletePayload struct { | ||||
| 	Secret     string      `json:"secret"` | ||||
| 	Ref        string      `json:"ref"` | ||||
| 	RefType    string      `json:"ref_type"` | ||||
| 	PusherType PusherType  `json:"pusher_type"` | ||||
| 	Repo       *Repository `json:"repository"` | ||||
| 	Sender     *User       `json:"sender"` | ||||
| } | ||||
|  | ||||
| // SetSecret modifies the secret of the DeletePayload | ||||
| func (p *DeletePayload) SetSecret(secret string) { | ||||
| 	p.Secret = secret | ||||
| } | ||||
|  | ||||
| // JSONPayload implements Payload | ||||
| func (p *DeletePayload) JSONPayload() ([]byte, error) { | ||||
| 	return json.MarshalIndent(p, "", "  ") | ||||
| } | ||||
|  | ||||
| // ___________           __ | ||||
| // \_   _____/__________|  | __ | ||||
| //  |    __)/  _ \_  __ \  |/ / | ||||
| //  |     \(  <_> )  | \/    < | ||||
| //  \___  / \____/|__|  |__|_ \ | ||||
| //      \/                   \/ | ||||
|  | ||||
| // ForkPayload represents fork payload | ||||
| type ForkPayload struct { | ||||
| 	Secret string      `json:"secret"` | ||||
| 	Forkee *Repository `json:"forkee"` | ||||
| 	Repo   *Repository `json:"repository"` | ||||
| 	Sender *User       `json:"sender"` | ||||
| } | ||||
|  | ||||
| // SetSecret modifies the secret of the ForkPayload | ||||
| func (p *ForkPayload) SetSecret(secret string) { | ||||
| 	p.Secret = secret | ||||
| } | ||||
|  | ||||
| // JSONPayload implements Payload | ||||
| func (p *ForkPayload) JSONPayload() ([]byte, error) { | ||||
| 	return json.MarshalIndent(p, "", "  ") | ||||
| } | ||||
|  | ||||
| // HookIssueCommentAction defines hook issue comment action | ||||
| type HookIssueCommentAction string | ||||
|  | ||||
| // all issue comment actions | ||||
| const ( | ||||
| 	HookIssueCommentCreated HookIssueCommentAction = "created" | ||||
| 	HookIssueCommentEdited  HookIssueCommentAction = "edited" | ||||
| 	HookIssueCommentDeleted HookIssueCommentAction = "deleted" | ||||
| ) | ||||
|  | ||||
| // IssueCommentPayload represents a payload information of issue comment event. | ||||
| type IssueCommentPayload struct { | ||||
| 	Secret     string                 `json:"secret"` | ||||
| 	Action     HookIssueCommentAction `json:"action"` | ||||
| 	Issue      *Issue                 `json:"issue"` | ||||
| 	Comment    *Comment               `json:"comment"` | ||||
| 	Changes    *ChangesPayload        `json:"changes,omitempty"` | ||||
| 	Repository *Repository            `json:"repository"` | ||||
| 	Sender     *User                  `json:"sender"` | ||||
| } | ||||
|  | ||||
| // SetSecret modifies the secret of the IssueCommentPayload | ||||
| func (p *IssueCommentPayload) SetSecret(secret string) { | ||||
| 	p.Secret = secret | ||||
| } | ||||
|  | ||||
| // JSONPayload implements Payload | ||||
| func (p *IssueCommentPayload) JSONPayload() ([]byte, error) { | ||||
| 	return json.MarshalIndent(p, "", "  ") | ||||
| } | ||||
|  | ||||
| // __________       .__ | ||||
| // \______   \ ____ |  |   ____ _____    ______ ____ | ||||
| //  |       _// __ \|  | _/ __ \\__  \  /  ___// __ \ | ||||
| //  |    |   \  ___/|  |_\  ___/ / __ \_\___ \\  ___/ | ||||
| //  |____|_  /\___  >____/\___  >____  /____  >\___  > | ||||
| //         \/     \/          \/     \/     \/     \/ | ||||
|  | ||||
| // HookReleaseAction defines hook release action type | ||||
| type HookReleaseAction string | ||||
|  | ||||
| // all release actions | ||||
| const ( | ||||
| 	HookReleasePublished HookReleaseAction = "published" | ||||
| 	HookReleaseUpdated   HookReleaseAction = "updated" | ||||
| 	HookReleaseDeleted   HookReleaseAction = "deleted" | ||||
| ) | ||||
|  | ||||
| // ReleasePayload represents a payload information of release event. | ||||
| type ReleasePayload struct { | ||||
| 	Secret     string            `json:"secret"` | ||||
| 	Action     HookReleaseAction `json:"action"` | ||||
| 	Release    *Release          `json:"release"` | ||||
| 	Repository *Repository       `json:"repository"` | ||||
| 	Sender     *User             `json:"sender"` | ||||
| } | ||||
|  | ||||
| // SetSecret modifies the secret of the ReleasePayload | ||||
| func (p *ReleasePayload) SetSecret(secret string) { | ||||
| 	p.Secret = secret | ||||
| } | ||||
|  | ||||
| // JSONPayload implements Payload | ||||
| func (p *ReleasePayload) JSONPayload() ([]byte, error) { | ||||
| 	return json.MarshalIndent(p, "", "  ") | ||||
| } | ||||
|  | ||||
| // __________             .__ | ||||
| // \______   \__ __  _____|  |__ | ||||
| //  |     ___/  |  \/  ___/  |  \ | ||||
| //  |    |   |  |  /\___ \|   Y  \ | ||||
| //  |____|   |____//____  >___|  / | ||||
| //                      \/     \/ | ||||
|  | ||||
| // PushPayload represents a payload information of push event. | ||||
| type PushPayload struct { | ||||
| 	Secret     string           `json:"secret"` | ||||
| 	Ref        string           `json:"ref"` | ||||
| 	Before     string           `json:"before"` | ||||
| 	After      string           `json:"after"` | ||||
| 	CompareURL string           `json:"compare_url"` | ||||
| 	Commits    []*PayloadCommit `json:"commits"` | ||||
| 	HeadCommit *PayloadCommit   `json:"head_commit"` | ||||
| 	Repo       *Repository      `json:"repository"` | ||||
| 	Pusher     *User            `json:"pusher"` | ||||
| 	Sender     *User            `json:"sender"` | ||||
| } | ||||
|  | ||||
| // SetSecret modifies the secret of the PushPayload | ||||
| func (p *PushPayload) SetSecret(secret string) { | ||||
| 	p.Secret = secret | ||||
| } | ||||
|  | ||||
| // JSONPayload FIXME | ||||
| func (p *PushPayload) JSONPayload() ([]byte, error) { | ||||
| 	return json.MarshalIndent(p, "", "  ") | ||||
| } | ||||
|  | ||||
| // ParsePushHook parses push event hook content. | ||||
| func ParsePushHook(raw []byte) (*PushPayload, error) { | ||||
| 	hook := new(PushPayload) | ||||
| 	if err := json.Unmarshal(raw, hook); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	switch { | ||||
| 	case hook.Repo == nil: | ||||
| 		return nil, ErrInvalidReceiveHook | ||||
| 	case len(hook.Ref) == 0: | ||||
| 		return nil, ErrInvalidReceiveHook | ||||
| 	} | ||||
| 	return hook, nil | ||||
| } | ||||
|  | ||||
| // Branch returns branch name from a payload | ||||
| func (p *PushPayload) Branch() string { | ||||
| 	return strings.Replace(p.Ref, "refs/heads/", "", -1) | ||||
| } | ||||
|  | ||||
| // .___ | ||||
| // |   | ______ ________ __   ____ | ||||
| // |   |/  ___//  ___/  |  \_/ __ \ | ||||
| // |   |\___ \ \___ \|  |  /\  ___/ | ||||
| // |___/____  >____  >____/  \___  > | ||||
| //          \/     \/            \/ | ||||
|  | ||||
| // HookIssueAction FIXME | ||||
| type HookIssueAction string | ||||
|  | ||||
| const ( | ||||
| 	// HookIssueOpened opened | ||||
| 	HookIssueOpened HookIssueAction = "opened" | ||||
| 	// HookIssueClosed closed | ||||
| 	HookIssueClosed HookIssueAction = "closed" | ||||
| 	// HookIssueReOpened reopened | ||||
| 	HookIssueReOpened HookIssueAction = "reopened" | ||||
| 	// HookIssueEdited edited | ||||
| 	HookIssueEdited HookIssueAction = "edited" | ||||
| 	// HookIssueAssigned assigned | ||||
| 	HookIssueAssigned HookIssueAction = "assigned" | ||||
| 	// HookIssueUnassigned unassigned | ||||
| 	HookIssueUnassigned HookIssueAction = "unassigned" | ||||
| 	// HookIssueLabelUpdated label_updated | ||||
| 	HookIssueLabelUpdated HookIssueAction = "label_updated" | ||||
| 	// HookIssueLabelCleared label_cleared | ||||
| 	HookIssueLabelCleared HookIssueAction = "label_cleared" | ||||
| 	// HookIssueSynchronized synchronized | ||||
| 	HookIssueSynchronized HookIssueAction = "synchronized" | ||||
| 	// HookIssueMilestoned is an issue action for when a milestone is set on an issue. | ||||
| 	HookIssueMilestoned HookIssueAction = "milestoned" | ||||
| 	// HookIssueDemilestoned is an issue action for when a milestone is cleared on an issue. | ||||
| 	HookIssueDemilestoned HookIssueAction = "demilestoned" | ||||
| ) | ||||
|  | ||||
| // IssuePayload represents the payload information that is sent along with an issue event. | ||||
| type IssuePayload struct { | ||||
| 	Secret     string          `json:"secret"` | ||||
| 	Action     HookIssueAction `json:"action"` | ||||
| 	Index      int64           `json:"number"` | ||||
| 	Changes    *ChangesPayload `json:"changes,omitempty"` | ||||
| 	Issue      *Issue          `json:"issue"` | ||||
| 	Repository *Repository     `json:"repository"` | ||||
| 	Sender     *User           `json:"sender"` | ||||
| } | ||||
|  | ||||
| // SetSecret modifies the secret of the IssuePayload. | ||||
| func (p *IssuePayload) SetSecret(secret string) { | ||||
| 	p.Secret = secret | ||||
| } | ||||
|  | ||||
| // JSONPayload encodes the IssuePayload to JSON, with an indentation of two spaces. | ||||
| func (p *IssuePayload) JSONPayload() ([]byte, error) { | ||||
| 	return json.MarshalIndent(p, "", "  ") | ||||
| } | ||||
|  | ||||
| // ChangesFromPayload FIXME | ||||
| type ChangesFromPayload struct { | ||||
| 	From string `json:"from"` | ||||
| } | ||||
|  | ||||
| // ChangesPayload FIXME | ||||
| type ChangesPayload struct { | ||||
| 	Title *ChangesFromPayload `json:"title,omitempty"` | ||||
| 	Body  *ChangesFromPayload `json:"body,omitempty"` | ||||
| } | ||||
|  | ||||
| // __________      .__  .__    __________                                     __ | ||||
| // \______   \__ __|  | |  |   \______   \ ____  ________ __   ____   _______/  |_ | ||||
| //  |     ___/  |  \  | |  |    |       _// __ \/ ____/  |  \_/ __ \ /  ___/\   __\ | ||||
| //  |    |   |  |  /  |_|  |__  |    |   \  ___< <_|  |  |  /\  ___/ \___ \  |  | | ||||
| //  |____|   |____/|____/____/  |____|_  /\___  >__   |____/  \___  >____  > |__| | ||||
| //                                     \/     \/   |__|           \/     \/ | ||||
|  | ||||
| // PullRequestPayload represents a payload information of pull request event. | ||||
| type PullRequestPayload struct { | ||||
| 	Secret      string          `json:"secret"` | ||||
| 	Action      HookIssueAction `json:"action"` | ||||
| 	Index       int64           `json:"number"` | ||||
| 	Changes     *ChangesPayload `json:"changes,omitempty"` | ||||
| 	PullRequest *PullRequest    `json:"pull_request"` | ||||
| 	Repository  *Repository     `json:"repository"` | ||||
| 	Sender      *User           `json:"sender"` | ||||
| } | ||||
|  | ||||
| // SetSecret modifies the secret of the PullRequestPayload. | ||||
| func (p *PullRequestPayload) SetSecret(secret string) { | ||||
| 	p.Secret = secret | ||||
| } | ||||
|  | ||||
| // JSONPayload FIXME | ||||
| func (p *PullRequestPayload) JSONPayload() ([]byte, error) { | ||||
| 	return json.MarshalIndent(p, "", "  ") | ||||
| } | ||||
|  | ||||
| //__________                           .__  __ | ||||
| //\______   \ ____ ______   ____  _____|__|/  |_  ___________ ___.__. | ||||
| // |       _// __ \\____ \ /  _ \/  ___/  \   __\/  _ \_  __ <   |  | | ||||
| // |    |   \  ___/|  |_> >  <_> )___ \|  ||  | (  <_> )  | \/\___  | | ||||
| // |____|_  /\___  >   __/ \____/____  >__||__|  \____/|__|   / ____| | ||||
| //        \/     \/|__|              \/                       \/ | ||||
|  | ||||
| // HookRepoAction an action that happens to a repo | ||||
| type HookRepoAction string | ||||
|  | ||||
| const ( | ||||
| 	// HookRepoCreated created | ||||
| 	HookRepoCreated HookRepoAction = "created" | ||||
| 	// HookRepoDeleted deleted | ||||
| 	HookRepoDeleted HookRepoAction = "deleted" | ||||
| ) | ||||
|  | ||||
| // RepositoryPayload payload for repository webhooks | ||||
| type RepositoryPayload struct { | ||||
| 	Secret       string         `json:"secret"` | ||||
| 	Action       HookRepoAction `json:"action"` | ||||
| 	Repository   *Repository    `json:"repository"` | ||||
| 	Organization *User          `json:"organization"` | ||||
| 	Sender       *User          `json:"sender"` | ||||
| } | ||||
|  | ||||
| // SetSecret modifies the secret of the RepositoryPayload | ||||
| func (p *RepositoryPayload) SetSecret(secret string) { | ||||
| 	p.Secret = secret | ||||
| } | ||||
|  | ||||
| // JSONPayload JSON representation of the payload | ||||
| func (p *RepositoryPayload) JSONPayload() ([]byte, error) { | ||||
| 	return json.MarshalIndent(p, "", " ") | ||||
| } | ||||
							
								
								
									
										176
									
								
								vendor/code.gitea.io/sdk/gitea/issue.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								vendor/code.gitea.io/sdk/gitea/issue.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| // Copyright 2016 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // StateType issue state type | ||||
| type StateType string | ||||
|  | ||||
| const ( | ||||
| 	// StateOpen pr is opend | ||||
| 	StateOpen StateType = "open" | ||||
| 	// StateClosed pr is closed | ||||
| 	StateClosed StateType = "closed" | ||||
| ) | ||||
|  | ||||
| // PullRequestMeta PR info if an issue is a PR | ||||
| type PullRequestMeta struct { | ||||
| 	HasMerged bool       `json:"merged"` | ||||
| 	Merged    *time.Time `json:"merged_at"` | ||||
| } | ||||
|  | ||||
| // Issue represents an issue in a repository | ||||
| // swagger:model | ||||
| type Issue struct { | ||||
| 	ID        int64      `json:"id"` | ||||
| 	URL       string     `json:"url"` | ||||
| 	Index     int64      `json:"number"` | ||||
| 	Poster    *User      `json:"user"` | ||||
| 	Title     string     `json:"title"` | ||||
| 	Body      string     `json:"body"` | ||||
| 	Labels    []*Label   `json:"labels"` | ||||
| 	Milestone *Milestone `json:"milestone"` | ||||
| 	Assignee  *User      `json:"assignee"` | ||||
| 	Assignees []*User    `json:"assignees"` | ||||
| 	// Whether the issue is open or closed | ||||
| 	// | ||||
| 	// type: string | ||||
| 	// enum: open,closed | ||||
| 	State    StateType `json:"state"` | ||||
| 	Comments int       `json:"comments"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Created time.Time `json:"created_at"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Updated time.Time `json:"updated_at"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Closed *time.Time `json:"closed_at"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Deadline *time.Time `json:"due_date"` | ||||
|  | ||||
| 	PullRequest *PullRequestMeta `json:"pull_request"` | ||||
| } | ||||
|  | ||||
| // ListIssueOption list issue options | ||||
| type ListIssueOption struct { | ||||
| 	Page  int | ||||
| 	State string | ||||
| } | ||||
|  | ||||
| // ListIssues returns all issues assigned the authenticated user | ||||
| func (c *Client) ListIssues(opt ListIssueOption) ([]*Issue, error) { | ||||
| 	issues := make([]*Issue, 0, 10) | ||||
| 	return issues, c.getParsedResponse("GET", fmt.Sprintf("/issues?page=%d", opt.Page), nil, nil, &issues) | ||||
| } | ||||
|  | ||||
| // ListUserIssues returns all issues assigned to the authenticated user | ||||
| func (c *Client) ListUserIssues(opt ListIssueOption) ([]*Issue, error) { | ||||
| 	issues := make([]*Issue, 0, 10) | ||||
| 	return issues, c.getParsedResponse("GET", fmt.Sprintf("/user/issues?page=%d", opt.Page), nil, nil, &issues) | ||||
| } | ||||
|  | ||||
| // ListRepoIssues returns all issues for a given repository | ||||
| func (c *Client) ListRepoIssues(owner, repo string, opt ListIssueOption) ([]*Issue, error) { | ||||
| 	issues := make([]*Issue, 0, 10) | ||||
| 	return issues, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues?page=%d", owner, repo, opt.Page), nil, nil, &issues) | ||||
| } | ||||
|  | ||||
| // GetIssue returns a single issue for a given repository | ||||
| func (c *Client) GetIssue(owner, repo string, index int64) (*Issue, error) { | ||||
| 	issue := new(Issue) | ||||
| 	return issue, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/%d", owner, repo, index), nil, nil, issue) | ||||
| } | ||||
|  | ||||
| // CreateIssueOption options to create one issue | ||||
| type CreateIssueOption struct { | ||||
| 	// required:true | ||||
| 	Title string `json:"title" binding:"Required"` | ||||
| 	Body  string `json:"body"` | ||||
| 	// username of assignee | ||||
| 	Assignee  string   `json:"assignee"` | ||||
| 	Assignees []string `json:"assignees"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Deadline *time.Time `json:"due_date"` | ||||
| 	// milestone id | ||||
| 	Milestone int64 `json:"milestone"` | ||||
| 	// list of label ids | ||||
| 	Labels []int64 `json:"labels"` | ||||
| 	Closed bool    `json:"closed"` | ||||
| } | ||||
|  | ||||
| // CreateIssue create a new issue for a given repository | ||||
| func (c *Client) CreateIssue(owner, repo string, opt CreateIssueOption) (*Issue, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	issue := new(Issue) | ||||
| 	return issue, c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/issues", owner, repo), | ||||
| 		jsonHeader, bytes.NewReader(body), issue) | ||||
| } | ||||
|  | ||||
| // EditIssueOption options for editing an issue | ||||
| type EditIssueOption struct { | ||||
| 	Title     string   `json:"title"` | ||||
| 	Body      *string  `json:"body"` | ||||
| 	Assignee  *string  `json:"assignee"` | ||||
| 	Assignees []string `json:"assignees"` | ||||
| 	Milestone *int64   `json:"milestone"` | ||||
| 	State     *string  `json:"state"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Deadline *time.Time `json:"due_date"` | ||||
| } | ||||
|  | ||||
| // EditIssue modify an existing issue for a given repository | ||||
| func (c *Client) EditIssue(owner, repo string, index int64, opt EditIssueOption) (*Issue, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	issue := new(Issue) | ||||
| 	return issue, c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/issues/%d", owner, repo, index), | ||||
| 		jsonHeader, bytes.NewReader(body), issue) | ||||
| } | ||||
|  | ||||
| // StartIssueStopWatch starts a stopwatch for an existing issue for a given | ||||
| // repository | ||||
| func (c *Client) StartIssueStopWatch(owner, repo string, index int64) error { | ||||
| 	_, err := c.getResponse("POST", fmt.Sprintf("/repos/%s/%s/issues/%d/stopwatch/start", owner, repo, index), | ||||
| 		jsonHeader, nil) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // StopIssueStopWatch stops an existing stopwatch for an issue in a given | ||||
| // repository | ||||
| func (c *Client) StopIssueStopWatch(owner, repo string, index int64) error { | ||||
| 	_, err := c.getResponse("POST", fmt.Sprintf("/repos/%s/%s/issues/%d/stopwatch/stop", owner, repo, index), | ||||
| 		jsonHeader, nil) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // EditDeadlineOption options for creating a deadline | ||||
| type EditDeadlineOption struct { | ||||
| 	// required:true | ||||
| 	// swagger:strfmt date-time | ||||
| 	Deadline *time.Time `json:"due_date"` | ||||
| } | ||||
|  | ||||
| // IssueDeadline represents an issue deadline | ||||
| // swagger:model | ||||
| type IssueDeadline struct { | ||||
| 	// swagger:strfmt date-time | ||||
| 	Deadline *time.Time `json:"due_date"` | ||||
| } | ||||
|  | ||||
| // EditPriorityOption options for updating priority | ||||
| type EditPriorityOption struct { | ||||
| 	// required:true | ||||
| 	Priority int `json:"priority"` | ||||
| } | ||||
							
								
								
									
										76
									
								
								vendor/code.gitea.io/sdk/gitea/issue_comment.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								vendor/code.gitea.io/sdk/gitea/issue_comment.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| // Copyright 2016 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // Comment represents a comment on a commit or issue | ||||
| type Comment struct { | ||||
| 	ID       int64  `json:"id"` | ||||
| 	HTMLURL  string `json:"html_url"` | ||||
| 	PRURL    string `json:"pull_request_url"` | ||||
| 	IssueURL string `json:"issue_url"` | ||||
| 	Poster   *User  `json:"user"` | ||||
| 	Body     string `json:"body"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Created time.Time `json:"created_at"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Updated time.Time `json:"updated_at"` | ||||
| } | ||||
|  | ||||
| // ListIssueComments list comments on an issue. | ||||
| func (c *Client) ListIssueComments(owner, repo string, index int64) ([]*Comment, error) { | ||||
| 	comments := make([]*Comment, 0, 10) | ||||
| 	return comments, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/%d/comments", owner, repo, index), nil, nil, &comments) | ||||
| } | ||||
|  | ||||
| // ListRepoIssueComments list comments for a given repo. | ||||
| func (c *Client) ListRepoIssueComments(owner, repo string) ([]*Comment, error) { | ||||
| 	comments := make([]*Comment, 0, 10) | ||||
| 	return comments, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/comments", owner, repo), nil, nil, &comments) | ||||
| } | ||||
|  | ||||
| // CreateIssueCommentOption options for creating a comment on an issue | ||||
| type CreateIssueCommentOption struct { | ||||
| 	// required:true | ||||
| 	Body string `json:"body" binding:"Required"` | ||||
| } | ||||
|  | ||||
| // CreateIssueComment create comment on an issue. | ||||
| func (c *Client) CreateIssueComment(owner, repo string, index int64, opt CreateIssueCommentOption) (*Comment, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	comment := new(Comment) | ||||
| 	return comment, c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/issues/%d/comments", owner, repo, index), jsonHeader, bytes.NewReader(body), comment) | ||||
| } | ||||
|  | ||||
| // EditIssueCommentOption options for editing a comment | ||||
| type EditIssueCommentOption struct { | ||||
| 	// required: true | ||||
| 	Body string `json:"body" binding:"Required"` | ||||
| } | ||||
|  | ||||
| // EditIssueComment edits an issue comment. | ||||
| func (c *Client) EditIssueComment(owner, repo string, index, commentID int64, opt EditIssueCommentOption) (*Comment, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	comment := new(Comment) | ||||
| 	return comment, c.getParsedResponse("PATCH", fmt.Sprintf("/repos/:%s/:%s/issues/%d/comments/%d", owner, repo, index, commentID), jsonHeader, bytes.NewReader(body), comment) | ||||
| } | ||||
|  | ||||
| // DeleteIssueComment deletes an issue comment. | ||||
| func (c *Client) DeleteIssueComment(owner, repo string, index, commentID int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/comments/%d", owner, repo, index, commentID), nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										122
									
								
								vendor/code.gitea.io/sdk/gitea/issue_label.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								vendor/code.gitea.io/sdk/gitea/issue_label.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | ||||
| // Copyright 2016 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // Label a label to an issue or a pr | ||||
| // swagger:model | ||||
| type Label struct { | ||||
| 	ID   int64  `json:"id"` | ||||
| 	Name string `json:"name"` | ||||
| 	// example: 00aabb | ||||
| 	Color string `json:"color"` | ||||
| 	URL   string `json:"url"` | ||||
| } | ||||
|  | ||||
| // ListRepoLabels list labels of one repository | ||||
| func (c *Client) ListRepoLabels(owner, repo string) ([]*Label, error) { | ||||
| 	labels := make([]*Label, 0, 10) | ||||
| 	return labels, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/labels", owner, repo), nil, nil, &labels) | ||||
| } | ||||
|  | ||||
| // GetRepoLabel get one label of repository by repo it | ||||
| // TODO: maybe we need get a label by name | ||||
| func (c *Client) GetRepoLabel(owner, repo string, id int64) (*Label, error) { | ||||
| 	label := new(Label) | ||||
| 	return label, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/labels/%d", owner, repo, id), nil, nil, label) | ||||
| } | ||||
|  | ||||
| // CreateLabelOption options for creating a label | ||||
| type CreateLabelOption struct { | ||||
| 	// required:true | ||||
| 	Name string `json:"name" binding:"Required"` | ||||
| 	// required:true | ||||
| 	// example: #00aabb | ||||
| 	Color string `json:"color" binding:"Required;Size(7)"` | ||||
| } | ||||
|  | ||||
| // CreateLabel create one label of repository | ||||
| func (c *Client) CreateLabel(owner, repo string, opt CreateLabelOption) (*Label, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	label := new(Label) | ||||
| 	return label, c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/labels", owner, repo), | ||||
| 		jsonHeader, bytes.NewReader(body), label) | ||||
| } | ||||
|  | ||||
| // EditLabelOption options for editing a label | ||||
| type EditLabelOption struct { | ||||
| 	Name  *string `json:"name"` | ||||
| 	Color *string `json:"color"` | ||||
| } | ||||
|  | ||||
| // EditLabel modify one label with options | ||||
| func (c *Client) EditLabel(owner, repo string, id int64, opt EditLabelOption) (*Label, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	label := new(Label) | ||||
| 	return label, c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/labels/%d", owner, repo, id), jsonHeader, bytes.NewReader(body), label) | ||||
| } | ||||
|  | ||||
| // DeleteLabel delete one label of repository by id | ||||
| // TODO: maybe we need delete by name | ||||
| func (c *Client) DeleteLabel(owner, repo string, id int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/labels/%d", owner, repo, id), nil, nil) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // IssueLabelsOption a collection of labels | ||||
| type IssueLabelsOption struct { | ||||
| 	// list of label IDs | ||||
| 	Labels []int64 `json:"labels"` | ||||
| } | ||||
|  | ||||
| // GetIssueLabels get labels of one issue via issue id | ||||
| func (c *Client) GetIssueLabels(owner, repo string, index int64) ([]*Label, error) { | ||||
| 	labels := make([]*Label, 0, 5) | ||||
| 	return labels, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/%d/labels", owner, repo, index), nil, nil, &labels) | ||||
| } | ||||
|  | ||||
| // AddIssueLabels add one or more labels to one issue | ||||
| func (c *Client) AddIssueLabels(owner, repo string, index int64, opt IssueLabelsOption) ([]*Label, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	var labels []*Label | ||||
| 	return labels, c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/issues/%d/labels", owner, repo, index), jsonHeader, bytes.NewReader(body), &labels) | ||||
| } | ||||
|  | ||||
| // ReplaceIssueLabels replace old labels of issue with new labels | ||||
| func (c *Client) ReplaceIssueLabels(owner, repo string, index int64, opt IssueLabelsOption) ([]*Label, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	var labels []*Label | ||||
| 	return labels, c.getParsedResponse("PUT", fmt.Sprintf("/repos/%s/%s/issues/%d/labels", owner, repo, index), jsonHeader, bytes.NewReader(body), &labels) | ||||
| } | ||||
|  | ||||
| // DeleteIssueLabel delete one label of one issue by issue id and label id | ||||
| // TODO: maybe we need delete by label name and issue id | ||||
| func (c *Client) DeleteIssueLabel(owner, repo string, index, label int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/labels/%d", owner, repo, index, label), nil, nil) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // ClearIssueLabels delete all the labels of one issue. | ||||
| func (c *Client) ClearIssueLabels(owner, repo string, index int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/labels", owner, repo, index), nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										80
									
								
								vendor/code.gitea.io/sdk/gitea/issue_milestone.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								vendor/code.gitea.io/sdk/gitea/issue_milestone.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| // Copyright 2016 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // Milestone milestone is a collection of issues on one repository | ||||
| type Milestone struct { | ||||
| 	ID           int64     `json:"id"` | ||||
| 	Title        string    `json:"title"` | ||||
| 	Description  string    `json:"description"` | ||||
| 	State        StateType `json:"state"` | ||||
| 	OpenIssues   int       `json:"open_issues"` | ||||
| 	ClosedIssues int       `json:"closed_issues"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Closed *time.Time `json:"closed_at"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Deadline *time.Time `json:"due_on"` | ||||
| } | ||||
|  | ||||
| // ListRepoMilestones list all the milestones of one repository | ||||
| func (c *Client) ListRepoMilestones(owner, repo string) ([]*Milestone, error) { | ||||
| 	milestones := make([]*Milestone, 0, 10) | ||||
| 	return milestones, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/milestones", owner, repo), nil, nil, &milestones) | ||||
| } | ||||
|  | ||||
| // GetMilestone get one milestone by repo name and milestone id | ||||
| func (c *Client) GetMilestone(owner, repo string, id int64) (*Milestone, error) { | ||||
| 	milestone := new(Milestone) | ||||
| 	return milestone, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/milestones/%d", owner, repo, id), nil, nil, milestone) | ||||
| } | ||||
|  | ||||
| // CreateMilestoneOption options for creating a milestone | ||||
| type CreateMilestoneOption struct { | ||||
| 	Title       string `json:"title"` | ||||
| 	Description string `json:"description"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Deadline *time.Time `json:"due_on"` | ||||
| } | ||||
|  | ||||
| // CreateMilestone create one milestone with options | ||||
| func (c *Client) CreateMilestone(owner, repo string, opt CreateMilestoneOption) (*Milestone, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	milestone := new(Milestone) | ||||
| 	return milestone, c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/milestones", owner, repo), jsonHeader, bytes.NewReader(body), milestone) | ||||
| } | ||||
|  | ||||
| // EditMilestoneOption options for editing a milestone | ||||
| type EditMilestoneOption struct { | ||||
| 	Title       string     `json:"title"` | ||||
| 	Description *string    `json:"description"` | ||||
| 	State       *string    `json:"state"` | ||||
| 	Deadline    *time.Time `json:"due_on"` | ||||
| } | ||||
|  | ||||
| // EditMilestone modify milestone with options | ||||
| func (c *Client) EditMilestone(owner, repo string, id int64, opt EditMilestoneOption) (*Milestone, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	milestone := new(Milestone) | ||||
| 	return milestone, c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/milestones/%d", owner, repo, id), jsonHeader, bytes.NewReader(body), milestone) | ||||
| } | ||||
|  | ||||
| // DeleteMilestone delete one milestone by milestone id | ||||
| func (c *Client) DeleteMilestone(owner, repo string, id int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/milestones/%d", owner, repo, id), nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										68
									
								
								vendor/code.gitea.io/sdk/gitea/issue_tracked_time.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								vendor/code.gitea.io/sdk/gitea/issue_tracked_time.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| // Copyright 2017 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // TrackedTime worked time for an issue / pr | ||||
| type TrackedTime struct { | ||||
| 	ID int64 `json:"id"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Created time.Time `json:"created"` | ||||
| 	// Time in seconds | ||||
| 	Time    int64 `json:"time"` | ||||
| 	UserID  int64 `json:"user_id"` | ||||
| 	IssueID int64 `json:"issue_id"` | ||||
| } | ||||
|  | ||||
| // TrackedTimes represent a list of tracked times | ||||
| type TrackedTimes []*TrackedTime | ||||
|  | ||||
| // GetUserTrackedTimes list tracked times of a user | ||||
| func (c *Client) GetUserTrackedTimes(owner, repo, user string) (TrackedTimes, error) { | ||||
| 	times := make(TrackedTimes, 0, 10) | ||||
| 	return times, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/times/%s", owner, repo, user), nil, nil, ×) | ||||
| } | ||||
|  | ||||
| // GetRepoTrackedTimes list tracked times of a repository | ||||
| func (c *Client) GetRepoTrackedTimes(owner, repo string) (TrackedTimes, error) { | ||||
| 	times := make(TrackedTimes, 0, 10) | ||||
| 	return times, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/times", owner, repo), nil, nil, ×) | ||||
| } | ||||
|  | ||||
| // GetMyTrackedTimes list tracked times of the current user | ||||
| func (c *Client) GetMyTrackedTimes() (TrackedTimes, error) { | ||||
| 	times := make(TrackedTimes, 0, 10) | ||||
| 	return times, c.getParsedResponse("GET", "/user/times", nil, nil, ×) | ||||
| } | ||||
|  | ||||
| // AddTimeOption options for adding time to an issue | ||||
| type AddTimeOption struct { | ||||
| 	// time in seconds | ||||
| 	// required: true | ||||
| 	Time int64 `json:"time" binding:"Required"` | ||||
| } | ||||
|  | ||||
| // AddTime adds time to issue with the given index | ||||
| func (c *Client) AddTime(owner, repo string, index int64, opt AddTimeOption) (*TrackedTime, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	t := new(TrackedTime) | ||||
| 	return t, c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/issues/%d/times", owner, repo, index), | ||||
| 		jsonHeader, bytes.NewReader(body), t) | ||||
| } | ||||
|  | ||||
| // ListTrackedTimes get tracked times of one issue via issue id | ||||
| func (c *Client) ListTrackedTimes(owner, repo string, index int64) (TrackedTimes, error) { | ||||
| 	times := make(TrackedTimes, 0, 5) | ||||
| 	return times, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/%d/times", owner, repo, index), nil, nil, ×) | ||||
| } | ||||
							
								
								
									
										65
									
								
								vendor/code.gitea.io/sdk/gitea/lfs_lock.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								vendor/code.gitea.io/sdk/gitea/lfs_lock.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| // Copyright 2017 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // LFSLock represent a lock | ||||
| // for use with the locks API. | ||||
| type LFSLock struct { | ||||
| 	ID       string        `json:"id"` | ||||
| 	Path     string        `json:"path"` | ||||
| 	LockedAt time.Time     `json:"locked_at"` | ||||
| 	Owner    *LFSLockOwner `json:"owner"` | ||||
| } | ||||
|  | ||||
| // LFSLockOwner represent a lock owner | ||||
| // for use with the locks API. | ||||
| type LFSLockOwner struct { | ||||
| 	Name string `json:"name"` | ||||
| } | ||||
|  | ||||
| // LFSLockRequest contains the path of the lock to create | ||||
| // https://github.com/git-lfs/git-lfs/blob/master/docs/api/locking.md#create-lock | ||||
| type LFSLockRequest struct { | ||||
| 	Path string `json:"path"` | ||||
| } | ||||
|  | ||||
| // LFSLockResponse represent a lock created | ||||
| // https://github.com/git-lfs/git-lfs/blob/master/docs/api/locking.md#create-lock | ||||
| type LFSLockResponse struct { | ||||
| 	Lock *LFSLock `json:"lock"` | ||||
| } | ||||
|  | ||||
| // LFSLockList represent a list of lock requested | ||||
| // https://github.com/git-lfs/git-lfs/blob/master/docs/api/locking.md#list-locks | ||||
| type LFSLockList struct { | ||||
| 	Locks []*LFSLock `json:"locks"` | ||||
| 	Next  string     `json:"next_cursor,omitempty"` | ||||
| } | ||||
|  | ||||
| // LFSLockListVerify represent a list of lock verification requested | ||||
| // https://github.com/git-lfs/git-lfs/blob/master/docs/api/locking.md#list-locks-for-verification | ||||
| type LFSLockListVerify struct { | ||||
| 	Ours   []*LFSLock `json:"ours"` | ||||
| 	Theirs []*LFSLock `json:"theirs"` | ||||
| 	Next   string     `json:"next_cursor,omitempty"` | ||||
| } | ||||
|  | ||||
| // LFSLockError contains information on the error that occurs | ||||
| type LFSLockError struct { | ||||
| 	Message       string   `json:"message"` | ||||
| 	Lock          *LFSLock `json:"lock,omitempty"` | ||||
| 	Documentation string   `json:"documentation_url,omitempty"` | ||||
| 	RequestID     string   `json:"request_id,omitempty"` | ||||
| } | ||||
|  | ||||
| // LFSLockDeleteRequest contains params of a delete request | ||||
| // https://github.com/git-lfs/git-lfs/blob/master/docs/api/locking.md#delete-lock | ||||
| type LFSLockDeleteRequest struct { | ||||
| 	Force bool `json:"force"` | ||||
| } | ||||
							
								
								
									
										52
									
								
								vendor/code.gitea.io/sdk/gitea/miscellaneous.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								vendor/code.gitea.io/sdk/gitea/miscellaneous.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| // Copyright 2015 The Gogs 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 gitea | ||||
|  | ||||
| // SearchResults results of a successful search | ||||
| type SearchResults struct { | ||||
| 	OK   bool          `json:"ok"` | ||||
| 	Data []*Repository `json:"data"` | ||||
| } | ||||
|  | ||||
| // SearchError error of a failed search | ||||
| type SearchError struct { | ||||
| 	OK    bool   `json:"ok"` | ||||
| 	Error string `json:"error"` | ||||
| } | ||||
|  | ||||
| // MarkdownOption markdown options | ||||
| type MarkdownOption struct { | ||||
| 	// Text markdown to render | ||||
| 	// | ||||
| 	// in: body | ||||
| 	Text string | ||||
| 	// Mode to render | ||||
| 	// | ||||
| 	// in: body | ||||
| 	Mode string | ||||
| 	// Context to render | ||||
| 	// | ||||
| 	// in: body | ||||
| 	Context string | ||||
| 	// Is it a wiki page ? | ||||
| 	// | ||||
| 	// in: body | ||||
| 	Wiki bool | ||||
| } | ||||
|  | ||||
| // MarkdownRender is a rendered markdown document | ||||
| // swagger:response MarkdownRender | ||||
| type MarkdownRender string | ||||
|  | ||||
| // ServerVersion wraps the version of the server | ||||
| type ServerVersion struct { | ||||
| 	Version string `json:"version"` | ||||
| } | ||||
|  | ||||
| // ServerVersion returns the version of the server | ||||
| func (c *Client) ServerVersion() (string, error) { | ||||
| 	v := ServerVersion{} | ||||
| 	return v.Version, c.getParsedResponse("GET", "/api/v1/version", nil, nil, &v) | ||||
| } | ||||
							
								
								
									
										70
									
								
								vendor/code.gitea.io/sdk/gitea/org.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								vendor/code.gitea.io/sdk/gitea/org.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| // Copyright 2015 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // Organization represents an organization | ||||
| type Organization struct { | ||||
| 	ID          int64       `json:"id"` | ||||
| 	UserName    string      `json:"username"` | ||||
| 	FullName    string      `json:"full_name"` | ||||
| 	AvatarURL   string      `json:"avatar_url"` | ||||
| 	Description string      `json:"description"` | ||||
| 	Website     string      `json:"website"` | ||||
| 	Location    string      `json:"location"` | ||||
| 	Visibility  VisibleType `json:"visibility"` | ||||
| } | ||||
|  | ||||
| // ListMyOrgs list all of current user's organizations | ||||
| func (c *Client) ListMyOrgs() ([]*Organization, error) { | ||||
| 	orgs := make([]*Organization, 0, 5) | ||||
| 	return orgs, c.getParsedResponse("GET", "/user/orgs", nil, nil, &orgs) | ||||
| } | ||||
|  | ||||
| // ListUserOrgs list all of some user's organizations | ||||
| func (c *Client) ListUserOrgs(user string) ([]*Organization, error) { | ||||
| 	orgs := make([]*Organization, 0, 5) | ||||
| 	return orgs, c.getParsedResponse("GET", fmt.Sprintf("/users/%s/orgs", user), nil, nil, &orgs) | ||||
| } | ||||
|  | ||||
| // GetOrg get one organization by name | ||||
| func (c *Client) GetOrg(orgname string) (*Organization, error) { | ||||
| 	org := new(Organization) | ||||
| 	return org, c.getParsedResponse("GET", fmt.Sprintf("/orgs/%s", orgname), nil, nil, org) | ||||
| } | ||||
|  | ||||
| // CreateOrgOption options for creating an organization | ||||
| type CreateOrgOption struct { | ||||
| 	// required: true | ||||
| 	UserName    string      `json:"username" binding:"Required"` | ||||
| 	FullName    string      `json:"full_name"` | ||||
| 	Description string      `json:"description"` | ||||
| 	Website     string      `json:"website"` | ||||
| 	Location    string      `json:"location"` | ||||
| 	Visibility  VisibleType `json:"visibility"` | ||||
| } | ||||
|  | ||||
| // EditOrgOption options for editing an organization | ||||
| type EditOrgOption struct { | ||||
| 	FullName    string `json:"full_name"` | ||||
| 	Description string `json:"description"` | ||||
| 	Website     string `json:"website"` | ||||
| 	Location    string `json:"location"` | ||||
| } | ||||
|  | ||||
| // EditOrg modify one organization via options | ||||
| func (c *Client) EditOrg(orgname string, opt EditOrgOption) error { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = c.getResponse("PATCH", fmt.Sprintf("/orgs/%s", orgname), jsonHeader, bytes.NewReader(body)) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										26
									
								
								vendor/code.gitea.io/sdk/gitea/org_member.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/code.gitea.io/sdk/gitea/org_member.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| // Copyright 2016 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // AddOrgMembershipOption add user to organization options | ||||
| type AddOrgMembershipOption struct { | ||||
| 	Role string `json:"role" binding:"Required"` | ||||
| } | ||||
|  | ||||
| // AddOrgMembership add some one to an organization's member | ||||
| func (c *Client) AddOrgMembership(org, user string, opt AddOrgMembershipOption) error { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = c.getResponse("PUT", fmt.Sprintf("/orgs/%s/membership/%s", org, user), jsonHeader, bytes.NewReader(body)) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										40
									
								
								vendor/code.gitea.io/sdk/gitea/org_team.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								vendor/code.gitea.io/sdk/gitea/org_team.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| // Copyright 2016 The Gogs Authors. All rights reserved. | ||||
| // Copyright 2018 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 gitea | ||||
|  | ||||
| // Team represents a team in an organization | ||||
| type Team struct { | ||||
| 	ID           int64         `json:"id"` | ||||
| 	Name         string        `json:"name"` | ||||
| 	Description  string        `json:"description"` | ||||
| 	Organization *Organization `json:"organization"` | ||||
| 	// enum: none,read,write,admin,owner | ||||
| 	Permission string `json:"permission"` | ||||
| 	// enum: repo.code,repo.issues,repo.ext_issues,repo.wiki,repo.pulls,repo.releases,repo.ext_wiki | ||||
| 	Units []string `json:"units"` | ||||
| } | ||||
|  | ||||
| // CreateTeamOption options for creating a team | ||||
| type CreateTeamOption struct { | ||||
| 	// required: true | ||||
| 	Name        string `json:"name" binding:"Required;AlphaDashDot;MaxSize(30)"` | ||||
| 	Description string `json:"description" binding:"MaxSize(255)"` | ||||
| 	// enum: read,write,admin | ||||
| 	Permission string `json:"permission"` | ||||
| 	// enum: repo.code,repo.issues,repo.ext_issues,repo.wiki,repo.pulls,repo.releases,repo.ext_wiki | ||||
| 	Units []string `json:"units"` | ||||
| } | ||||
|  | ||||
| // EditTeamOption options for editing a team | ||||
| type EditTeamOption struct { | ||||
| 	// required: true | ||||
| 	Name        string `json:"name" binding:"Required;AlphaDashDot;MaxSize(30)"` | ||||
| 	Description string `json:"description" binding:"MaxSize(255)"` | ||||
| 	// enum: read,write,admin | ||||
| 	Permission string `json:"permission"` | ||||
| 	// enum: repo.code,repo.issues,repo.ext_issues,repo.wiki,repo.pulls,repo.releases,repo.ext_wiki | ||||
| 	Units []string `json:"units"` | ||||
| } | ||||
							
								
								
									
										49
									
								
								vendor/code.gitea.io/sdk/gitea/org_type.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								vendor/code.gitea.io/sdk/gitea/org_type.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| // Copyright 2019 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 gitea | ||||
|  | ||||
| // VisibleType defines the visibility (Organization only) | ||||
| type VisibleType int | ||||
|  | ||||
| const ( | ||||
| 	// VisibleTypePublic Visible for everyone | ||||
| 	VisibleTypePublic VisibleType = iota | ||||
|  | ||||
| 	// VisibleTypeLimited Visible for every connected user | ||||
| 	VisibleTypeLimited | ||||
|  | ||||
| 	// VisibleTypePrivate Visible only for organization's members | ||||
| 	VisibleTypePrivate | ||||
| ) | ||||
|  | ||||
| // VisibilityModes is a map of org Visibility types | ||||
| var VisibilityModes = map[string]VisibleType{ | ||||
| 	"public":  VisibleTypePublic, | ||||
| 	"limited": VisibleTypeLimited, | ||||
| 	"private": VisibleTypePrivate, | ||||
| } | ||||
|  | ||||
| // IsPublic returns true if VisibleType is public | ||||
| func (vt VisibleType) IsPublic() bool { | ||||
| 	return vt == VisibleTypePublic | ||||
| } | ||||
|  | ||||
| // IsLimited returns true if VisibleType is limited | ||||
| func (vt VisibleType) IsLimited() bool { | ||||
| 	return vt == VisibleTypeLimited | ||||
| } | ||||
|  | ||||
| // IsPrivate returns true if VisibleType is private | ||||
| func (vt VisibleType) IsPrivate() bool { | ||||
| 	return vt == VisibleTypePrivate | ||||
| } | ||||
|  | ||||
| // ExtractKeysFromMapString provides a slice of keys from map | ||||
| func ExtractKeysFromMapString(in map[string]VisibleType) (keys []string) { | ||||
| 	for k := range in { | ||||
| 		keys = append(keys, k) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
							
								
								
									
										151
									
								
								vendor/code.gitea.io/sdk/gitea/pull.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								vendor/code.gitea.io/sdk/gitea/pull.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | ||||
| // Copyright 2016 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // PullRequest represents a pull request | ||||
| type PullRequest struct { | ||||
| 	ID        int64      `json:"id"` | ||||
| 	URL       string     `json:"url"` | ||||
| 	Index     int64      `json:"number"` | ||||
| 	Poster    *User      `json:"user"` | ||||
| 	Title     string     `json:"title"` | ||||
| 	Body      string     `json:"body"` | ||||
| 	Labels    []*Label   `json:"labels"` | ||||
| 	Milestone *Milestone `json:"milestone"` | ||||
| 	Assignee  *User      `json:"assignee"` | ||||
| 	Assignees []*User    `json:"assignees"` | ||||
| 	State     StateType  `json:"state"` | ||||
| 	Comments  int        `json:"comments"` | ||||
|  | ||||
| 	HTMLURL  string `json:"html_url"` | ||||
| 	DiffURL  string `json:"diff_url"` | ||||
| 	PatchURL string `json:"patch_url"` | ||||
|  | ||||
| 	Mergeable bool `json:"mergeable"` | ||||
| 	HasMerged bool `json:"merged"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Merged         *time.Time `json:"merged_at"` | ||||
| 	MergedCommitID *string    `json:"merge_commit_sha"` | ||||
| 	MergedBy       *User      `json:"merged_by"` | ||||
|  | ||||
| 	Base      *PRBranchInfo `json:"base"` | ||||
| 	Head      *PRBranchInfo `json:"head"` | ||||
| 	MergeBase string        `json:"merge_base"` | ||||
|  | ||||
| 	// swagger:strfmt date-time | ||||
| 	Deadline *time.Time `json:"due_date"` | ||||
|  | ||||
| 	// swagger:strfmt date-time | ||||
| 	Created *time.Time `json:"created_at"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Updated *time.Time `json:"updated_at"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Closed *time.Time `json:"closed_at"` | ||||
| } | ||||
|  | ||||
| // PRBranchInfo information about a branch | ||||
| type PRBranchInfo struct { | ||||
| 	Name       string      `json:"label"` | ||||
| 	Ref        string      `json:"ref"` | ||||
| 	Sha        string      `json:"sha"` | ||||
| 	RepoID     int64       `json:"repo_id"` | ||||
| 	Repository *Repository `json:"repo"` | ||||
| } | ||||
|  | ||||
| // ListPullRequestsOptions options for listing pull requests | ||||
| type ListPullRequestsOptions struct { | ||||
| 	Page  int    `json:"page"` | ||||
| 	State string `json:"state"` | ||||
| } | ||||
|  | ||||
| // ListRepoPullRequests list PRs of one repository | ||||
| func (c *Client) ListRepoPullRequests(owner, repo string, opt ListPullRequestsOptions) ([]*PullRequest, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	prs := make([]*PullRequest, 0, 10) | ||||
| 	return prs, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/pulls", owner, repo), jsonHeader, bytes.NewReader(body), &prs) | ||||
| } | ||||
|  | ||||
| // GetPullRequest get information of one PR | ||||
| func (c *Client) GetPullRequest(owner, repo string, index int64) (*PullRequest, error) { | ||||
| 	pr := new(PullRequest) | ||||
| 	return pr, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/pulls/%d", owner, repo, index), nil, nil, pr) | ||||
| } | ||||
|  | ||||
| // CreatePullRequestOption options when creating a pull request | ||||
| type CreatePullRequestOption struct { | ||||
| 	Head      string   `json:"head" binding:"Required"` | ||||
| 	Base      string   `json:"base" binding:"Required"` | ||||
| 	Title     string   `json:"title" binding:"Required"` | ||||
| 	Body      string   `json:"body"` | ||||
| 	Assignee  string   `json:"assignee"` | ||||
| 	Assignees []string `json:"assignees"` | ||||
| 	Milestone int64    `json:"milestone"` | ||||
| 	Labels    []int64  `json:"labels"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Deadline *time.Time `json:"due_date"` | ||||
| } | ||||
|  | ||||
| // CreatePullRequest create pull request with options | ||||
| func (c *Client) CreatePullRequest(owner, repo string, opt CreatePullRequestOption) (*PullRequest, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	pr := new(PullRequest) | ||||
| 	return pr, c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/pulls", owner, repo), | ||||
| 		jsonHeader, bytes.NewReader(body), pr) | ||||
| } | ||||
|  | ||||
| // EditPullRequestOption options when modify pull request | ||||
| type EditPullRequestOption struct { | ||||
| 	Title     string   `json:"title"` | ||||
| 	Body      string   `json:"body"` | ||||
| 	Assignee  string   `json:"assignee"` | ||||
| 	Assignees []string `json:"assignees"` | ||||
| 	Milestone int64    `json:"milestone"` | ||||
| 	Labels    []int64  `json:"labels"` | ||||
| 	State     *string  `json:"state"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Deadline *time.Time `json:"due_date"` | ||||
| } | ||||
|  | ||||
| // EditPullRequest modify pull request with PR id and options | ||||
| func (c *Client) EditPullRequest(owner, repo string, index int64, opt EditPullRequestOption) (*PullRequest, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	pr := new(PullRequest) | ||||
| 	return pr, c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/issues/%d", owner, repo, index), | ||||
| 		jsonHeader, bytes.NewReader(body), pr) | ||||
| } | ||||
|  | ||||
| // MergePullRequest merge a PR to repository by PR id | ||||
| func (c *Client) MergePullRequest(owner, repo string, index int64) error { | ||||
| 	_, err := c.getResponse("POST", fmt.Sprintf("/repos/%s/%s/pulls/%d/merge", owner, repo, index), nil, nil) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // IsPullRequestMerged test if one PR is merged to one repository | ||||
| func (c *Client) IsPullRequestMerged(owner, repo string, index int64) (bool, error) { | ||||
| 	statusCode, err := c.getStatusCode("GET", fmt.Sprintf("/repos/%s/%s/pulls/%d/merge", owner, repo, index), nil, nil) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return false, err | ||||
| 	} | ||||
|  | ||||
| 	return statusCode == 204, nil | ||||
|  | ||||
| } | ||||
							
								
								
									
										105
									
								
								vendor/code.gitea.io/sdk/gitea/release.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								vendor/code.gitea.io/sdk/gitea/release.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| // Copyright 2016 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // Release represents a repository release | ||||
| type Release struct { | ||||
| 	ID           int64  `json:"id"` | ||||
| 	TagName      string `json:"tag_name"` | ||||
| 	Target       string `json:"target_commitish"` | ||||
| 	Title        string `json:"name"` | ||||
| 	Note         string `json:"body"` | ||||
| 	URL          string `json:"url"` | ||||
| 	TarURL       string `json:"tarball_url"` | ||||
| 	ZipURL       string `json:"zipball_url"` | ||||
| 	IsDraft      bool   `json:"draft"` | ||||
| 	IsPrerelease bool   `json:"prerelease"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	CreatedAt time.Time `json:"created_at"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	PublishedAt time.Time     `json:"published_at"` | ||||
| 	Publisher   *User         `json:"author"` | ||||
| 	Attachments []*Attachment `json:"assets"` | ||||
| } | ||||
|  | ||||
| // ListReleases list releases of a repository | ||||
| func (c *Client) ListReleases(user, repo string) ([]*Release, error) { | ||||
| 	releases := make([]*Release, 0, 10) | ||||
| 	err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases", user, repo), | ||||
| 		nil, nil, &releases) | ||||
| 	return releases, err | ||||
| } | ||||
|  | ||||
| // GetRelease get a release of a repository | ||||
| func (c *Client) GetRelease(user, repo string, id int64) (*Release, error) { | ||||
| 	r := new(Release) | ||||
| 	err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/%d", user, repo, id), | ||||
| 		nil, nil, &r) | ||||
| 	return r, err | ||||
| } | ||||
|  | ||||
| // CreateReleaseOption options when creating a release | ||||
| type CreateReleaseOption struct { | ||||
| 	// required: true | ||||
| 	TagName      string `json:"tag_name" binding:"Required"` | ||||
| 	Target       string `json:"target_commitish"` | ||||
| 	Title        string `json:"name"` | ||||
| 	Note         string `json:"body"` | ||||
| 	IsDraft      bool   `json:"draft"` | ||||
| 	IsPrerelease bool   `json:"prerelease"` | ||||
| } | ||||
|  | ||||
| // CreateRelease create a release | ||||
| func (c *Client) CreateRelease(user, repo string, form CreateReleaseOption) (*Release, error) { | ||||
| 	body, err := json.Marshal(form) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	r := new(Release) | ||||
| 	err = c.getParsedResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases", user, repo), | ||||
| 		jsonHeader, bytes.NewReader(body), r) | ||||
| 	return r, err | ||||
| } | ||||
|  | ||||
| // EditReleaseOption options when editing a release | ||||
| type EditReleaseOption struct { | ||||
| 	TagName      string `json:"tag_name"` | ||||
| 	Target       string `json:"target_commitish"` | ||||
| 	Title        string `json:"name"` | ||||
| 	Note         string `json:"body"` | ||||
| 	IsDraft      *bool  `json:"draft"` | ||||
| 	IsPrerelease *bool  `json:"prerelease"` | ||||
| } | ||||
|  | ||||
| // EditRelease edit a release | ||||
| func (c *Client) EditRelease(user, repo string, id int64, form EditReleaseOption) (*Release, error) { | ||||
| 	body, err := json.Marshal(form) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	r := new(Release) | ||||
| 	err = c.getParsedResponse("PATCH", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/%d", user, repo, id), | ||||
| 		jsonHeader, bytes.NewReader(body), r) | ||||
| 	return r, err | ||||
| } | ||||
|  | ||||
| // DeleteRelease delete a release from a repository | ||||
| func (c *Client) DeleteRelease(user, repo string, id int64) error { | ||||
| 	_, err := c.getResponse("DELETE", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/%d", user, repo, id), | ||||
| 		nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										156
									
								
								vendor/code.gitea.io/sdk/gitea/repo.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								vendor/code.gitea.io/sdk/gitea/repo.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| // Copyright 2014 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // Permission represents a set of permissions | ||||
| type Permission struct { | ||||
| 	Admin bool `json:"admin"` | ||||
| 	Push  bool `json:"push"` | ||||
| 	Pull  bool `json:"pull"` | ||||
| } | ||||
|  | ||||
| // Repository represents a repository | ||||
| type Repository struct { | ||||
| 	ID            int64       `json:"id"` | ||||
| 	Owner         *User       `json:"owner"` | ||||
| 	Name          string      `json:"name"` | ||||
| 	FullName      string      `json:"full_name"` | ||||
| 	Description   string      `json:"description"` | ||||
| 	Empty         bool        `json:"empty"` | ||||
| 	Private       bool        `json:"private"` | ||||
| 	Fork          bool        `json:"fork"` | ||||
| 	Parent        *Repository `json:"parent"` | ||||
| 	Mirror        bool        `json:"mirror"` | ||||
| 	Size          int         `json:"size"` | ||||
| 	HTMLURL       string      `json:"html_url"` | ||||
| 	SSHURL        string      `json:"ssh_url"` | ||||
| 	CloneURL      string      `json:"clone_url"` | ||||
| 	Website       string      `json:"website"` | ||||
| 	Stars         int         `json:"stars_count"` | ||||
| 	Forks         int         `json:"forks_count"` | ||||
| 	Watchers      int         `json:"watchers_count"` | ||||
| 	OpenIssues    int         `json:"open_issues_count"` | ||||
| 	DefaultBranch string      `json:"default_branch"` | ||||
| 	Archived      bool        `json:"archived"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Created time.Time `json:"created_at"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Updated     time.Time   `json:"updated_at"` | ||||
| 	Permissions *Permission `json:"permissions,omitempty"` | ||||
| } | ||||
|  | ||||
| // ListMyRepos lists all repositories for the authenticated user that has access to. | ||||
| func (c *Client) ListMyRepos() ([]*Repository, error) { | ||||
| 	repos := make([]*Repository, 0, 10) | ||||
| 	return repos, c.getParsedResponse("GET", "/user/repos", nil, nil, &repos) | ||||
| } | ||||
|  | ||||
| // ListUserRepos list all repositories of one user by user's name | ||||
| func (c *Client) ListUserRepos(user string) ([]*Repository, error) { | ||||
| 	repos := make([]*Repository, 0, 10) | ||||
| 	return repos, c.getParsedResponse("GET", fmt.Sprintf("/users/%s/repos", user), nil, nil, &repos) | ||||
| } | ||||
|  | ||||
| // ListOrgRepos list all repositories of one organization by organization's name | ||||
| func (c *Client) ListOrgRepos(org string) ([]*Repository, error) { | ||||
| 	repos := make([]*Repository, 0, 10) | ||||
| 	return repos, c.getParsedResponse("GET", fmt.Sprintf("/orgs/%s/repos", org), nil, nil, &repos) | ||||
| } | ||||
|  | ||||
| // CreateRepoOption options when creating repository | ||||
| // swagger:model | ||||
| type CreateRepoOption struct { | ||||
| 	// Name of the repository to create | ||||
| 	// | ||||
| 	// required: true | ||||
| 	// unique: true | ||||
| 	Name string `json:"name" binding:"Required;AlphaDashDot;MaxSize(100)"` | ||||
| 	// Description of the repository to create | ||||
| 	Description string `json:"description" binding:"MaxSize(255)"` | ||||
| 	// Whether the repository is private | ||||
| 	Private bool `json:"private"` | ||||
| 	// Whether the repository should be auto-intialized? | ||||
| 	AutoInit bool `json:"auto_init"` | ||||
| 	// Gitignores to use | ||||
| 	Gitignores string `json:"gitignores"` | ||||
| 	// License to use | ||||
| 	License string `json:"license"` | ||||
| 	// Readme of the repository to create | ||||
| 	Readme string `json:"readme"` | ||||
| } | ||||
|  | ||||
| // CreateRepo creates a repository for authenticated user. | ||||
| func (c *Client) CreateRepo(opt CreateRepoOption) (*Repository, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	repo := new(Repository) | ||||
| 	return repo, c.getParsedResponse("POST", "/user/repos", jsonHeader, bytes.NewReader(body), repo) | ||||
| } | ||||
|  | ||||
| // CreateOrgRepo creates an organization repository for authenticated user. | ||||
| func (c *Client) CreateOrgRepo(org string, opt CreateRepoOption) (*Repository, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	repo := new(Repository) | ||||
| 	return repo, c.getParsedResponse("POST", fmt.Sprintf("/org/%s/repos", org), jsonHeader, bytes.NewReader(body), repo) | ||||
| } | ||||
|  | ||||
| // GetRepo returns information of a repository of given owner. | ||||
| func (c *Client) GetRepo(owner, reponame string) (*Repository, error) { | ||||
| 	repo := new(Repository) | ||||
| 	return repo, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s", owner, reponame), nil, nil, repo) | ||||
| } | ||||
|  | ||||
| // DeleteRepo deletes a repository of user or organization. | ||||
| func (c *Client) DeleteRepo(owner, repo string) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s", owner, repo), nil, nil) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // MigrateRepoOption options for migrating a repository from an external service | ||||
| type MigrateRepoOption struct { | ||||
| 	// required: true | ||||
| 	CloneAddr    string `json:"clone_addr" binding:"Required"` | ||||
| 	AuthUsername string `json:"auth_username"` | ||||
| 	AuthPassword string `json:"auth_password"` | ||||
| 	// required: true | ||||
| 	UID int `json:"uid" binding:"Required"` | ||||
| 	// required: true | ||||
| 	RepoName    string `json:"repo_name" binding:"Required"` | ||||
| 	Mirror      bool   `json:"mirror"` | ||||
| 	Private     bool   `json:"private"` | ||||
| 	Description string `json:"description"` | ||||
| } | ||||
|  | ||||
| // MigrateRepo migrates a repository from other Git hosting sources for the | ||||
| // authenticated user. | ||||
| // | ||||
| // To migrate a repository for a organization, the authenticated user must be a | ||||
| // owner of the specified organization. | ||||
| func (c *Client) MigrateRepo(opt MigrateRepoOption) (*Repository, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	repo := new(Repository) | ||||
| 	return repo, c.getParsedResponse("POST", "/repos/migrate", jsonHeader, bytes.NewReader(body), repo) | ||||
| } | ||||
|  | ||||
| // MirrorSync adds a mirrored repository to the mirror sync queue. | ||||
| func (c *Client) MirrorSync(owner, repo string) error { | ||||
| 	_, err := c.getResponse("POST", fmt.Sprintf("/repos/%s/%s/mirror-sync", owner, repo), nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										27
									
								
								vendor/code.gitea.io/sdk/gitea/repo_branch.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/code.gitea.io/sdk/gitea/repo_branch.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| // Copyright 2016 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // Branch represents a repository branch | ||||
| type Branch struct { | ||||
| 	Name   string         `json:"name"` | ||||
| 	Commit *PayloadCommit `json:"commit"` | ||||
| } | ||||
|  | ||||
| // ListRepoBranches list all the branches of one repository | ||||
| func (c *Client) ListRepoBranches(user, repo string) ([]*Branch, error) { | ||||
| 	branches := make([]*Branch, 0, 10) | ||||
| 	return branches, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/branches", user, repo), nil, nil, &branches) | ||||
| } | ||||
|  | ||||
| // GetRepoBranch get one branch's information of one repository | ||||
| func (c *Client) GetRepoBranch(user, repo, branch string) (*Branch, error) { | ||||
| 	b := new(Branch) | ||||
| 	return b, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/branches/%s", user, repo, branch), nil, nil, &b) | ||||
| } | ||||
							
								
								
									
										57
									
								
								vendor/code.gitea.io/sdk/gitea/repo_collaborator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								vendor/code.gitea.io/sdk/gitea/repo_collaborator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| // Copyright 2016 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // ListCollaborators list a repository's collaborators | ||||
| func (c *Client) ListCollaborators(user, repo string) ([]*User, error) { | ||||
| 	collaborators := make([]*User, 0, 10) | ||||
| 	err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/collaborators", user, repo), | ||||
| 		nil, nil, &collaborators) | ||||
| 	return collaborators, err | ||||
| } | ||||
|  | ||||
| // IsCollaborator check if a user is a collaborator of a repository | ||||
| func (c *Client) IsCollaborator(user, repo, collaborator string) (bool, error) { | ||||
| 	status, err := c.getStatusCode("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/collaborators/%s", user, repo, collaborator), | ||||
| 		nil, nil) | ||||
| 	if err != nil { | ||||
| 		return false, err | ||||
| 	} | ||||
| 	if status == 204 { | ||||
| 		return true, nil | ||||
| 	} | ||||
| 	return false, nil | ||||
| } | ||||
|  | ||||
| // AddCollaboratorOption options when adding a user as a collaborator of a repository | ||||
| type AddCollaboratorOption struct { | ||||
| 	Permission *string `json:"permission"` | ||||
| } | ||||
|  | ||||
| // AddCollaborator add some user as a collaborator of a repository | ||||
| func (c *Client) AddCollaborator(user, repo, collaborator string, opt AddCollaboratorOption) error { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = c.getResponse("PUT", fmt.Sprintf("/repos/%s/%s/collaborators/%s", user, repo, collaborator), nil, bytes.NewReader(body)) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // DeleteCollaborator remove a collaborator from a repository | ||||
| func (c *Client) DeleteCollaborator(user, repo, collaborator string) error { | ||||
| 	_, err := c.getResponse("DELETE", | ||||
| 		fmt.Sprintf("/repos/%s/%s/collaborators/%s", user, repo, collaborator), | ||||
| 		nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										54
									
								
								vendor/code.gitea.io/sdk/gitea/repo_commit.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								vendor/code.gitea.io/sdk/gitea/repo_commit.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| // Copyright 2018 The Gogs Authors. All rights reserved. | ||||
| // Copyright 2019 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // Identity for a person's identity like an author or committer | ||||
| type Identity struct { | ||||
| 	Name string `json:"name" binding:"MaxSize(100)"` | ||||
| 	// swagger:strfmt email | ||||
| 	Email string `json:"email" binding:"MaxSize(254)"` | ||||
| } | ||||
|  | ||||
| // CommitMeta contains meta information of a commit in terms of API. | ||||
| type CommitMeta struct { | ||||
| 	URL string `json:"url"` | ||||
| 	SHA string `json:"sha"` | ||||
| } | ||||
|  | ||||
| // CommitUser contains information of a user in the context of a commit. | ||||
| type CommitUser struct { | ||||
| 	Identity | ||||
| 	Date string `json:"date"` | ||||
| } | ||||
|  | ||||
| // RepoCommit contains information of a commit in the context of a repository. | ||||
| type RepoCommit struct { | ||||
| 	URL       string      `json:"url"` | ||||
| 	Author    *CommitUser `json:"author"` | ||||
| 	Committer *CommitUser `json:"committer"` | ||||
| 	Message   string      `json:"message"` | ||||
| 	Tree      *CommitMeta `json:"tree"` | ||||
| } | ||||
|  | ||||
| // Commit contains information generated from a Git commit. | ||||
| type Commit struct { | ||||
| 	*CommitMeta | ||||
| 	HTMLURL    string        `json:"html_url"` | ||||
| 	RepoCommit *RepoCommit   `json:"commit"` | ||||
| 	Author     *User         `json:"author"` | ||||
| 	Committer  *User         `json:"committer"` | ||||
| 	Parents    []*CommitMeta `json:"parents"` | ||||
| } | ||||
|  | ||||
| // GetSingleCommit returns a single commit | ||||
| func (c *Client) GetSingleCommit(user, repo, commitID string) (*Commit, error) { | ||||
| 	commit := new(Commit) | ||||
| 	return commit, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/commits/%s", user, repo, commitID), nil, nil, &commit) | ||||
| } | ||||
							
								
								
									
										90
									
								
								vendor/code.gitea.io/sdk/gitea/repo_file.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								vendor/code.gitea.io/sdk/gitea/repo_file.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| // Copyright 2014 The Gogs Authors. All rights reserved. | ||||
| // Copyright 2019 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // GetFile downloads a file of repository, ref can be branch/tag/commit. | ||||
| // e.g.: ref -> master, tree -> macaron.go(no leading slash) | ||||
| func (c *Client) GetFile(user, repo, ref, tree string) ([]byte, error) { | ||||
| 	return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s/%s", user, repo, ref, tree), nil, nil) | ||||
| } | ||||
|  | ||||
| // FileOptions options for all file APIs | ||||
| type FileOptions struct { | ||||
| 	Message       string   `json:"message" binding:"Required"` | ||||
| 	BranchName    string   `json:"branch"` | ||||
| 	NewBranchName string   `json:"new_branch"` | ||||
| 	Author        Identity `json:"author"` | ||||
| 	Committer     Identity `json:"committer"` | ||||
| } | ||||
|  | ||||
| // CreateFileOptions options for creating files | ||||
| type CreateFileOptions struct { | ||||
| 	FileOptions | ||||
| 	Content string `json:"content"` | ||||
| } | ||||
|  | ||||
| // DeleteFileOptions options for deleting files (used for other File structs below) | ||||
| type DeleteFileOptions struct { | ||||
| 	FileOptions | ||||
| 	SHA string `json:"sha" binding:"Required"` | ||||
| } | ||||
|  | ||||
| // UpdateFileOptions options for updating files | ||||
| type UpdateFileOptions struct { | ||||
| 	DeleteFileOptions | ||||
| 	Content  string `json:"content"` | ||||
| 	FromPath string `json:"from_path" binding:"MaxSize(500)"` | ||||
| } | ||||
|  | ||||
| // FileLinksResponse contains the links for a repo's file | ||||
| type FileLinksResponse struct { | ||||
| 	Self    string `json:"url"` | ||||
| 	GitURL  string `json:"git_url"` | ||||
| 	HTMLURL string `json:"html_url"` | ||||
| } | ||||
|  | ||||
| // FileContentResponse contains information about a repo's file stats and content | ||||
| type FileContentResponse struct { | ||||
| 	Name        string             `json:"name"` | ||||
| 	Path        string             `json:"path"` | ||||
| 	SHA         string             `json:"sha"` | ||||
| 	Size        int64              `json:"size"` | ||||
| 	URL         string             `json:"url"` | ||||
| 	HTMLURL     string             `json:"html_url"` | ||||
| 	GitURL      string             `json:"git_url"` | ||||
| 	DownloadURL string             `json:"download_url"` | ||||
| 	Type        string             `json:"type"` | ||||
| 	Links       *FileLinksResponse `json:"_links"` | ||||
| } | ||||
|  | ||||
| // FileCommitResponse contains information generated from a Git commit for a repo's file. | ||||
| type FileCommitResponse struct { | ||||
| 	CommitMeta | ||||
| 	HTMLURL   string        `json:"html_url"` | ||||
| 	Author    *CommitUser   `json:"author"` | ||||
| 	Committer *CommitUser   `json:"committer"` | ||||
| 	Parents   []*CommitMeta `json:"parents"` | ||||
| 	Message   string        `json:"message"` | ||||
| 	Tree      *CommitMeta   `json:"tree"` | ||||
| } | ||||
|  | ||||
| // FileResponse contains information about a repo's file | ||||
| type FileResponse struct { | ||||
| 	Content      *FileContentResponse       `json:"content"` | ||||
| 	Commit       *FileCommitResponse        `json:"commit"` | ||||
| 	Verification *PayloadCommitVerification `json:"verification"` | ||||
| } | ||||
|  | ||||
| // FileDeleteResponse contains information about a repo's file that was deleted | ||||
| type FileDeleteResponse struct { | ||||
| 	Content      interface{}                `json:"content"` // to be set to nil | ||||
| 	Commit       *FileCommitResponse        `json:"commit"` | ||||
| 	Verification *PayloadCommitVerification `json:"verification"` | ||||
| } | ||||
							
								
								
									
										72
									
								
								vendor/code.gitea.io/sdk/gitea/repo_key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								vendor/code.gitea.io/sdk/gitea/repo_key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| // Copyright 2015 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // DeployKey a deploy key | ||||
| type DeployKey struct { | ||||
| 	ID          int64  `json:"id"` | ||||
| 	KeyID       int64  `json:"key_id"` | ||||
| 	Key         string `json:"key"` | ||||
| 	URL         string `json:"url"` | ||||
| 	Title       string `json:"title"` | ||||
| 	Fingerprint string `json:"fingerprint"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Created    time.Time   `json:"created_at"` | ||||
| 	ReadOnly   bool        `json:"read_only"` | ||||
| 	Repository *Repository `json:"repository,omitempty"` | ||||
| } | ||||
|  | ||||
| // ListDeployKeys list all the deploy keys of one repository | ||||
| func (c *Client) ListDeployKeys(user, repo string) ([]*DeployKey, error) { | ||||
| 	keys := make([]*DeployKey, 0, 10) | ||||
| 	return keys, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/keys", user, repo), nil, nil, &keys) | ||||
| } | ||||
|  | ||||
| // GetDeployKey get one deploy key with key id | ||||
| func (c *Client) GetDeployKey(user, repo string, keyID int64) (*DeployKey, error) { | ||||
| 	key := new(DeployKey) | ||||
| 	return key, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/keys/%d", user, repo, keyID), nil, nil, &key) | ||||
| } | ||||
|  | ||||
| // CreateKeyOption options when creating a key | ||||
| type CreateKeyOption struct { | ||||
| 	// Title of the key to add | ||||
| 	// | ||||
| 	// required: true | ||||
| 	// unique: true | ||||
| 	Title string `json:"title" binding:"Required"` | ||||
| 	// An armored SSH key to add | ||||
| 	// | ||||
| 	// required: true | ||||
| 	// unique: true | ||||
| 	Key string `json:"key" binding:"Required"` | ||||
| 	// Describe if the key has only read access or read/write | ||||
| 	// | ||||
| 	// required: false | ||||
| 	ReadOnly bool `json:"read_only"` | ||||
| } | ||||
|  | ||||
| // CreateDeployKey options when create one deploy key | ||||
| func (c *Client) CreateDeployKey(user, repo string, opt CreateKeyOption) (*DeployKey, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	key := new(DeployKey) | ||||
| 	return key, c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/keys", user, repo), jsonHeader, bytes.NewReader(body), key) | ||||
| } | ||||
|  | ||||
| // DeleteDeployKey delete deploy key with key id | ||||
| func (c *Client) DeleteDeployKey(owner, repo string, keyID int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/keys/%d", owner, repo, keyID), nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										69
									
								
								vendor/code.gitea.io/sdk/gitea/repo_refs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								vendor/code.gitea.io/sdk/gitea/repo_refs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| // Copyright 2018 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // Reference represents a Git reference. | ||||
| type Reference struct { | ||||
| 	Ref    string     `json:"ref"` | ||||
| 	URL    string     `json:"url"` | ||||
| 	Object *GitObject `json:"object"` | ||||
| } | ||||
|  | ||||
| // GitObject represents a Git object. | ||||
| type GitObject struct { | ||||
| 	Type string `json:"type"` | ||||
| 	SHA  string `json:"sha"` | ||||
| 	URL  string `json:"url"` | ||||
| } | ||||
|  | ||||
| // GetRepoRef get one ref's information of one repository | ||||
| func (c *Client) GetRepoRef(user, repo, ref string) (*Reference, error) { | ||||
| 	ref = strings.TrimPrefix(ref, "refs/") | ||||
| 	r := new(Reference) | ||||
| 	err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/git/refs/%s", user, repo, ref), nil, nil, &r) | ||||
| 	if _, ok := err.(*json.UnmarshalTypeError); ok { | ||||
| 		// Multiple refs | ||||
| 		return nil, errors.New("no exact match found for this ref") | ||||
| 	} else if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return r, nil | ||||
| } | ||||
|  | ||||
| // GetRepoRefs get list of ref's information of one repository | ||||
| func (c *Client) GetRepoRefs(user, repo, ref string) ([]*Reference, error) { | ||||
| 	ref = strings.TrimPrefix(ref, "refs/") | ||||
| 	resp, err := c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/git/refs/%s", user, repo, ref), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// Attempt to unmarshal single returned ref. | ||||
| 	r := new(Reference) | ||||
| 	refErr := json.Unmarshal(resp, r) | ||||
| 	if refErr == nil { | ||||
| 		return []*Reference{r}, nil | ||||
| 	} | ||||
|  | ||||
| 	// Attempt to unmarshal multiple refs. | ||||
| 	var rs []*Reference | ||||
| 	refsErr := json.Unmarshal(resp, &rs) | ||||
| 	if refsErr == nil { | ||||
| 		if len(rs) == 0 { | ||||
| 			return nil, errors.New("unexpected response: an array of refs with length 0") | ||||
| 		} | ||||
| 		return rs, nil | ||||
| 	} | ||||
|  | ||||
| 	return nil, fmt.Errorf("unmarshalling failed for both single and multiple refs: %s and %s", refErr, refsErr) | ||||
| } | ||||
							
								
								
									
										26
									
								
								vendor/code.gitea.io/sdk/gitea/repo_tag.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/code.gitea.io/sdk/gitea/repo_tag.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| // Copyright 2019 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // Tag represents a repository tag | ||||
| type Tag struct { | ||||
| 	Name   string `json:"name"` | ||||
| 	Commit struct { | ||||
| 		SHA string `json:"sha"` | ||||
| 		URL string `json:"url"` | ||||
| 	} `json:"commit"` | ||||
| 	ZipballURL string `json:"zipball_url"` | ||||
| 	TarballURL string `json:"tarball_url"` | ||||
| } | ||||
|  | ||||
| // ListRepoTags list all the branches of one repository | ||||
| func (c *Client) ListRepoTags(user, repo string) ([]*Tag, error) { | ||||
| 	tags := make([]*Tag, 0, 10) | ||||
| 	return tags, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/tags", user, repo), nil, nil, &tags) | ||||
| } | ||||
							
								
								
									
										41
									
								
								vendor/code.gitea.io/sdk/gitea/repo_tree.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								vendor/code.gitea.io/sdk/gitea/repo_tree.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| // Copyright 2018 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // GitEntry represents a git tree | ||||
| type GitEntry struct { | ||||
| 	Path string `json:"path"` | ||||
| 	Mode string `json:"mode"` | ||||
| 	Type string `json:"type"` | ||||
| 	Size int64  `json:"size"` | ||||
| 	SHA  string `json:"sha"` | ||||
| 	URL  string `json:"url"` | ||||
| } | ||||
|  | ||||
| // GitTreeResponse returns a git tree | ||||
| type GitTreeResponse struct { | ||||
| 	SHA        string     `json:"sha"` | ||||
| 	URL        string     `json:"url"` | ||||
| 	Entries    []GitEntry `json:"tree"` | ||||
| 	Truncated  bool       `json:"truncated"` | ||||
| 	Page       int        `json:"page"` | ||||
| 	TotalCount int        `json:"total_count"` | ||||
| } | ||||
|  | ||||
| // GetTrees downloads a file of repository, ref can be branch/tag/commit. | ||||
| // e.g.: ref -> master, tree -> macaron.go(no leading slash) | ||||
| func (c *Client) GetTrees(user, repo, ref string, recursive bool) (*GitTreeResponse, error) { | ||||
| 	var trees GitTreeResponse | ||||
| 	var path = fmt.Sprintf("/repos/%s/%s/git/trees/%s", user, repo, ref) | ||||
| 	if recursive { | ||||
| 		path += "?recursive=1" | ||||
| 	} | ||||
| 	err := c.getParsedResponse("GET", path, nil, nil, &trees) | ||||
| 	return &trees, err | ||||
| } | ||||
							
								
								
									
										41
									
								
								vendor/code.gitea.io/sdk/gitea/repo_watch.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								vendor/code.gitea.io/sdk/gitea/repo_watch.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| // Copyright 2017 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // WatchInfo represents an API watch status of one repository | ||||
| type WatchInfo struct { | ||||
| 	Subscribed    bool        `json:"subscribed"` | ||||
| 	Ignored       bool        `json:"ignored"` | ||||
| 	Reason        interface{} `json:"reason"` | ||||
| 	CreatedAt     time.Time   `json:"created_at"` | ||||
| 	URL           string      `json:"url"` | ||||
| 	RepositoryURL string      `json:"repository_url"` | ||||
| } | ||||
|  | ||||
| // GetWatchedRepos list all the watched repos of user | ||||
| func (c *Client) GetWatchedRepos(user, pass string) ([]*Repository, error) { | ||||
| 	repos := make([]*Repository, 0, 10) | ||||
| 	return repos, c.getParsedResponse("GET", fmt.Sprintf("/users/%s/subscriptions", user), | ||||
| 		http.Header{"Authorization": []string{"Basic " + BasicAuthEncode(user, pass)}}, nil, &repos) | ||||
| } | ||||
|  | ||||
| // WatchRepo start to watch a repository | ||||
| func (c *Client) WatchRepo(user, pass, repoUser, repoName string) (*WatchInfo, error) { | ||||
| 	i := new(WatchInfo) | ||||
| 	return i, c.getParsedResponse("PUT", fmt.Sprintf("/repos/%s/%s/subscription", repoUser, repoName), | ||||
| 		http.Header{"Authorization": []string{"Basic " + BasicAuthEncode(user, pass)}}, nil, i) | ||||
| } | ||||
|  | ||||
| // UnWatchRepo start to watch a repository | ||||
| func (c *Client) UnWatchRepo(user, pass, repoUser, repoName string) (int, error) { | ||||
| 	return c.getStatusCode("DELETE", fmt.Sprintf("/repos/%s/%s/subscription", repoUser, repoName), | ||||
| 		http.Header{"Authorization": []string{"Basic " + BasicAuthEncode(user, pass)}}, nil) | ||||
| } | ||||
							
								
								
									
										97
									
								
								vendor/code.gitea.io/sdk/gitea/status.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								vendor/code.gitea.io/sdk/gitea/status.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,97 @@ | ||||
| // Copyright 2017 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // StatusState holds the state of a Status | ||||
| // It can be "pending", "success", "error", "failure", and "warning" | ||||
| type StatusState string | ||||
|  | ||||
| const ( | ||||
| 	// StatusPending is for when the Status is Pending | ||||
| 	StatusPending StatusState = "pending" | ||||
| 	// StatusSuccess is for when the Status is Success | ||||
| 	StatusSuccess StatusState = "success" | ||||
| 	// StatusError is for when the Status is Error | ||||
| 	StatusError StatusState = "error" | ||||
| 	// StatusFailure is for when the Status is Failure | ||||
| 	StatusFailure StatusState = "failure" | ||||
| 	// StatusWarning is for when the Status is Warning | ||||
| 	StatusWarning StatusState = "warning" | ||||
| ) | ||||
|  | ||||
| // Status holds a single Status of a single Commit | ||||
| type Status struct { | ||||
| 	ID          int64       `json:"id"` | ||||
| 	State       StatusState `json:"status"` | ||||
| 	TargetURL   string      `json:"target_url"` | ||||
| 	Description string      `json:"description"` | ||||
| 	URL         string      `json:"url"` | ||||
| 	Context     string      `json:"context"` | ||||
| 	Creator     *User       `json:"creator"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Created time.Time `json:"created_at"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Updated time.Time `json:"updated_at"` | ||||
| } | ||||
|  | ||||
| // CombinedStatus holds the combined state of several statuses for a single commit | ||||
| type CombinedStatus struct { | ||||
| 	State      StatusState `json:"state"` | ||||
| 	SHA        string      `json:"sha"` | ||||
| 	TotalCount int         `json:"total_count"` | ||||
| 	Statuses   []*Status   `json:"statuses"` | ||||
| 	Repository *Repository `json:"repository"` | ||||
| 	CommitURL  string      `json:"commit_url"` | ||||
| 	URL        string      `json:"url"` | ||||
| } | ||||
|  | ||||
| // CreateStatusOption holds the information needed to create a new Status for a Commit | ||||
| type CreateStatusOption struct { | ||||
| 	State       StatusState `json:"state"` | ||||
| 	TargetURL   string      `json:"target_url"` | ||||
| 	Description string      `json:"description"` | ||||
| 	Context     string      `json:"context"` | ||||
| } | ||||
|  | ||||
| // ListStatusesOption holds pagination information | ||||
| type ListStatusesOption struct { | ||||
| 	Page int | ||||
| } | ||||
|  | ||||
| // CreateStatus creates a new Status for a given Commit | ||||
| // | ||||
| // POST /repos/:owner/:repo/statuses/:sha | ||||
| func (c *Client) CreateStatus(owner, repo, sha string, opts CreateStatusOption) (*Status, error) { | ||||
| 	body, err := json.Marshal(&opts) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	status := &Status{} | ||||
| 	return status, c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/statuses/%s", owner, repo, sha), | ||||
| 		jsonHeader, bytes.NewReader(body), status) | ||||
| } | ||||
|  | ||||
| // ListStatuses returns all statuses for a given Commit | ||||
| // | ||||
| // GET /repos/:owner/:repo/commits/:ref/statuses | ||||
| func (c *Client) ListStatuses(owner, repo, sha string, opts ListStatusesOption) ([]*Status, error) { | ||||
| 	statuses := make([]*Status, 0, 10) | ||||
| 	return statuses, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/commits/%s/statuses?page=%d", owner, repo, sha, opts.Page), nil, nil, &statuses) | ||||
| } | ||||
|  | ||||
| // GetCombinedStatus returns the CombinedStatus for a given Commit | ||||
| // | ||||
| // GET /repos/:owner/:repo/commits/:ref/status | ||||
| func (c *Client) GetCombinedStatus(owner, repo, sha string) (*CombinedStatus, error) { | ||||
| 	status := &CombinedStatus{} | ||||
| 	return status, c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/commits/%s/status", owner, repo, sha), nil, nil, status) | ||||
| } | ||||
							
								
								
									
										53
									
								
								vendor/code.gitea.io/sdk/gitea/user.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								vendor/code.gitea.io/sdk/gitea/user.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| // Copyright 2014 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // User represents a user | ||||
| // swagger:model | ||||
| type User struct { | ||||
| 	// the user's id | ||||
| 	ID int64 `json:"id"` | ||||
| 	// the user's username | ||||
| 	UserName string `json:"login"` | ||||
| 	// the user's full name | ||||
| 	FullName string `json:"full_name"` | ||||
| 	// swagger:strfmt email | ||||
| 	Email string `json:"email"` | ||||
| 	// URL to the user's avatar | ||||
| 	AvatarURL string `json:"avatar_url"` | ||||
| 	// User locale | ||||
| 	Language string `json:"language"` | ||||
| 	// Is the user an administrator | ||||
| 	IsAdmin bool `json:"is_admin"` | ||||
| } | ||||
|  | ||||
| // MarshalJSON implements the json.Marshaler interface for User, adding field(s) for backward compatibility | ||||
| func (u User) MarshalJSON() ([]byte, error) { | ||||
| 	// Re-declaring User to avoid recursion | ||||
| 	type shadow User | ||||
| 	return json.Marshal(struct { | ||||
| 		shadow | ||||
| 		CompatUserName string `json:"username"` | ||||
| 	}{shadow(u), u.UserName}) | ||||
| } | ||||
|  | ||||
| // GetUserInfo get user info by user's name | ||||
| func (c *Client) GetUserInfo(user string) (*User, error) { | ||||
| 	u := new(User) | ||||
| 	err := c.getParsedResponse("GET", fmt.Sprintf("/users/%s", user), nil, nil, u) | ||||
| 	return u, err | ||||
| } | ||||
|  | ||||
| // GetMyUserInfo get user info of current user | ||||
| func (c *Client) GetMyUserInfo() (*User, error) { | ||||
| 	u := new(User) | ||||
| 	err := c.getParsedResponse("GET", "/user", nil, nil, u) | ||||
| 	return u, err | ||||
| } | ||||
							
								
								
									
										66
									
								
								vendor/code.gitea.io/sdk/gitea/user_app.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								vendor/code.gitea.io/sdk/gitea/user_app.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| // Copyright 2014 The Gogs Authors. All rights reserved. | ||||
| // Copyright 2019 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/base64" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| ) | ||||
|  | ||||
| // BasicAuthEncode generate base64 of basic auth head | ||||
| func BasicAuthEncode(user, pass string) string { | ||||
| 	return base64.StdEncoding.EncodeToString([]byte(user + ":" + pass)) | ||||
| } | ||||
|  | ||||
| // AccessToken represents an API access token. | ||||
| // swagger:response AccessToken | ||||
| type AccessToken struct { | ||||
| 	ID             int64  `json:"id"` | ||||
| 	Name           string `json:"name"` | ||||
| 	Token          string `json:"token"` | ||||
| 	HashedToken    string `json:"hashed_token"` | ||||
| 	TokenLastEight string `json:"token_last_eight"` | ||||
| } | ||||
|  | ||||
| // AccessTokenList represents a list of API access token. | ||||
| // swagger:response AccessTokenList | ||||
| type AccessTokenList []*AccessToken | ||||
|  | ||||
| // ListAccessTokens lista all the access tokens of user | ||||
| func (c *Client) ListAccessTokens(user, pass string) ([]*AccessToken, error) { | ||||
| 	tokens := make([]*AccessToken, 0, 10) | ||||
| 	return tokens, c.getParsedResponse("GET", fmt.Sprintf("/users/%s/tokens", user), | ||||
| 		http.Header{"Authorization": []string{"Basic " + BasicAuthEncode(user, pass)}}, nil, &tokens) | ||||
| } | ||||
|  | ||||
| // CreateAccessTokenOption options when create access token | ||||
| // swagger:parameters userCreateToken | ||||
| type CreateAccessTokenOption struct { | ||||
| 	Name string `json:"name" binding:"Required"` | ||||
| } | ||||
|  | ||||
| // CreateAccessToken create one access token with options | ||||
| func (c *Client) CreateAccessToken(user, pass string, opt CreateAccessTokenOption) (*AccessToken, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	t := new(AccessToken) | ||||
| 	return t, c.getParsedResponse("POST", fmt.Sprintf("/users/%s/tokens", user), | ||||
| 		http.Header{ | ||||
| 			"content-type":  []string{"application/json"}, | ||||
| 			"Authorization": []string{"Basic " + BasicAuthEncode(user, pass)}}, | ||||
| 		bytes.NewReader(body), t) | ||||
| } | ||||
|  | ||||
| // DeleteAccessToken delete token with key id | ||||
| func (c *Client) DeleteAccessToken(user string, keyID int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/user/%s/tokens/%d", user, keyID), nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										56
									
								
								vendor/code.gitea.io/sdk/gitea/user_email.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								vendor/code.gitea.io/sdk/gitea/user_email.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| // Copyright 2015 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| ) | ||||
|  | ||||
| // Email an email address belonging to a user | ||||
| type Email struct { | ||||
| 	// swagger:strfmt email | ||||
| 	Email    string `json:"email"` | ||||
| 	Verified bool   `json:"verified"` | ||||
| 	Primary  bool   `json:"primary"` | ||||
| } | ||||
|  | ||||
| // ListEmails all the email addresses of user | ||||
| func (c *Client) ListEmails() ([]*Email, error) { | ||||
| 	emails := make([]*Email, 0, 3) | ||||
| 	return emails, c.getParsedResponse("GET", "/user/emails", nil, nil, &emails) | ||||
| } | ||||
|  | ||||
| // CreateEmailOption options when creating email addresses | ||||
| type CreateEmailOption struct { | ||||
| 	// email addresses to add | ||||
| 	Emails []string `json:"emails"` | ||||
| } | ||||
|  | ||||
| // AddEmail add one email to current user with options | ||||
| func (c *Client) AddEmail(opt CreateEmailOption) ([]*Email, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	emails := make([]*Email, 0, 3) | ||||
| 	return emails, c.getParsedResponse("POST", "/user/emails", jsonHeader, bytes.NewReader(body), emails) | ||||
| } | ||||
|  | ||||
| // DeleteEmailOption options when deleting email addresses | ||||
| type DeleteEmailOption struct { | ||||
| 	// email addresses to delete | ||||
| 	Emails []string `json:"emails"` | ||||
| } | ||||
|  | ||||
| // DeleteEmail delete one email of current users' | ||||
| func (c *Client) DeleteEmail(opt DeleteEmailOption) error { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	_, err = c.getResponse("DELETE", "/user/emails", jsonHeader, bytes.NewReader(body)) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										55
									
								
								vendor/code.gitea.io/sdk/gitea/user_follow.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								vendor/code.gitea.io/sdk/gitea/user_follow.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| // Copyright 2015 The Gogs 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 gitea | ||||
|  | ||||
| import "fmt" | ||||
|  | ||||
| // ListMyFollowers list all the followers of current user | ||||
| func (c *Client) ListMyFollowers(page int) ([]*User, error) { | ||||
| 	users := make([]*User, 0, 10) | ||||
| 	return users, c.getParsedResponse("GET", fmt.Sprintf("/user/followers?page=%d", page), nil, nil, &users) | ||||
| } | ||||
|  | ||||
| // ListFollowers list all the followers of one user | ||||
| func (c *Client) ListFollowers(user string, page int) ([]*User, error) { | ||||
| 	users := make([]*User, 0, 10) | ||||
| 	return users, c.getParsedResponse("GET", fmt.Sprintf("/users/%s/followers?page=%d", user, page), nil, nil, &users) | ||||
| } | ||||
|  | ||||
| // ListMyFollowing list all the users current user followed | ||||
| func (c *Client) ListMyFollowing(page int) ([]*User, error) { | ||||
| 	users := make([]*User, 0, 10) | ||||
| 	return users, c.getParsedResponse("GET", fmt.Sprintf("/user/following?page=%d", page), nil, nil, &users) | ||||
| } | ||||
|  | ||||
| // ListFollowing list all the users the user followed | ||||
| func (c *Client) ListFollowing(user string, page int) ([]*User, error) { | ||||
| 	users := make([]*User, 0, 10) | ||||
| 	return users, c.getParsedResponse("GET", fmt.Sprintf("/users/%s/following?page=%d", user, page), nil, nil, &users) | ||||
| } | ||||
|  | ||||
| // IsFollowing if current user followed the target | ||||
| func (c *Client) IsFollowing(target string) bool { | ||||
| 	_, err := c.getResponse("GET", fmt.Sprintf("/user/following/%s", target), nil, nil) | ||||
| 	return err == nil | ||||
| } | ||||
|  | ||||
| // IsUserFollowing if the user followed the target | ||||
| func (c *Client) IsUserFollowing(user, target string) bool { | ||||
| 	_, err := c.getResponse("GET", fmt.Sprintf("/users/%s/following/%s", user, target), nil, nil) | ||||
| 	return err == nil | ||||
| } | ||||
|  | ||||
| // Follow set current user follow the target | ||||
| func (c *Client) Follow(target string) error { | ||||
| 	_, err := c.getResponse("PUT", fmt.Sprintf("/user/following/%s", target), nil, nil) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // Unfollow set current user unfollow the target | ||||
| func (c *Client) Unfollow(target string) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/user/following/%s", target), nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										80
									
								
								vendor/code.gitea.io/sdk/gitea/user_gpgkey.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								vendor/code.gitea.io/sdk/gitea/user_gpgkey.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| // Copyright 2017 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // GPGKey a user GPG key to sign commit and tag in repository | ||||
| type GPGKey struct { | ||||
| 	ID                int64          `json:"id"` | ||||
| 	PrimaryKeyID      string         `json:"primary_key_id"` | ||||
| 	KeyID             string         `json:"key_id"` | ||||
| 	PublicKey         string         `json:"public_key"` | ||||
| 	Emails            []*GPGKeyEmail `json:"emails"` | ||||
| 	SubsKey           []*GPGKey      `json:"subkeys"` | ||||
| 	CanSign           bool           `json:"can_sign"` | ||||
| 	CanEncryptComms   bool           `json:"can_encrypt_comms"` | ||||
| 	CanEncryptStorage bool           `json:"can_encrypt_storage"` | ||||
| 	CanCertify        bool           `json:"can_certify"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Created time.Time `json:"created_at,omitempty"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Expires time.Time `json:"expires_at,omitempty"` | ||||
| } | ||||
|  | ||||
| // GPGKeyEmail an email attached to a GPGKey | ||||
| // swagger:model GPGKeyEmail | ||||
| type GPGKeyEmail struct { | ||||
| 	Email    string `json:"email"` | ||||
| 	Verified bool   `json:"verified"` | ||||
| } | ||||
|  | ||||
| // CreateGPGKeyOption options create user GPG key | ||||
| type CreateGPGKeyOption struct { | ||||
| 	// An armored GPG key to add | ||||
| 	// | ||||
| 	// required: true | ||||
| 	// unique: true | ||||
| 	ArmoredKey string `json:"armored_public_key" binding:"Required"` | ||||
| } | ||||
|  | ||||
| // ListGPGKeys list all the GPG keys of the user | ||||
| func (c *Client) ListGPGKeys(user string) ([]*GPGKey, error) { | ||||
| 	keys := make([]*GPGKey, 0, 10) | ||||
| 	return keys, c.getParsedResponse("GET", fmt.Sprintf("/users/%s/gpg_keys", user), nil, nil, &keys) | ||||
| } | ||||
|  | ||||
| // ListMyGPGKeys list all the GPG keys of current user | ||||
| func (c *Client) ListMyGPGKeys() ([]*GPGKey, error) { | ||||
| 	keys := make([]*GPGKey, 0, 10) | ||||
| 	return keys, c.getParsedResponse("GET", "/user/gpg_keys", nil, nil, &keys) | ||||
| } | ||||
|  | ||||
| // GetGPGKey get current user's GPG key by key id | ||||
| func (c *Client) GetGPGKey(keyID int64) (*GPGKey, error) { | ||||
| 	key := new(GPGKey) | ||||
| 	return key, c.getParsedResponse("GET", fmt.Sprintf("/user/gpg_keys/%d", keyID), nil, nil, &key) | ||||
| } | ||||
|  | ||||
| // CreateGPGKey create GPG key with options | ||||
| func (c *Client) CreateGPGKey(opt CreateGPGKeyOption) (*GPGKey, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	key := new(GPGKey) | ||||
| 	return key, c.getParsedResponse("POST", "/user/gpg_keys", jsonHeader, bytes.NewReader(body), key) | ||||
| } | ||||
|  | ||||
| // DeleteGPGKey delete GPG key with key id | ||||
| func (c *Client) DeleteGPGKey(keyID int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/user/gpg_keys/%d", keyID), nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										60
									
								
								vendor/code.gitea.io/sdk/gitea/user_key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								vendor/code.gitea.io/sdk/gitea/user_key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| // Copyright 2015 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // PublicKey publickey is a user key to push code to repository | ||||
| type PublicKey struct { | ||||
| 	ID          int64  `json:"id"` | ||||
| 	Key         string `json:"key"` | ||||
| 	URL         string `json:"url,omitempty"` | ||||
| 	Title       string `json:"title,omitempty"` | ||||
| 	Fingerprint string `json:"fingerprint,omitempty"` | ||||
| 	// swagger:strfmt date-time | ||||
| 	Created  time.Time `json:"created_at,omitempty"` | ||||
| 	Owner    *User     `json:"user,omitempty"` | ||||
| 	ReadOnly bool      `json:"read_only,omitempty"` | ||||
| 	KeyType  string    `json:"key_type,omitempty"` | ||||
| } | ||||
|  | ||||
| // ListPublicKeys list all the public keys of the user | ||||
| func (c *Client) ListPublicKeys(user string) ([]*PublicKey, error) { | ||||
| 	keys := make([]*PublicKey, 0, 10) | ||||
| 	return keys, c.getParsedResponse("GET", fmt.Sprintf("/users/%s/keys", user), nil, nil, &keys) | ||||
| } | ||||
|  | ||||
| // ListMyPublicKeys list all the public keys of current user | ||||
| func (c *Client) ListMyPublicKeys() ([]*PublicKey, error) { | ||||
| 	keys := make([]*PublicKey, 0, 10) | ||||
| 	return keys, c.getParsedResponse("GET", "/user/keys", nil, nil, &keys) | ||||
| } | ||||
|  | ||||
| // GetPublicKey get current user's public key by key id | ||||
| func (c *Client) GetPublicKey(keyID int64) (*PublicKey, error) { | ||||
| 	key := new(PublicKey) | ||||
| 	return key, c.getParsedResponse("GET", fmt.Sprintf("/user/keys/%d", keyID), nil, nil, &key) | ||||
| } | ||||
|  | ||||
| // CreatePublicKey create public key with options | ||||
| func (c *Client) CreatePublicKey(opt CreateKeyOption) (*PublicKey, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	key := new(PublicKey) | ||||
| 	return key, c.getParsedResponse("POST", "/user/keys", jsonHeader, bytes.NewReader(body), key) | ||||
| } | ||||
|  | ||||
| // DeletePublicKey delete public key with key id | ||||
| func (c *Client) DeletePublicKey(keyID int64) error { | ||||
| 	_, err := c.getResponse("DELETE", fmt.Sprintf("/user/keys/%d", keyID), nil, nil) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										14
									
								
								vendor/code.gitea.io/sdk/gitea/user_search.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/code.gitea.io/sdk/gitea/user_search.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| package gitea | ||||
|  | ||||
| import "fmt" | ||||
|  | ||||
| type searchUsersResponse struct { | ||||
| 	Users []*User `json:"data"` | ||||
| } | ||||
|  | ||||
| // SearchUsers finds users by query | ||||
| func (c *Client) SearchUsers(query string, limit int) ([]*User, error) { | ||||
| 	resp := new(searchUsersResponse) | ||||
| 	err := c.getParsedResponse("GET", fmt.Sprintf("/users/search?q=%s&limit=%d", query, limit), nil, nil, &resp) | ||||
| 	return resp.Users, err | ||||
| } | ||||
							
								
								
									
										26
									
								
								vendor/code.gitea.io/sdk/gitea/utils.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/code.gitea.io/sdk/gitea/utils.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| // Copyright 2015 The Gogs 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 gitea | ||||
|  | ||||
| import ( | ||||
| 	"net/http" | ||||
| ) | ||||
|  | ||||
| var jsonHeader = http.Header{"content-type": []string{"application/json"}} | ||||
|  | ||||
| // Bool return address of bool value | ||||
| func Bool(v bool) *bool { | ||||
| 	return &v | ||||
| } | ||||
|  | ||||
| // String return address of string value | ||||
| func String(v string) *string { | ||||
| 	return &v | ||||
| } | ||||
|  | ||||
| // Int64 return address of int64 value | ||||
| func Int64(v int64) *int64 { | ||||
| 	return &v | ||||
| } | ||||
							
								
								
									
										9
									
								
								vendor/github.com/go-gitea/yaml/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/go-gitea/yaml/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| language: go | ||||
|  | ||||
| go: | ||||
|     - 1.4 | ||||
|     - 1.5 | ||||
|     - 1.6 | ||||
|     - tip | ||||
|  | ||||
| go_import_path: gopkg.in/yaml.v2 | ||||
							
								
								
									
										201
									
								
								vendor/github.com/go-gitea/yaml/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								vendor/github.com/go-gitea/yaml/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "{}" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright {yyyy} {name of copyright owner} | ||||
|  | ||||
|    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-gitea/yaml/LICENSE.libyaml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/go-gitea/yaml/LICENSE.libyaml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| 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. | ||||
							
								
								
									
										133
									
								
								vendor/github.com/go-gitea/yaml/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								vendor/github.com/go-gitea/yaml/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,133 @@ | ||||
| # 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 | ||||
| ------- | ||||
|  | ||||
| Some more examples can be found in the "examples" folder. | ||||
|  | ||||
| ```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-gitea/yaml/apic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										742
									
								
								vendor/github.com/go-gitea/yaml/apic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,742 @@ | ||||
| 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 | ||||
| //} | ||||
| // | ||||
| // | ||||
							
								
								
									
										685
									
								
								vendor/github.com/go-gitea/yaml/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										685
									
								
								vendor/github.com/go-gitea/yaml/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,685 @@ | ||||
| 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 | ||||
| 	strict  bool | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	mapItemType    = reflect.TypeOf(MapItem{}) | ||||
| 	durationType   = reflect.TypeOf(time.Duration(0)) | ||||
| 	defaultMapType = reflect.TypeOf(map[interface{}]interface{}{}) | ||||
| 	ifaceType      = defaultMapType.Elem() | ||||
| ) | ||||
|  | ||||
| func newDecoder(strict bool) *decoder { | ||||
| 	d := &decoder{mapType: defaultMapType, strict: strict} | ||||
| 	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) | ||||
| 		} else if d.strict { | ||||
| 			d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in struct %s", n.line+1, name.String(), out.Type())) | ||||
| 		} | ||||
| 	} | ||||
| 	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-gitea/yaml/emitterc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1684
									
								
								vendor/github.com/go-gitea/yaml/emitterc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										306
									
								
								vendor/github.com/go-gitea/yaml/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								vendor/github.com/go-gitea/yaml/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,306 @@ | ||||
| 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-gitea/yaml/parserc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1095
									
								
								vendor/github.com/go-gitea/yaml/parserc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										394
									
								
								vendor/github.com/go-gitea/yaml/readerc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										394
									
								
								vendor/github.com/go-gitea/yaml/readerc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,394 @@ | ||||
| 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-gitea/yaml/resolve.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										208
									
								
								vendor/github.com/go-gitea/yaml/resolve.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,208 @@ | ||||
| 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]) | ||||
| } | ||||
							
								
								
									
										2711
									
								
								vendor/github.com/go-gitea/yaml/scannerc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2711
									
								
								vendor/github.com/go-gitea/yaml/scannerc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										104
									
								
								vendor/github.com/go-gitea/yaml/sorter.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								vendor/github.com/go-gitea/yaml/sorter.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | ||||
| 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-gitea/yaml/writerc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								vendor/github.com/go-gitea/yaml/writerc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| 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 | ||||
| } | ||||
							
								
								
									
										357
									
								
								vendor/github.com/go-gitea/yaml/yaml.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										357
									
								
								vendor/github.com/go-gitea/yaml/yaml.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,357 @@ | ||||
| // 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) { | ||||
| 	return unmarshal(in, out, false) | ||||
| } | ||||
|  | ||||
| // UnmarshalStrict is like Unmarshal except that any fields that are found | ||||
| // in the data that do not have corresponding struct members will result in | ||||
| // an error. | ||||
| func UnmarshalStrict(in []byte, out interface{}) (err error) { | ||||
| 	return unmarshal(in, out, true) | ||||
| } | ||||
|  | ||||
| func unmarshal(in []byte, out interface{}, strict bool) (err error) { | ||||
| 	defer handleErr(&err) | ||||
| 	d := newDecoder(strict) | ||||
| 	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-gitea/yaml/yamlh.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										716
									
								
								vendor/github.com/go-gitea/yaml/yamlh.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,716 @@ | ||||
| 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 occurred. | ||||
| 	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-gitea/yaml/yamlprivateh.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								vendor/github.com/go-gitea/yaml/yamlprivateh.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,173 @@ | ||||
| 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 | ||||
|  | ||||
| } | ||||
							
								
								
									
										28
									
								
								vendor/github.com/src-d/gcfg/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/src-d/gcfg/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go | ||||
| 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. | ||||
							
								
								
									
										4
									
								
								vendor/github.com/src-d/gcfg/README
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/src-d/gcfg/README
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| Gcfg reads INI-style configuration files into Go structs; | ||||
| supports user-defined types and subsections. | ||||
|  | ||||
| Package docs: https://godoc.org/gopkg.in/gcfg.v1 | ||||
							
								
								
									
										145
									
								
								vendor/github.com/src-d/gcfg/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								vendor/github.com/src-d/gcfg/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| // Package gcfg reads "INI-style" text-based configuration files with | ||||
| // "name=value" pairs grouped into sections (gcfg files). | ||||
| // | ||||
| // This package is still a work in progress; see the sections below for planned | ||||
| // changes. | ||||
| // | ||||
| // Syntax | ||||
| // | ||||
| // The syntax is based on that used by git config: | ||||
| // http://git-scm.com/docs/git-config#_syntax . | ||||
| // There are some (planned) differences compared to the git config format: | ||||
| //  - improve data portability: | ||||
| //    - must be encoded in UTF-8 (for now) and must not contain the 0 byte | ||||
| //    - include and "path" type is not supported | ||||
| //      (path type may be implementable as a user-defined type) | ||||
| //  - internationalization | ||||
| //    - section and variable names can contain unicode letters, unicode digits | ||||
| //      (as defined in http://golang.org/ref/spec#Characters ) and hyphens | ||||
| //      (U+002D), starting with a unicode letter | ||||
| //  - disallow potentially ambiguous or misleading definitions: | ||||
| //    - `[sec.sub]` format is not allowed (deprecated in gitconfig) | ||||
| //    - `[sec ""]` is not allowed | ||||
| //      - use `[sec]` for section name "sec" and empty subsection name | ||||
| //    - (planned) within a single file, definitions must be contiguous for each: | ||||
| //      - section: '[secA]' -> '[secB]' -> '[secA]' is an error | ||||
| //      - subsection: '[sec "A"]' -> '[sec "B"]' -> '[sec "A"]' is an error | ||||
| //      - multivalued variable: 'multi=a' -> 'other=x' -> 'multi=b' is an error | ||||
| // | ||||
| // Data structure | ||||
| // | ||||
| // The functions in this package read values into a user-defined struct. | ||||
| // Each section corresponds to a struct field in the config struct, and each | ||||
| // variable in a section corresponds to a data field in the section struct. | ||||
| // The mapping of each section or variable name to fields is done either based | ||||
| // on the "gcfg" struct tag or by matching the name of the section or variable, | ||||
| // ignoring case. In the latter case, hyphens '-' in section and variable names | ||||
| // correspond to underscores '_' in field names. | ||||
| // Fields must be exported; to use a section or variable name starting with a | ||||
| // letter that is neither upper- or lower-case, prefix the field name with 'X'. | ||||
| // (See https://code.google.com/p/go/issues/detail?id=5763#c4 .) | ||||
| // | ||||
| // For sections with subsections, the corresponding field in config must be a | ||||
| // map, rather than a struct, with string keys and pointer-to-struct values. | ||||
| // Values for subsection variables are stored in the map with the subsection | ||||
| // name used as the map key. | ||||
| // (Note that unlike section and variable names, subsection names are case | ||||
| // sensitive.) | ||||
| // When using a map, and there is a section with the same section name but | ||||
| // without a subsection name, its values are stored with the empty string used | ||||
| // as the key. | ||||
| // It is possible to provide default values for subsections in the section | ||||
| // "default-<sectionname>" (or by setting values in the corresponding struct | ||||
| // field "Default_<sectionname>"). | ||||
| // | ||||
| // The functions in this package panic if config is not a pointer to a struct, | ||||
| // or when a field is not of a suitable type (either a struct or a map with | ||||
| // string keys and pointer-to-struct values). | ||||
| // | ||||
| // Parsing of values | ||||
| // | ||||
| // The section structs in the config struct may contain single-valued or | ||||
| // multi-valued variables. Variables of unnamed slice type (that is, a type | ||||
| // starting with `[]`) are treated as multi-value; all others (including named | ||||
| // slice types) are treated as single-valued variables. | ||||
| // | ||||
| // Single-valued variables are handled based on the type as follows. | ||||
| // Unnamed pointer types (that is, types starting with `*`) are dereferenced, | ||||
| // and if necessary, a new instance is allocated. | ||||
| // | ||||
| // For types implementing the encoding.TextUnmarshaler interface, the | ||||
| // UnmarshalText method is used to set the value. Implementing this method is | ||||
| // the recommended way for parsing user-defined types. | ||||
| // | ||||
| // For fields of string kind, the value string is assigned to the field, after | ||||
| // unquoting and unescaping as needed. | ||||
| // For fields of bool kind, the field is set to true if the value is "true", | ||||
| // "yes", "on" or "1", and set to false if the value is "false", "no", "off" or | ||||
| // "0", ignoring case. In addition, single-valued bool fields can be specified | ||||
| // with a "blank" value (variable name without equals sign and value); in such | ||||
| // case the value is set to true. | ||||
| // | ||||
| // Predefined integer types [u]int(|8|16|32|64) and big.Int are parsed as | ||||
| // decimal or hexadecimal (if having '0x' prefix). (This is to prevent | ||||
| // unintuitively handling zero-padded numbers as octal.) Other types having | ||||
| // [u]int* as the underlying type, such as os.FileMode and uintptr allow | ||||
| // decimal, hexadecimal, or octal values. | ||||
| // Parsing mode for integer types can be overridden using the struct tag option | ||||
| // ",int=mode" where mode is a combination of the 'd', 'h', and 'o' characters | ||||
| // (each standing for decimal, hexadecimal, and octal, respectively.) | ||||
| // | ||||
| // All other types are parsed using fmt.Sscanf with the "%v" verb. | ||||
| // | ||||
| // For multi-valued variables, each individual value is parsed as above and | ||||
| // appended to the slice. If the first value is specified as a "blank" value | ||||
| // (variable name without equals sign and value), a new slice is allocated; | ||||
| // that is any values previously set in the slice will be ignored. | ||||
| // | ||||
| // The types subpackage for provides helpers for parsing "enum-like" and integer | ||||
| // types. | ||||
| // | ||||
| // Error handling | ||||
| // | ||||
| // There are 3 types of errors: | ||||
| // | ||||
| //  - programmer errors / panics: | ||||
| //    - invalid configuration structure | ||||
| //  - data errors: | ||||
| //    - fatal errors: | ||||
| //      - invalid configuration syntax | ||||
| //    - warnings: | ||||
| //      - data that doesn't belong to any part of the config structure | ||||
| // | ||||
| // Programmer errors trigger panics. These are should be fixed by the programmer | ||||
| // before releasing code that uses gcfg. | ||||
| // | ||||
| // Data errors cause gcfg to return a non-nil error value. This includes the | ||||
| // case when there are extra unknown key-value definitions in the configuration | ||||
| // data (extra data). | ||||
| // However, in some occasions it is desirable to be able to proceed in | ||||
| // situations when the only data error is that of extra data. | ||||
| // These errors are handled at a different (warning) priority and can be | ||||
| // filtered out programmatically. To ignore extra data warnings, wrap the | ||||
| // gcfg.Read*Into invocation into a call to gcfg.FatalOnly. | ||||
| // | ||||
| // TODO | ||||
| // | ||||
| // The following is a list of changes under consideration: | ||||
| //  - documentation | ||||
| //    - self-contained syntax documentation | ||||
| //    - more practical examples | ||||
| //    - move TODOs to issue tracker (eventually) | ||||
| //  - syntax | ||||
| //    - reconsider valid escape sequences | ||||
| //      (gitconfig doesn't support \r in value, \t in subsection name, etc.) | ||||
| //  - reading / parsing gcfg files | ||||
| //    - define internal representation structure | ||||
| //    - support multiple inputs (readers, strings, files) | ||||
| //    - support declaring encoding (?) | ||||
| //    - support varying fields sets for subsections (?) | ||||
| //  - writing gcfg files | ||||
| //  - error handling | ||||
| //    - make error context accessible programmatically? | ||||
| //    - limit input size? | ||||
| // | ||||
| package gcfg // import "github.com/src-d/gcfg" | ||||
							
								
								
									
										41
									
								
								vendor/github.com/src-d/gcfg/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/src-d/gcfg/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| package gcfg | ||||
|  | ||||
| import ( | ||||
| 	"gopkg.in/warnings.v0" | ||||
| ) | ||||
|  | ||||
| // FatalOnly filters the results of a Read*Into invocation and returns only | ||||
| // fatal errors. That is, errors (warnings) indicating data for unknown | ||||
| // sections / variables is ignored. Example invocation: | ||||
| // | ||||
| //  err := gcfg.FatalOnly(gcfg.ReadFileInto(&cfg, configFile)) | ||||
| //  if err != nil { | ||||
| //      ... | ||||
| // | ||||
| func FatalOnly(err error) error { | ||||
| 	return warnings.FatalOnly(err) | ||||
| } | ||||
|  | ||||
| func isFatal(err error) bool { | ||||
| 	_, ok := err.(extraData) | ||||
| 	return !ok | ||||
| } | ||||
|  | ||||
| type extraData struct { | ||||
| 	section    string | ||||
| 	subsection *string | ||||
| 	variable   *string | ||||
| } | ||||
|  | ||||
| func (e extraData) Error() string { | ||||
| 	s := "can't store data at section \"" + e.section + "\"" | ||||
| 	if e.subsection != nil { | ||||
| 		s += ", subsection \"" + *e.subsection + "\"" | ||||
| 	} | ||||
| 	if e.variable != nil { | ||||
| 		s += ", variable \"" + *e.variable + "\"" | ||||
| 	} | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| var _ error = extraData{} | ||||
							
								
								
									
										7
									
								
								vendor/github.com/src-d/gcfg/go1_0.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/src-d/gcfg/go1_0.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| // +build !go1.2 | ||||
|  | ||||
| package gcfg | ||||
|  | ||||
| type textUnmarshaler interface { | ||||
| 	UnmarshalText(text []byte) error | ||||
| } | ||||
							
								
								
									
										9
									
								
								vendor/github.com/src-d/gcfg/go1_2.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/src-d/gcfg/go1_2.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| // +build go1.2 | ||||
|  | ||||
| package gcfg | ||||
|  | ||||
| import ( | ||||
| 	"encoding" | ||||
| ) | ||||
|  | ||||
| type textUnmarshaler encoding.TextUnmarshaler | ||||
							
								
								
									
										273
									
								
								vendor/github.com/src-d/gcfg/read.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										273
									
								
								vendor/github.com/src-d/gcfg/read.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,273 @@ | ||||
| package gcfg | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/src-d/gcfg/scanner" | ||||
| 	"github.com/src-d/gcfg/token" | ||||
| 	"gopkg.in/warnings.v0" | ||||
| ) | ||||
|  | ||||
| var unescape = map[rune]rune{'\\': '\\', '"': '"', 'n': '\n', 't': '\t', 'b': '\b'} | ||||
|  | ||||
| // no error: invalid literals should be caught by scanner | ||||
| func unquote(s string) string { | ||||
| 	u, q, esc := make([]rune, 0, len(s)), false, false | ||||
| 	for _, c := range s { | ||||
| 		if esc { | ||||
| 			uc, ok := unescape[c] | ||||
| 			switch { | ||||
| 			case ok: | ||||
| 				u = append(u, uc) | ||||
| 				fallthrough | ||||
| 			case !q && c == '\n': | ||||
| 				esc = false | ||||
| 				continue | ||||
| 			} | ||||
| 			panic("invalid escape sequence") | ||||
| 		} | ||||
| 		switch c { | ||||
| 		case '"': | ||||
| 			q = !q | ||||
| 		case '\\': | ||||
| 			esc = true | ||||
| 		default: | ||||
| 			u = append(u, c) | ||||
| 		} | ||||
| 	} | ||||
| 	if q { | ||||
| 		panic("missing end quote") | ||||
| 	} | ||||
| 	if esc { | ||||
| 		panic("invalid escape sequence") | ||||
| 	} | ||||
| 	return string(u) | ||||
| } | ||||
|  | ||||
| func read(c *warnings.Collector, callback func(string, string, string, string, bool) error, | ||||
| 	fset *token.FileSet, file *token.File, src []byte) error { | ||||
| 	// | ||||
| 	var s scanner.Scanner | ||||
| 	var errs scanner.ErrorList | ||||
| 	s.Init(file, src, func(p token.Position, m string) { errs.Add(p, m) }, 0) | ||||
| 	sect, sectsub := "", "" | ||||
| 	pos, tok, lit := s.Scan() | ||||
| 	errfn := func(msg string) error { | ||||
| 		return fmt.Errorf("%s: %s", fset.Position(pos), msg) | ||||
| 	} | ||||
| 	for { | ||||
| 		if errs.Len() > 0 { | ||||
| 			if err := c.Collect(errs.Err()); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		switch tok { | ||||
| 		case token.EOF: | ||||
| 			return nil | ||||
| 		case token.EOL, token.COMMENT: | ||||
| 			pos, tok, lit = s.Scan() | ||||
| 		case token.LBRACK: | ||||
| 			pos, tok, lit = s.Scan() | ||||
| 			if errs.Len() > 0 { | ||||
| 				if err := c.Collect(errs.Err()); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 			if tok != token.IDENT { | ||||
| 				if err := c.Collect(errfn("expected section name")); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 			sect, sectsub = lit, "" | ||||
| 			pos, tok, lit = s.Scan() | ||||
| 			if errs.Len() > 0 { | ||||
| 				if err := c.Collect(errs.Err()); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 			if tok == token.STRING { | ||||
| 				sectsub = unquote(lit) | ||||
| 				if sectsub == "" { | ||||
| 					if err := c.Collect(errfn("empty subsection name")); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 				pos, tok, lit = s.Scan() | ||||
| 				if errs.Len() > 0 { | ||||
| 					if err := c.Collect(errs.Err()); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			if tok != token.RBRACK { | ||||
| 				if sectsub == "" { | ||||
| 					if err := c.Collect(errfn("expected subsection name or right bracket")); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 				if err := c.Collect(errfn("expected right bracket")); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 			pos, tok, lit = s.Scan() | ||||
| 			if tok != token.EOL && tok != token.EOF && tok != token.COMMENT { | ||||
| 				if err := c.Collect(errfn("expected EOL, EOF, or comment")); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 			// If a section/subsection header was found, ensure a | ||||
| 			// container object is created, even if there are no | ||||
| 			// variables further down. | ||||
| 			err := c.Collect(callback(sect, sectsub, "", "", true)) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		case token.IDENT: | ||||
| 			if sect == "" { | ||||
| 				if err := c.Collect(errfn("expected section header")); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 			n := lit | ||||
| 			pos, tok, lit = s.Scan() | ||||
| 			if errs.Len() > 0 { | ||||
| 				return errs.Err() | ||||
| 			} | ||||
| 			blank, v := tok == token.EOF || tok == token.EOL || tok == token.COMMENT, "" | ||||
| 			if !blank { | ||||
| 				if tok != token.ASSIGN { | ||||
| 					if err := c.Collect(errfn("expected '='")); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 				pos, tok, lit = s.Scan() | ||||
| 				if errs.Len() > 0 { | ||||
| 					if err := c.Collect(errs.Err()); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 				if tok != token.STRING { | ||||
| 					if err := c.Collect(errfn("expected value")); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 				v = unquote(lit) | ||||
| 				pos, tok, lit = s.Scan() | ||||
| 				if errs.Len() > 0 { | ||||
| 					if err := c.Collect(errs.Err()); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 				if tok != token.EOL && tok != token.EOF && tok != token.COMMENT { | ||||
| 					if err := c.Collect(errfn("expected EOL, EOF, or comment")); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			err := c.Collect(callback(sect, sectsub, n, v, blank)) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		default: | ||||
| 			if sect == "" { | ||||
| 				if err := c.Collect(errfn("expected section header")); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 			if err := c.Collect(errfn("expected section header or variable declaration")); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	panic("never reached") | ||||
| } | ||||
|  | ||||
| func readInto(config interface{}, fset *token.FileSet, file *token.File, | ||||
| 	src []byte) error { | ||||
| 	// | ||||
| 	c := warnings.NewCollector(isFatal) | ||||
| 	firstPassCallback := func(s string, ss string, k string, v string, bv bool) error { | ||||
| 		return set(c, config, s, ss, k, v, bv, false) | ||||
| 	} | ||||
| 	err := read(c, firstPassCallback, fset, file, src) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	secondPassCallback := func(s string, ss string, k string, v string, bv bool) error { | ||||
| 		return set(c, config, s, ss, k, v, bv, true) | ||||
| 	} | ||||
| 	err = read(c, secondPassCallback, fset, file, src) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return c.Done() | ||||
| } | ||||
|  | ||||
| // ReadWithCallback reads gcfg formatted data from reader and calls | ||||
| // callback with each section and option found. | ||||
| // | ||||
| // Callback is called with section, subsection, option key, option value | ||||
| // and blank value flag as arguments. | ||||
| // | ||||
| // When a section is found, callback is called with nil subsection, option key | ||||
| // and option value. | ||||
| // | ||||
| // When a subsection is found, callback is called with nil option key and | ||||
| // option value. | ||||
| // | ||||
| // If blank value flag is true, it means that the value was not set for an option | ||||
| // (as opposed to set to empty string). | ||||
| // | ||||
| // If callback returns an error, ReadWithCallback terminates with an error too. | ||||
| func ReadWithCallback(reader io.Reader, callback func(string, string, string, string, bool) error) error { | ||||
| 	src, err := ioutil.ReadAll(reader) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	fset := token.NewFileSet() | ||||
| 	file := fset.AddFile("", fset.Base(), len(src)) | ||||
| 	c := warnings.NewCollector(isFatal) | ||||
|  | ||||
| 	return read(c, callback, fset, file, src) | ||||
| } | ||||
|  | ||||
| // ReadInto reads gcfg formatted data from reader and sets the values into the | ||||
| // corresponding fields in config. | ||||
| func ReadInto(config interface{}, reader io.Reader) error { | ||||
| 	src, err := ioutil.ReadAll(reader) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	fset := token.NewFileSet() | ||||
| 	file := fset.AddFile("", fset.Base(), len(src)) | ||||
| 	return readInto(config, fset, file, src) | ||||
| } | ||||
|  | ||||
| // ReadStringInto reads gcfg formatted data from str and sets the values into | ||||
| // the corresponding fields in config. | ||||
| func ReadStringInto(config interface{}, str string) error { | ||||
| 	r := strings.NewReader(str) | ||||
| 	return ReadInto(config, r) | ||||
| } | ||||
|  | ||||
| // ReadFileInto reads gcfg formatted data from the file filename and sets the | ||||
| // values into the corresponding fields in config. | ||||
| func ReadFileInto(config interface{}, filename string) error { | ||||
| 	f, err := os.Open(filename) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer f.Close() | ||||
| 	src, err := ioutil.ReadAll(f) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	fset := token.NewFileSet() | ||||
| 	file := fset.AddFile(filename, fset.Base(), len(src)) | ||||
| 	return readInto(config, fset, file, src) | ||||
| } | ||||
							
								
								
									
										121
									
								
								vendor/github.com/src-d/gcfg/scanner/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								vendor/github.com/src-d/gcfg/scanner/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| // Copyright 2009 The Go 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 scanner | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"sort" | ||||
| ) | ||||
|  | ||||
| import ( | ||||
| 	"github.com/src-d/gcfg/token" | ||||
| ) | ||||
|  | ||||
| // In an ErrorList, an error is represented by an *Error. | ||||
| // The position Pos, if valid, points to the beginning of | ||||
| // the offending token, and the error condition is described | ||||
| // by Msg. | ||||
| // | ||||
| type Error struct { | ||||
| 	Pos token.Position | ||||
| 	Msg string | ||||
| } | ||||
|  | ||||
| // Error implements the error interface. | ||||
| func (e Error) Error() string { | ||||
| 	if e.Pos.Filename != "" || e.Pos.IsValid() { | ||||
| 		// don't print "<unknown position>" | ||||
| 		// TODO(gri) reconsider the semantics of Position.IsValid | ||||
| 		return e.Pos.String() + ": " + e.Msg | ||||
| 	} | ||||
| 	return e.Msg | ||||
| } | ||||
|  | ||||
| // ErrorList is a list of *Errors. | ||||
| // The zero value for an ErrorList is an empty ErrorList ready to use. | ||||
| // | ||||
| type ErrorList []*Error | ||||
|  | ||||
| // Add adds an Error with given position and error message to an ErrorList. | ||||
| func (p *ErrorList) Add(pos token.Position, msg string) { | ||||
| 	*p = append(*p, &Error{pos, msg}) | ||||
| } | ||||
|  | ||||
| // Reset resets an ErrorList to no errors. | ||||
| func (p *ErrorList) Reset() { *p = (*p)[0:0] } | ||||
|  | ||||
| // ErrorList implements the sort Interface. | ||||
| func (p ErrorList) Len() int      { return len(p) } | ||||
| func (p ErrorList) Swap(i, j int) { p[i], p[j] = p[j], p[i] } | ||||
|  | ||||
| func (p ErrorList) Less(i, j int) bool { | ||||
| 	e := &p[i].Pos | ||||
| 	f := &p[j].Pos | ||||
| 	if e.Filename < f.Filename { | ||||
| 		return true | ||||
| 	} | ||||
| 	if e.Filename == f.Filename { | ||||
| 		return e.Offset < f.Offset | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // Sort sorts an ErrorList. *Error entries are sorted by position, | ||||
| // other errors are sorted by error message, and before any *Error | ||||
| // entry. | ||||
| // | ||||
| func (p ErrorList) Sort() { | ||||
| 	sort.Sort(p) | ||||
| } | ||||
|  | ||||
| // RemoveMultiples sorts an ErrorList and removes all but the first error per line. | ||||
| func (p *ErrorList) RemoveMultiples() { | ||||
| 	sort.Sort(p) | ||||
| 	var last token.Position // initial last.Line is != any legal error line | ||||
| 	i := 0 | ||||
| 	for _, e := range *p { | ||||
| 		if e.Pos.Filename != last.Filename || e.Pos.Line != last.Line { | ||||
| 			last = e.Pos | ||||
| 			(*p)[i] = e | ||||
| 			i++ | ||||
| 		} | ||||
| 	} | ||||
| 	(*p) = (*p)[0:i] | ||||
| } | ||||
|  | ||||
| // An ErrorList implements the error interface. | ||||
| func (p ErrorList) Error() string { | ||||
| 	switch len(p) { | ||||
| 	case 0: | ||||
| 		return "no errors" | ||||
| 	case 1: | ||||
| 		return p[0].Error() | ||||
| 	} | ||||
| 	return fmt.Sprintf("%s (and %d more errors)", p[0], len(p)-1) | ||||
| } | ||||
|  | ||||
| // Err returns an error equivalent to this error list. | ||||
| // If the list is empty, Err returns nil. | ||||
| func (p ErrorList) Err() error { | ||||
| 	if len(p) == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| // PrintError is a utility function that prints a list of errors to w, | ||||
| // one error per line, if the err parameter is an ErrorList. Otherwise | ||||
| // it prints the err string. | ||||
| // | ||||
| func PrintError(w io.Writer, err error) { | ||||
| 	if list, ok := err.(ErrorList); ok { | ||||
| 		for _, e := range list { | ||||
| 			fmt.Fprintf(w, "%s\n", e) | ||||
| 		} | ||||
| 	} else if err != nil { | ||||
| 		fmt.Fprintf(w, "%s\n", err) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										342
									
								
								vendor/github.com/src-d/gcfg/scanner/scanner.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										342
									
								
								vendor/github.com/src-d/gcfg/scanner/scanner.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,342 @@ | ||||
| // Copyright 2009 The Go 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 scanner implements a scanner for gcfg configuration text. | ||||
| // It takes a []byte as source which can then be tokenized | ||||
| // through repeated calls to the Scan method. | ||||
| // | ||||
| // Note that the API for the scanner package may change to accommodate new | ||||
| // features or implementation changes in gcfg. | ||||
| // | ||||
| package scanner | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"path/filepath" | ||||
| 	"unicode" | ||||
| 	"unicode/utf8" | ||||
| ) | ||||
|  | ||||
| import ( | ||||
| 	"github.com/src-d/gcfg/token" | ||||
| ) | ||||
|  | ||||
| // An ErrorHandler may be provided to Scanner.Init. If a syntax error is | ||||
| // encountered and a handler was installed, the handler is called with a | ||||
| // position and an error message. The position points to the beginning of | ||||
| // the offending token. | ||||
| // | ||||
| type ErrorHandler func(pos token.Position, msg string) | ||||
|  | ||||
| // A Scanner holds the scanner's internal state while processing | ||||
| // a given text.  It can be allocated as part of another data | ||||
| // structure but must be initialized via Init before use. | ||||
| // | ||||
| type Scanner struct { | ||||
| 	// immutable state | ||||
| 	file *token.File  // source file handle | ||||
| 	dir  string       // directory portion of file.Name() | ||||
| 	src  []byte       // source | ||||
| 	err  ErrorHandler // error reporting; or nil | ||||
| 	mode Mode         // scanning mode | ||||
|  | ||||
| 	// scanning state | ||||
| 	ch         rune // current character | ||||
| 	offset     int  // character offset | ||||
| 	rdOffset   int  // reading offset (position after current character) | ||||
| 	lineOffset int  // current line offset | ||||
| 	nextVal    bool // next token is expected to be a value | ||||
|  | ||||
| 	// public state - ok to modify | ||||
| 	ErrorCount int // number of errors encountered | ||||
| } | ||||
|  | ||||
| // Read the next Unicode char into s.ch. | ||||
| // s.ch < 0 means end-of-file. | ||||
| // | ||||
| func (s *Scanner) next() { | ||||
| 	if s.rdOffset < len(s.src) { | ||||
| 		s.offset = s.rdOffset | ||||
| 		if s.ch == '\n' { | ||||
| 			s.lineOffset = s.offset | ||||
| 			s.file.AddLine(s.offset) | ||||
| 		} | ||||
| 		r, w := rune(s.src[s.rdOffset]), 1 | ||||
| 		switch { | ||||
| 		case r == 0: | ||||
| 			s.error(s.offset, "illegal character NUL") | ||||
| 		case r >= 0x80: | ||||
| 			// not ASCII | ||||
| 			r, w = utf8.DecodeRune(s.src[s.rdOffset:]) | ||||
| 			if r == utf8.RuneError && w == 1 { | ||||
| 				s.error(s.offset, "illegal UTF-8 encoding") | ||||
| 			} | ||||
| 		} | ||||
| 		s.rdOffset += w | ||||
| 		s.ch = r | ||||
| 	} else { | ||||
| 		s.offset = len(s.src) | ||||
| 		if s.ch == '\n' { | ||||
| 			s.lineOffset = s.offset | ||||
| 			s.file.AddLine(s.offset) | ||||
| 		} | ||||
| 		s.ch = -1 // eof | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // A mode value is a set of flags (or 0). | ||||
| // They control scanner behavior. | ||||
| // | ||||
| type Mode uint | ||||
|  | ||||
| const ( | ||||
| 	ScanComments Mode = 1 << iota // return comments as COMMENT tokens | ||||
| ) | ||||
|  | ||||
| // Init prepares the scanner s to tokenize the text src by setting the | ||||
| // scanner at the beginning of src. The scanner uses the file set file | ||||
| // for position information and it adds line information for each line. | ||||
| // It is ok to re-use the same file when re-scanning the same file as | ||||
| // line information which is already present is ignored. Init causes a | ||||
| // panic if the file size does not match the src size. | ||||
| // | ||||
| // Calls to Scan will invoke the error handler err if they encounter a | ||||
| // syntax error and err is not nil. Also, for each error encountered, | ||||
| // the Scanner field ErrorCount is incremented by one. The mode parameter | ||||
| // determines how comments are handled. | ||||
| // | ||||
| // Note that Init may call err if there is an error in the first character | ||||
| // of the file. | ||||
| // | ||||
| func (s *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode Mode) { | ||||
| 	// Explicitly initialize all fields since a scanner may be reused. | ||||
| 	if file.Size() != len(src) { | ||||
| 		panic(fmt.Sprintf("file size (%d) does not match src len (%d)", file.Size(), len(src))) | ||||
| 	} | ||||
| 	s.file = file | ||||
| 	s.dir, _ = filepath.Split(file.Name()) | ||||
| 	s.src = src | ||||
| 	s.err = err | ||||
| 	s.mode = mode | ||||
|  | ||||
| 	s.ch = ' ' | ||||
| 	s.offset = 0 | ||||
| 	s.rdOffset = 0 | ||||
| 	s.lineOffset = 0 | ||||
| 	s.ErrorCount = 0 | ||||
| 	s.nextVal = false | ||||
|  | ||||
| 	s.next() | ||||
| } | ||||
|  | ||||
| func (s *Scanner) error(offs int, msg string) { | ||||
| 	if s.err != nil { | ||||
| 		s.err(s.file.Position(s.file.Pos(offs)), msg) | ||||
| 	} | ||||
| 	s.ErrorCount++ | ||||
| } | ||||
|  | ||||
| func (s *Scanner) scanComment() string { | ||||
| 	// initial [;#] already consumed | ||||
| 	offs := s.offset - 1 // position of initial [;#] | ||||
|  | ||||
| 	for s.ch != '\n' && s.ch >= 0 { | ||||
| 		s.next() | ||||
| 	} | ||||
| 	return string(s.src[offs:s.offset]) | ||||
| } | ||||
|  | ||||
| func isLetter(ch rune) bool { | ||||
| 	return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch >= 0x80 && unicode.IsLetter(ch) | ||||
| } | ||||
|  | ||||
| func isDigit(ch rune) bool { | ||||
| 	return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) | ||||
| } | ||||
|  | ||||
| func (s *Scanner) scanIdentifier() string { | ||||
| 	offs := s.offset | ||||
| 	for isLetter(s.ch) || isDigit(s.ch) || s.ch == '-' { | ||||
| 		s.next() | ||||
| 	} | ||||
| 	return string(s.src[offs:s.offset]) | ||||
| } | ||||
|  | ||||
| func (s *Scanner) scanEscape(val bool) { | ||||
| 	offs := s.offset | ||||
| 	ch := s.ch | ||||
| 	s.next() // always make progress | ||||
| 	switch ch { | ||||
| 	case '\\', '"': | ||||
| 		// ok | ||||
| 	case 'n', 't', 'b': | ||||
| 		if val { | ||||
| 			break // ok | ||||
| 		} | ||||
| 		fallthrough | ||||
| 	default: | ||||
| 		s.error(offs, "unknown escape sequence") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (s *Scanner) scanString() string { | ||||
| 	// '"' opening already consumed | ||||
| 	offs := s.offset - 1 | ||||
|  | ||||
| 	for s.ch != '"' { | ||||
| 		ch := s.ch | ||||
| 		s.next() | ||||
| 		if ch == '\n' || ch < 0 { | ||||
| 			s.error(offs, "string not terminated") | ||||
| 			break | ||||
| 		} | ||||
| 		if ch == '\\' { | ||||
| 			s.scanEscape(false) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	s.next() | ||||
|  | ||||
| 	return string(s.src[offs:s.offset]) | ||||
| } | ||||
|  | ||||
| func stripCR(b []byte) []byte { | ||||
| 	c := make([]byte, len(b)) | ||||
| 	i := 0 | ||||
| 	for _, ch := range b { | ||||
| 		if ch != '\r' { | ||||
| 			c[i] = ch | ||||
| 			i++ | ||||
| 		} | ||||
| 	} | ||||
| 	return c[:i] | ||||
| } | ||||
|  | ||||
| func (s *Scanner) scanValString() string { | ||||
| 	offs := s.offset | ||||
|  | ||||
| 	hasCR := false | ||||
| 	end := offs | ||||
| 	inQuote := false | ||||
| loop: | ||||
| 	for inQuote || s.ch >= 0 && s.ch != '\n' && s.ch != ';' && s.ch != '#' { | ||||
| 		ch := s.ch | ||||
| 		s.next() | ||||
| 		switch { | ||||
| 		case inQuote && ch == '\\': | ||||
| 			s.scanEscape(true) | ||||
| 		case !inQuote && ch == '\\': | ||||
| 			if s.ch == '\r' { | ||||
| 				hasCR = true | ||||
| 				s.next() | ||||
| 			} | ||||
| 			if s.ch != '\n' { | ||||
| 				s.scanEscape(true) | ||||
| 			} else { | ||||
| 				s.next() | ||||
| 			} | ||||
| 		case ch == '"': | ||||
| 			inQuote = !inQuote | ||||
| 		case ch == '\r': | ||||
| 			hasCR = true | ||||
| 		case ch < 0 || inQuote && ch == '\n': | ||||
| 			s.error(offs, "string not terminated") | ||||
| 			break loop | ||||
| 		} | ||||
| 		if inQuote || !isWhiteSpace(ch) { | ||||
| 			end = s.offset | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	lit := s.src[offs:end] | ||||
| 	if hasCR { | ||||
| 		lit = stripCR(lit) | ||||
| 	} | ||||
|  | ||||
| 	return string(lit) | ||||
| } | ||||
|  | ||||
| func isWhiteSpace(ch rune) bool { | ||||
| 	return ch == ' ' || ch == '\t' || ch == '\r' | ||||
| } | ||||
|  | ||||
| func (s *Scanner) skipWhitespace() { | ||||
| 	for isWhiteSpace(s.ch) { | ||||
| 		s.next() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Scan scans the next token and returns the token position, the token, | ||||
| // and its literal string if applicable. The source end is indicated by | ||||
| // token.EOF. | ||||
| // | ||||
| // If the returned token is a literal (token.IDENT, token.STRING) or | ||||
| // token.COMMENT, the literal string has the corresponding value. | ||||
| // | ||||
| // If the returned token is token.ILLEGAL, the literal string is the | ||||
| // offending character. | ||||
| // | ||||
| // In all other cases, Scan returns an empty literal string. | ||||
| // | ||||
| // For more tolerant parsing, Scan will return a valid token if | ||||
| // possible even if a syntax error was encountered. Thus, even | ||||
| // if the resulting token sequence contains no illegal tokens, | ||||
| // a client may not assume that no error occurred. Instead it | ||||
| // must check the scanner's ErrorCount or the number of calls | ||||
| // of the error handler, if there was one installed. | ||||
| // | ||||
| // Scan adds line information to the file added to the file | ||||
| // set with Init. Token positions are relative to that file | ||||
| // and thus relative to the file set. | ||||
| // | ||||
| func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string) { | ||||
| scanAgain: | ||||
| 	s.skipWhitespace() | ||||
|  | ||||
| 	// current token start | ||||
| 	pos = s.file.Pos(s.offset) | ||||
|  | ||||
| 	// determine token value | ||||
| 	switch ch := s.ch; { | ||||
| 	case s.nextVal: | ||||
| 		lit = s.scanValString() | ||||
| 		tok = token.STRING | ||||
| 		s.nextVal = false | ||||
| 	case isLetter(ch): | ||||
| 		lit = s.scanIdentifier() | ||||
| 		tok = token.IDENT | ||||
| 	default: | ||||
| 		s.next() // always make progress | ||||
| 		switch ch { | ||||
| 		case -1: | ||||
| 			tok = token.EOF | ||||
| 		case '\n': | ||||
| 			tok = token.EOL | ||||
| 		case '"': | ||||
| 			tok = token.STRING | ||||
| 			lit = s.scanString() | ||||
| 		case '[': | ||||
| 			tok = token.LBRACK | ||||
| 		case ']': | ||||
| 			tok = token.RBRACK | ||||
| 		case ';', '#': | ||||
| 			// comment | ||||
| 			lit = s.scanComment() | ||||
| 			if s.mode&ScanComments == 0 { | ||||
| 				// skip comment | ||||
| 				goto scanAgain | ||||
| 			} | ||||
| 			tok = token.COMMENT | ||||
| 		case '=': | ||||
| 			tok = token.ASSIGN | ||||
| 			s.nextVal = true | ||||
| 		default: | ||||
| 			s.error(s.file.Offset(pos), fmt.Sprintf("illegal character %#U", ch)) | ||||
| 			tok = token.ILLEGAL | ||||
| 			lit = string(ch) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
							
								
								
									
										332
									
								
								vendor/github.com/src-d/gcfg/set.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										332
									
								
								vendor/github.com/src-d/gcfg/set.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,332 @@ | ||||
| package gcfg | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/gob" | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"unicode" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"github.com/src-d/gcfg/types" | ||||
| 	"gopkg.in/warnings.v0" | ||||
| ) | ||||
|  | ||||
| type tag struct { | ||||
| 	ident   string | ||||
| 	intMode string | ||||
| } | ||||
|  | ||||
| func newTag(ts string) tag { | ||||
| 	t := tag{} | ||||
| 	s := strings.Split(ts, ",") | ||||
| 	t.ident = s[0] | ||||
| 	for _, tse := range s[1:] { | ||||
| 		if strings.HasPrefix(tse, "int=") { | ||||
| 			t.intMode = tse[len("int="):] | ||||
| 		} | ||||
| 	} | ||||
| 	return t | ||||
| } | ||||
|  | ||||
| func fieldFold(v reflect.Value, name string) (reflect.Value, tag) { | ||||
| 	var n string | ||||
| 	r0, _ := utf8.DecodeRuneInString(name) | ||||
| 	if unicode.IsLetter(r0) && !unicode.IsLower(r0) && !unicode.IsUpper(r0) { | ||||
| 		n = "X" | ||||
| 	} | ||||
| 	n += strings.Replace(name, "-", "_", -1) | ||||
| 	f, ok := v.Type().FieldByNameFunc(func(fieldName string) bool { | ||||
| 		if !v.FieldByName(fieldName).CanSet() { | ||||
| 			return false | ||||
| 		} | ||||
| 		f, _ := v.Type().FieldByName(fieldName) | ||||
| 		t := newTag(f.Tag.Get("gcfg")) | ||||
| 		if t.ident != "" { | ||||
| 			return strings.EqualFold(t.ident, name) | ||||
| 		} | ||||
| 		return strings.EqualFold(n, fieldName) | ||||
| 	}) | ||||
| 	if !ok { | ||||
| 		return reflect.Value{}, tag{} | ||||
| 	} | ||||
| 	return v.FieldByName(f.Name), newTag(f.Tag.Get("gcfg")) | ||||
| } | ||||
|  | ||||
| type setter func(destp interface{}, blank bool, val string, t tag) error | ||||
|  | ||||
| var errUnsupportedType = fmt.Errorf("unsupported type") | ||||
| var errBlankUnsupported = fmt.Errorf("blank value not supported for type") | ||||
|  | ||||
| var setters = []setter{ | ||||
| 	typeSetter, textUnmarshalerSetter, kindSetter, scanSetter, | ||||
| } | ||||
|  | ||||
| func textUnmarshalerSetter(d interface{}, blank bool, val string, t tag) error { | ||||
| 	dtu, ok := d.(textUnmarshaler) | ||||
| 	if !ok { | ||||
| 		return errUnsupportedType | ||||
| 	} | ||||
| 	if blank { | ||||
| 		return errBlankUnsupported | ||||
| 	} | ||||
| 	return dtu.UnmarshalText([]byte(val)) | ||||
| } | ||||
|  | ||||
| func boolSetter(d interface{}, blank bool, val string, t tag) error { | ||||
| 	if blank { | ||||
| 		reflect.ValueOf(d).Elem().Set(reflect.ValueOf(true)) | ||||
| 		return nil | ||||
| 	} | ||||
| 	b, err := types.ParseBool(val) | ||||
| 	if err == nil { | ||||
| 		reflect.ValueOf(d).Elem().Set(reflect.ValueOf(b)) | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| func intMode(mode string) types.IntMode { | ||||
| 	var m types.IntMode | ||||
| 	if strings.ContainsAny(mode, "dD") { | ||||
| 		m |= types.Dec | ||||
| 	} | ||||
| 	if strings.ContainsAny(mode, "hH") { | ||||
| 		m |= types.Hex | ||||
| 	} | ||||
| 	if strings.ContainsAny(mode, "oO") { | ||||
| 		m |= types.Oct | ||||
| 	} | ||||
| 	return m | ||||
| } | ||||
|  | ||||
| var typeModes = map[reflect.Type]types.IntMode{ | ||||
| 	reflect.TypeOf(int(0)):    types.Dec | types.Hex, | ||||
| 	reflect.TypeOf(int8(0)):   types.Dec | types.Hex, | ||||
| 	reflect.TypeOf(int16(0)):  types.Dec | types.Hex, | ||||
| 	reflect.TypeOf(int32(0)):  types.Dec | types.Hex, | ||||
| 	reflect.TypeOf(int64(0)):  types.Dec | types.Hex, | ||||
| 	reflect.TypeOf(uint(0)):   types.Dec | types.Hex, | ||||
| 	reflect.TypeOf(uint8(0)):  types.Dec | types.Hex, | ||||
| 	reflect.TypeOf(uint16(0)): types.Dec | types.Hex, | ||||
| 	reflect.TypeOf(uint32(0)): types.Dec | types.Hex, | ||||
| 	reflect.TypeOf(uint64(0)): types.Dec | types.Hex, | ||||
| 	// use default mode (allow dec/hex/oct) for uintptr type | ||||
| 	reflect.TypeOf(big.Int{}): types.Dec | types.Hex, | ||||
| } | ||||
|  | ||||
| func intModeDefault(t reflect.Type) types.IntMode { | ||||
| 	m, ok := typeModes[t] | ||||
| 	if !ok { | ||||
| 		m = types.Dec | types.Hex | types.Oct | ||||
| 	} | ||||
| 	return m | ||||
| } | ||||
|  | ||||
| func intSetter(d interface{}, blank bool, val string, t tag) error { | ||||
| 	if blank { | ||||
| 		return errBlankUnsupported | ||||
| 	} | ||||
| 	mode := intMode(t.intMode) | ||||
| 	if mode == 0 { | ||||
| 		mode = intModeDefault(reflect.TypeOf(d).Elem()) | ||||
| 	} | ||||
| 	return types.ParseInt(d, val, mode) | ||||
| } | ||||
|  | ||||
| func stringSetter(d interface{}, blank bool, val string, t tag) error { | ||||
| 	if blank { | ||||
| 		return errBlankUnsupported | ||||
| 	} | ||||
| 	dsp, ok := d.(*string) | ||||
| 	if !ok { | ||||
| 		return errUnsupportedType | ||||
| 	} | ||||
| 	*dsp = val | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var kindSetters = map[reflect.Kind]setter{ | ||||
| 	reflect.String:  stringSetter, | ||||
| 	reflect.Bool:    boolSetter, | ||||
| 	reflect.Int:     intSetter, | ||||
| 	reflect.Int8:    intSetter, | ||||
| 	reflect.Int16:   intSetter, | ||||
| 	reflect.Int32:   intSetter, | ||||
| 	reflect.Int64:   intSetter, | ||||
| 	reflect.Uint:    intSetter, | ||||
| 	reflect.Uint8:   intSetter, | ||||
| 	reflect.Uint16:  intSetter, | ||||
| 	reflect.Uint32:  intSetter, | ||||
| 	reflect.Uint64:  intSetter, | ||||
| 	reflect.Uintptr: intSetter, | ||||
| } | ||||
|  | ||||
| var typeSetters = map[reflect.Type]setter{ | ||||
| 	reflect.TypeOf(big.Int{}): intSetter, | ||||
| } | ||||
|  | ||||
| func typeSetter(d interface{}, blank bool, val string, tt tag) error { | ||||
| 	t := reflect.ValueOf(d).Type().Elem() | ||||
| 	setter, ok := typeSetters[t] | ||||
| 	if !ok { | ||||
| 		return errUnsupportedType | ||||
| 	} | ||||
| 	return setter(d, blank, val, tt) | ||||
| } | ||||
|  | ||||
| func kindSetter(d interface{}, blank bool, val string, tt tag) error { | ||||
| 	k := reflect.ValueOf(d).Type().Elem().Kind() | ||||
| 	setter, ok := kindSetters[k] | ||||
| 	if !ok { | ||||
| 		return errUnsupportedType | ||||
| 	} | ||||
| 	return setter(d, blank, val, tt) | ||||
| } | ||||
|  | ||||
| func scanSetter(d interface{}, blank bool, val string, tt tag) error { | ||||
| 	if blank { | ||||
| 		return errBlankUnsupported | ||||
| 	} | ||||
| 	return types.ScanFully(d, val, 'v') | ||||
| } | ||||
|  | ||||
| func newValue(c *warnings.Collector, sect string, vCfg reflect.Value, | ||||
| 	vType reflect.Type) (reflect.Value, error) { | ||||
| 	// | ||||
| 	pv := reflect.New(vType) | ||||
| 	dfltName := "default-" + sect | ||||
| 	dfltField, _ := fieldFold(vCfg, dfltName) | ||||
| 	var err error | ||||
| 	if dfltField.IsValid() { | ||||
| 		b := bytes.NewBuffer(nil) | ||||
| 		ge := gob.NewEncoder(b) | ||||
| 		if err = c.Collect(ge.EncodeValue(dfltField)); err != nil { | ||||
| 			return pv, err | ||||
| 		} | ||||
| 		gd := gob.NewDecoder(bytes.NewReader(b.Bytes())) | ||||
| 		if err = c.Collect(gd.DecodeValue(pv.Elem())); err != nil { | ||||
| 			return pv, err | ||||
| 		} | ||||
| 	} | ||||
| 	return pv, nil | ||||
| } | ||||
|  | ||||
| func set(c *warnings.Collector, cfg interface{}, sect, sub, name string, | ||||
| 	 value string, blankValue bool, subsectPass bool) error { | ||||
| 	// | ||||
| 	vPCfg := reflect.ValueOf(cfg) | ||||
| 	if vPCfg.Kind() != reflect.Ptr || vPCfg.Elem().Kind() != reflect.Struct { | ||||
| 		panic(fmt.Errorf("config must be a pointer to a struct")) | ||||
| 	} | ||||
| 	vCfg := vPCfg.Elem() | ||||
| 	vSect, _ := fieldFold(vCfg, sect) | ||||
| 	if !vSect.IsValid() { | ||||
| 		err := extraData{section: sect} | ||||
| 		return c.Collect(err) | ||||
| 	} | ||||
| 	isSubsect := vSect.Kind() == reflect.Map | ||||
| 	if subsectPass != isSubsect { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if isSubsect { | ||||
| 		vst := vSect.Type() | ||||
| 		if vst.Key().Kind() != reflect.String || | ||||
| 			vst.Elem().Kind() != reflect.Ptr || | ||||
| 			vst.Elem().Elem().Kind() != reflect.Struct { | ||||
| 			panic(fmt.Errorf("map field for section must have string keys and "+ | ||||
| 				" pointer-to-struct values: section %q", sect)) | ||||
| 		} | ||||
| 		if vSect.IsNil() { | ||||
| 			vSect.Set(reflect.MakeMap(vst)) | ||||
| 		} | ||||
| 		k := reflect.ValueOf(sub) | ||||
| 		pv := vSect.MapIndex(k) | ||||
| 		if !pv.IsValid() { | ||||
| 			vType := vSect.Type().Elem().Elem() | ||||
| 			var err error | ||||
| 			if pv, err = newValue(c, sect, vCfg, vType); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			vSect.SetMapIndex(k, pv) | ||||
| 		} | ||||
| 		vSect = pv.Elem() | ||||
| 	} else if vSect.Kind() != reflect.Struct { | ||||
| 		panic(fmt.Errorf("field for section must be a map or a struct: "+ | ||||
| 			"section %q", sect)) | ||||
| 	} else if sub != "" { | ||||
| 		err := extraData{section: sect, subsection: &sub} | ||||
| 		return c.Collect(err) | ||||
| 	} | ||||
| 	// Empty name is a special value, meaning that only the | ||||
| 	// section/subsection object is to be created, with no values set. | ||||
| 	if name == "" { | ||||
| 		return nil | ||||
| 	} | ||||
| 	vVar, t := fieldFold(vSect, name) | ||||
| 	if !vVar.IsValid() { | ||||
| 		var err error | ||||
| 		if isSubsect { | ||||
| 			err = extraData{section: sect, subsection: &sub, variable: &name} | ||||
| 		} else { | ||||
| 			err = extraData{section: sect, variable: &name} | ||||
| 		} | ||||
| 		return c.Collect(err) | ||||
| 	} | ||||
| 	// vVal is either single-valued var, or newly allocated value within multi-valued var | ||||
| 	var vVal reflect.Value | ||||
| 	// multi-value if unnamed slice type | ||||
| 	isMulti := vVar.Type().Name() == "" && vVar.Kind() == reflect.Slice || | ||||
| 		vVar.Type().Name() == "" && vVar.Kind() == reflect.Ptr && vVar.Type().Elem().Name() == "" && vVar.Type().Elem().Kind() == reflect.Slice | ||||
| 	if isMulti && vVar.Kind() == reflect.Ptr { | ||||
| 		if vVar.IsNil() { | ||||
| 			vVar.Set(reflect.New(vVar.Type().Elem())) | ||||
| 		} | ||||
| 		vVar = vVar.Elem() | ||||
| 	} | ||||
| 	if isMulti && blankValue { | ||||
| 		vVar.Set(reflect.Zero(vVar.Type())) | ||||
| 		return nil | ||||
| 	} | ||||
| 	if isMulti { | ||||
| 		vVal = reflect.New(vVar.Type().Elem()).Elem() | ||||
| 	} else { | ||||
| 		vVal = vVar | ||||
| 	} | ||||
| 	isDeref := vVal.Type().Name() == "" && vVal.Type().Kind() == reflect.Ptr | ||||
| 	isNew := isDeref && vVal.IsNil() | ||||
| 	// vAddr is address of value to set (dereferenced & allocated as needed) | ||||
| 	var vAddr reflect.Value | ||||
| 	switch { | ||||
| 	case isNew: | ||||
| 		vAddr = reflect.New(vVal.Type().Elem()) | ||||
| 	case isDeref && !isNew: | ||||
| 		vAddr = vVal | ||||
| 	default: | ||||
| 		vAddr = vVal.Addr() | ||||
| 	} | ||||
| 	vAddrI := vAddr.Interface() | ||||
| 	err, ok := error(nil), false | ||||
| 	for _, s := range setters { | ||||
| 		err = s(vAddrI, blankValue, value, t) | ||||
| 		if err == nil { | ||||
| 			ok = true | ||||
| 			break | ||||
| 		} | ||||
| 		if err != errUnsupportedType { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	if !ok { | ||||
| 		// in case all setters returned errUnsupportedType | ||||
| 		return err | ||||
| 	} | ||||
| 	if isNew { // set reference if it was dereferenced and newly allocated | ||||
| 		vVal.Set(vAddr) | ||||
| 	} | ||||
| 	if isMulti { // append if multi-valued | ||||
| 		vVar.Set(reflect.Append(vVar, vVal)) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										435
									
								
								vendor/github.com/src-d/gcfg/token/position.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										435
									
								
								vendor/github.com/src-d/gcfg/token/position.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,435 @@ | ||||
| // Copyright 2010 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // TODO(gri) consider making this a separate package outside the go directory. | ||||
|  | ||||
| package token | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"sort" | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| // ----------------------------------------------------------------------------- | ||||
| // Positions | ||||
|  | ||||
| // Position describes an arbitrary source position | ||||
| // including the file, line, and column location. | ||||
| // A Position is valid if the line number is > 0. | ||||
| // | ||||
| type Position struct { | ||||
| 	Filename string // filename, if any | ||||
| 	Offset   int    // offset, starting at 0 | ||||
| 	Line     int    // line number, starting at 1 | ||||
| 	Column   int    // column number, starting at 1 (character count) | ||||
| } | ||||
|  | ||||
| // IsValid returns true if the position is valid. | ||||
| func (pos *Position) IsValid() bool { return pos.Line > 0 } | ||||
|  | ||||
| // String returns a string in one of several forms: | ||||
| // | ||||
| //	file:line:column    valid position with file name | ||||
| //	line:column         valid position without file name | ||||
| //	file                invalid position with file name | ||||
| //	-                   invalid position without file name | ||||
| // | ||||
| func (pos Position) String() string { | ||||
| 	s := pos.Filename | ||||
| 	if pos.IsValid() { | ||||
| 		if s != "" { | ||||
| 			s += ":" | ||||
| 		} | ||||
| 		s += fmt.Sprintf("%d:%d", pos.Line, pos.Column) | ||||
| 	} | ||||
| 	if s == "" { | ||||
| 		s = "-" | ||||
| 	} | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| // Pos is a compact encoding of a source position within a file set. | ||||
| // It can be converted into a Position for a more convenient, but much | ||||
| // larger, representation. | ||||
| // | ||||
| // The Pos value for a given file is a number in the range [base, base+size], | ||||
| // where base and size are specified when adding the file to the file set via | ||||
| // AddFile. | ||||
| // | ||||
| // To create the Pos value for a specific source offset, first add | ||||
| // the respective file to the current file set (via FileSet.AddFile) | ||||
| // and then call File.Pos(offset) for that file. Given a Pos value p | ||||
| // for a specific file set fset, the corresponding Position value is | ||||
| // obtained by calling fset.Position(p). | ||||
| // | ||||
| // Pos values can be compared directly with the usual comparison operators: | ||||
| // If two Pos values p and q are in the same file, comparing p and q is | ||||
| // equivalent to comparing the respective source file offsets. If p and q | ||||
| // are in different files, p < q is true if the file implied by p was added | ||||
| // to the respective file set before the file implied by q. | ||||
| // | ||||
| type Pos int | ||||
|  | ||||
| // The zero value for Pos is NoPos; there is no file and line information | ||||
| // associated with it, and NoPos().IsValid() is false. NoPos is always | ||||
| // smaller than any other Pos value. The corresponding Position value | ||||
| // for NoPos is the zero value for Position. | ||||
| // | ||||
| const NoPos Pos = 0 | ||||
|  | ||||
| // IsValid returns true if the position is valid. | ||||
| func (p Pos) IsValid() bool { | ||||
| 	return p != NoPos | ||||
| } | ||||
|  | ||||
| // ----------------------------------------------------------------------------- | ||||
| // File | ||||
|  | ||||
| // A File is a handle for a file belonging to a FileSet. | ||||
| // A File has a name, size, and line offset table. | ||||
| // | ||||
| type File struct { | ||||
| 	set  *FileSet | ||||
| 	name string // file name as provided to AddFile | ||||
| 	base int    // Pos value range for this file is [base...base+size] | ||||
| 	size int    // file size as provided to AddFile | ||||
|  | ||||
| 	// lines and infos are protected by set.mutex | ||||
| 	lines []int | ||||
| 	infos []lineInfo | ||||
| } | ||||
|  | ||||
| // Name returns the file name of file f as registered with AddFile. | ||||
| func (f *File) Name() string { | ||||
| 	return f.name | ||||
| } | ||||
|  | ||||
| // Base returns the base offset of file f as registered with AddFile. | ||||
| func (f *File) Base() int { | ||||
| 	return f.base | ||||
| } | ||||
|  | ||||
| // Size returns the size of file f as registered with AddFile. | ||||
| func (f *File) Size() int { | ||||
| 	return f.size | ||||
| } | ||||
|  | ||||
| // LineCount returns the number of lines in file f. | ||||
| func (f *File) LineCount() int { | ||||
| 	f.set.mutex.RLock() | ||||
| 	n := len(f.lines) | ||||
| 	f.set.mutex.RUnlock() | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| // AddLine adds the line offset for a new line. | ||||
| // The line offset must be larger than the offset for the previous line | ||||
| // and smaller than the file size; otherwise the line offset is ignored. | ||||
| // | ||||
| func (f *File) AddLine(offset int) { | ||||
| 	f.set.mutex.Lock() | ||||
| 	if i := len(f.lines); (i == 0 || f.lines[i-1] < offset) && offset < f.size { | ||||
| 		f.lines = append(f.lines, offset) | ||||
| 	} | ||||
| 	f.set.mutex.Unlock() | ||||
| } | ||||
|  | ||||
| // SetLines sets the line offsets for a file and returns true if successful. | ||||
| // The line offsets are the offsets of the first character of each line; | ||||
| // for instance for the content "ab\nc\n" the line offsets are {0, 3}. | ||||
| // An empty file has an empty line offset table. | ||||
| // Each line offset must be larger than the offset for the previous line | ||||
| // and smaller than the file size; otherwise SetLines fails and returns | ||||
| // false. | ||||
| // | ||||
| func (f *File) SetLines(lines []int) bool { | ||||
| 	// verify validity of lines table | ||||
| 	size := f.size | ||||
| 	for i, offset := range lines { | ||||
| 		if i > 0 && offset <= lines[i-1] || size <= offset { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// set lines table | ||||
| 	f.set.mutex.Lock() | ||||
| 	f.lines = lines | ||||
| 	f.set.mutex.Unlock() | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // SetLinesForContent sets the line offsets for the given file content. | ||||
| func (f *File) SetLinesForContent(content []byte) { | ||||
| 	var lines []int | ||||
| 	line := 0 | ||||
| 	for offset, b := range content { | ||||
| 		if line >= 0 { | ||||
| 			lines = append(lines, line) | ||||
| 		} | ||||
| 		line = -1 | ||||
| 		if b == '\n' { | ||||
| 			line = offset + 1 | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// set lines table | ||||
| 	f.set.mutex.Lock() | ||||
| 	f.lines = lines | ||||
| 	f.set.mutex.Unlock() | ||||
| } | ||||
|  | ||||
| // A lineInfo object describes alternative file and line number | ||||
| // information (such as provided via a //line comment in a .go | ||||
| // file) for a given file offset. | ||||
| type lineInfo struct { | ||||
| 	// fields are exported to make them accessible to gob | ||||
| 	Offset   int | ||||
| 	Filename string | ||||
| 	Line     int | ||||
| } | ||||
|  | ||||
| // AddLineInfo adds alternative file and line number information for | ||||
| // a given file offset. The offset must be larger than the offset for | ||||
| // the previously added alternative line info and smaller than the | ||||
| // file size; otherwise the information is ignored. | ||||
| // | ||||
| // AddLineInfo is typically used to register alternative position | ||||
| // information for //line filename:line comments in source files. | ||||
| // | ||||
| func (f *File) AddLineInfo(offset int, filename string, line int) { | ||||
| 	f.set.mutex.Lock() | ||||
| 	if i := len(f.infos); i == 0 || f.infos[i-1].Offset < offset && offset < f.size { | ||||
| 		f.infos = append(f.infos, lineInfo{offset, filename, line}) | ||||
| 	} | ||||
| 	f.set.mutex.Unlock() | ||||
| } | ||||
|  | ||||
| // Pos returns the Pos value for the given file offset; | ||||
| // the offset must be <= f.Size(). | ||||
| // f.Pos(f.Offset(p)) == p. | ||||
| // | ||||
| func (f *File) Pos(offset int) Pos { | ||||
| 	if offset > f.size { | ||||
| 		panic("illegal file offset") | ||||
| 	} | ||||
| 	return Pos(f.base + offset) | ||||
| } | ||||
|  | ||||
| // Offset returns the offset for the given file position p; | ||||
| // p must be a valid Pos value in that file. | ||||
| // f.Offset(f.Pos(offset)) == offset. | ||||
| // | ||||
| func (f *File) Offset(p Pos) int { | ||||
| 	if int(p) < f.base || int(p) > f.base+f.size { | ||||
| 		panic("illegal Pos value") | ||||
| 	} | ||||
| 	return int(p) - f.base | ||||
| } | ||||
|  | ||||
| // Line returns the line number for the given file position p; | ||||
| // p must be a Pos value in that file or NoPos. | ||||
| // | ||||
| func (f *File) Line(p Pos) int { | ||||
| 	// TODO(gri) this can be implemented much more efficiently | ||||
| 	return f.Position(p).Line | ||||
| } | ||||
|  | ||||
| func searchLineInfos(a []lineInfo, x int) int { | ||||
| 	return sort.Search(len(a), func(i int) bool { return a[i].Offset > x }) - 1 | ||||
| } | ||||
|  | ||||
| // info returns the file name, line, and column number for a file offset. | ||||
| func (f *File) info(offset int) (filename string, line, column int) { | ||||
| 	filename = f.name | ||||
| 	if i := searchInts(f.lines, offset); i >= 0 { | ||||
| 		line, column = i+1, offset-f.lines[i]+1 | ||||
| 	} | ||||
| 	if len(f.infos) > 0 { | ||||
| 		// almost no files have extra line infos | ||||
| 		if i := searchLineInfos(f.infos, offset); i >= 0 { | ||||
| 			alt := &f.infos[i] | ||||
| 			filename = alt.Filename | ||||
| 			if i := searchInts(f.lines, alt.Offset); i >= 0 { | ||||
| 				line += alt.Line - i - 1 | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (f *File) position(p Pos) (pos Position) { | ||||
| 	offset := int(p) - f.base | ||||
| 	pos.Offset = offset | ||||
| 	pos.Filename, pos.Line, pos.Column = f.info(offset) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Position returns the Position value for the given file position p; | ||||
| // p must be a Pos value in that file or NoPos. | ||||
| // | ||||
| func (f *File) Position(p Pos) (pos Position) { | ||||
| 	if p != NoPos { | ||||
| 		if int(p) < f.base || int(p) > f.base+f.size { | ||||
| 			panic("illegal Pos value") | ||||
| 		} | ||||
| 		pos = f.position(p) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // ----------------------------------------------------------------------------- | ||||
| // FileSet | ||||
|  | ||||
| // A FileSet represents a set of source files. | ||||
| // Methods of file sets are synchronized; multiple goroutines | ||||
| // may invoke them concurrently. | ||||
| // | ||||
| type FileSet struct { | ||||
| 	mutex sync.RWMutex // protects the file set | ||||
| 	base  int          // base offset for the next file | ||||
| 	files []*File      // list of files in the order added to the set | ||||
| 	last  *File        // cache of last file looked up | ||||
| } | ||||
|  | ||||
| // NewFileSet creates a new file set. | ||||
| func NewFileSet() *FileSet { | ||||
| 	s := new(FileSet) | ||||
| 	s.base = 1 // 0 == NoPos | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| // Base returns the minimum base offset that must be provided to | ||||
| // AddFile when adding the next file. | ||||
| // | ||||
| func (s *FileSet) Base() int { | ||||
| 	s.mutex.RLock() | ||||
| 	b := s.base | ||||
| 	s.mutex.RUnlock() | ||||
| 	return b | ||||
|  | ||||
| } | ||||
|  | ||||
| // AddFile adds a new file with a given filename, base offset, and file size | ||||
| // to the file set s and returns the file. Multiple files may have the same | ||||
| // name. The base offset must not be smaller than the FileSet's Base(), and | ||||
| // size must not be negative. | ||||
| // | ||||
| // Adding the file will set the file set's Base() value to base + size + 1 | ||||
| // as the minimum base value for the next file. The following relationship | ||||
| // exists between a Pos value p for a given file offset offs: | ||||
| // | ||||
| //	int(p) = base + offs | ||||
| // | ||||
| // with offs in the range [0, size] and thus p in the range [base, base+size]. | ||||
| // For convenience, File.Pos may be used to create file-specific position | ||||
| // values from a file offset. | ||||
| // | ||||
| func (s *FileSet) AddFile(filename string, base, size int) *File { | ||||
| 	s.mutex.Lock() | ||||
| 	defer s.mutex.Unlock() | ||||
| 	if base < s.base || size < 0 { | ||||
| 		panic("illegal base or size") | ||||
| 	} | ||||
| 	// base >= s.base && size >= 0 | ||||
| 	f := &File{s, filename, base, size, []int{0}, nil} | ||||
| 	base += size + 1 // +1 because EOF also has a position | ||||
| 	if base < 0 { | ||||
| 		panic("token.Pos offset overflow (> 2G of source code in file set)") | ||||
| 	} | ||||
| 	// add the file to the file set | ||||
| 	s.base = base | ||||
| 	s.files = append(s.files, f) | ||||
| 	s.last = f | ||||
| 	return f | ||||
| } | ||||
|  | ||||
| // Iterate calls f for the files in the file set in the order they were added | ||||
| // until f returns false. | ||||
| // | ||||
| func (s *FileSet) Iterate(f func(*File) bool) { | ||||
| 	for i := 0; ; i++ { | ||||
| 		var file *File | ||||
| 		s.mutex.RLock() | ||||
| 		if i < len(s.files) { | ||||
| 			file = s.files[i] | ||||
| 		} | ||||
| 		s.mutex.RUnlock() | ||||
| 		if file == nil || !f(file) { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func searchFiles(a []*File, x int) int { | ||||
| 	return sort.Search(len(a), func(i int) bool { return a[i].base > x }) - 1 | ||||
| } | ||||
|  | ||||
| func (s *FileSet) file(p Pos) *File { | ||||
| 	// common case: p is in last file | ||||
| 	if f := s.last; f != nil && f.base <= int(p) && int(p) <= f.base+f.size { | ||||
| 		return f | ||||
| 	} | ||||
| 	// p is not in last file - search all files | ||||
| 	if i := searchFiles(s.files, int(p)); i >= 0 { | ||||
| 		f := s.files[i] | ||||
| 		// f.base <= int(p) by definition of searchFiles | ||||
| 		if int(p) <= f.base+f.size { | ||||
| 			s.last = f | ||||
| 			return f | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // File returns the file that contains the position p. | ||||
| // If no such file is found (for instance for p == NoPos), | ||||
| // the result is nil. | ||||
| // | ||||
| func (s *FileSet) File(p Pos) (f *File) { | ||||
| 	if p != NoPos { | ||||
| 		s.mutex.RLock() | ||||
| 		f = s.file(p) | ||||
| 		s.mutex.RUnlock() | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Position converts a Pos in the fileset into a general Position. | ||||
| func (s *FileSet) Position(p Pos) (pos Position) { | ||||
| 	if p != NoPos { | ||||
| 		s.mutex.RLock() | ||||
| 		if f := s.file(p); f != nil { | ||||
| 			pos = f.position(p) | ||||
| 		} | ||||
| 		s.mutex.RUnlock() | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // ----------------------------------------------------------------------------- | ||||
| // Helper functions | ||||
|  | ||||
| func searchInts(a []int, x int) int { | ||||
| 	// This function body is a manually inlined version of: | ||||
| 	// | ||||
| 	//   return sort.Search(len(a), func(i int) bool { return a[i] > x }) - 1 | ||||
| 	// | ||||
| 	// With better compiler optimizations, this may not be needed in the | ||||
| 	// future, but at the moment this change improves the go/printer | ||||
| 	// benchmark performance by ~30%. This has a direct impact on the | ||||
| 	// speed of gofmt and thus seems worthwhile (2011-04-29). | ||||
| 	// TODO(gri): Remove this when compilers have caught up. | ||||
| 	i, j := 0, len(a) | ||||
| 	for i < j { | ||||
| 		h := i + (j-i)/2 // avoid overflow when computing h | ||||
| 		// i ≤ h < j | ||||
| 		if a[h] <= x { | ||||
| 			i = h + 1 | ||||
| 		} else { | ||||
| 			j = h | ||||
| 		} | ||||
| 	} | ||||
| 	return i - 1 | ||||
| } | ||||
							
								
								
									
										56
									
								
								vendor/github.com/src-d/gcfg/token/serialize.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								vendor/github.com/src-d/gcfg/token/serialize.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| // Copyright 2011 The Go 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 token | ||||
|  | ||||
| type serializedFile struct { | ||||
| 	// fields correspond 1:1 to fields with same (lower-case) name in File | ||||
| 	Name  string | ||||
| 	Base  int | ||||
| 	Size  int | ||||
| 	Lines []int | ||||
| 	Infos []lineInfo | ||||
| } | ||||
|  | ||||
| type serializedFileSet struct { | ||||
| 	Base  int | ||||
| 	Files []serializedFile | ||||
| } | ||||
|  | ||||
| // Read calls decode to deserialize a file set into s; s must not be nil. | ||||
| func (s *FileSet) Read(decode func(interface{}) error) error { | ||||
| 	var ss serializedFileSet | ||||
| 	if err := decode(&ss); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	s.mutex.Lock() | ||||
| 	s.base = ss.Base | ||||
| 	files := make([]*File, len(ss.Files)) | ||||
| 	for i := 0; i < len(ss.Files); i++ { | ||||
| 		f := &ss.Files[i] | ||||
| 		files[i] = &File{s, f.Name, f.Base, f.Size, f.Lines, f.Infos} | ||||
| 	} | ||||
| 	s.files = files | ||||
| 	s.last = nil | ||||
| 	s.mutex.Unlock() | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Write calls encode to serialize the file set s. | ||||
| func (s *FileSet) Write(encode func(interface{}) error) error { | ||||
| 	var ss serializedFileSet | ||||
|  | ||||
| 	s.mutex.Lock() | ||||
| 	ss.Base = s.base | ||||
| 	files := make([]serializedFile, len(s.files)) | ||||
| 	for i, f := range s.files { | ||||
| 		files[i] = serializedFile{f.name, f.base, f.size, f.lines, f.infos} | ||||
| 	} | ||||
| 	ss.Files = files | ||||
| 	s.mutex.Unlock() | ||||
|  | ||||
| 	return encode(ss) | ||||
| } | ||||
							
								
								
									
										83
									
								
								vendor/github.com/src-d/gcfg/token/token.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								vendor/github.com/src-d/gcfg/token/token.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| // Copyright 2009 The Go 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 token defines constants representing the lexical tokens of the gcfg | ||||
| // configuration syntax and basic operations on tokens (printing, predicates). | ||||
| // | ||||
| // Note that the API for the token package may change to accommodate new | ||||
| // features or implementation changes in gcfg. | ||||
| // | ||||
| package token | ||||
|  | ||||
| import "strconv" | ||||
|  | ||||
| // Token is the set of lexical tokens of the gcfg configuration syntax. | ||||
| type Token int | ||||
|  | ||||
| // The list of tokens. | ||||
| const ( | ||||
| 	// Special tokens | ||||
| 	ILLEGAL Token = iota | ||||
| 	EOF | ||||
| 	COMMENT | ||||
|  | ||||
| 	literal_beg | ||||
| 	// Identifiers and basic type literals | ||||
| 	// (these tokens stand for classes of literals) | ||||
| 	IDENT  // section-name, variable-name | ||||
| 	STRING // "subsection-name", variable value | ||||
| 	literal_end | ||||
|  | ||||
| 	operator_beg | ||||
| 	// Operators and delimiters | ||||
| 	ASSIGN // = | ||||
| 	LBRACK // [ | ||||
| 	RBRACK // ] | ||||
| 	EOL    // \n | ||||
| 	operator_end | ||||
| ) | ||||
|  | ||||
| var tokens = [...]string{ | ||||
| 	ILLEGAL: "ILLEGAL", | ||||
|  | ||||
| 	EOF:     "EOF", | ||||
| 	COMMENT: "COMMENT", | ||||
|  | ||||
| 	IDENT:  "IDENT", | ||||
| 	STRING: "STRING", | ||||
|  | ||||
| 	ASSIGN: "=", | ||||
| 	LBRACK: "[", | ||||
| 	RBRACK: "]", | ||||
| 	EOL:    "\n", | ||||
| } | ||||
|  | ||||
| // String returns the string corresponding to the token tok. | ||||
| // For operators and delimiters, the string is the actual token character | ||||
| // sequence (e.g., for the token ASSIGN, the string is "="). For all other | ||||
| // tokens the string corresponds to the token constant name (e.g. for the | ||||
| // token IDENT, the string is "IDENT"). | ||||
| // | ||||
| func (tok Token) String() string { | ||||
| 	s := "" | ||||
| 	if 0 <= tok && tok < Token(len(tokens)) { | ||||
| 		s = tokens[tok] | ||||
| 	} | ||||
| 	if s == "" { | ||||
| 		s = "token(" + strconv.Itoa(int(tok)) + ")" | ||||
| 	} | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| // Predicates | ||||
|  | ||||
| // IsLiteral returns true for tokens corresponding to identifiers | ||||
| // and basic type literals; it returns false otherwise. | ||||
| // | ||||
| func (tok Token) IsLiteral() bool { return literal_beg < tok && tok < literal_end } | ||||
|  | ||||
| // IsOperator returns true for tokens corresponding to operators and | ||||
| // delimiters; it returns false otherwise. | ||||
| // | ||||
| func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator_end } | ||||
							
								
								
									
										23
									
								
								vendor/github.com/src-d/gcfg/types/bool.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/src-d/gcfg/types/bool.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| package types | ||||
|  | ||||
| // BoolValues defines the name and value mappings for ParseBool. | ||||
| var BoolValues = map[string]interface{}{ | ||||
| 	"true": true, "yes": true, "on": true, "1": true, | ||||
| 	"false": false, "no": false, "off": false, "0": false, | ||||
| } | ||||
|  | ||||
| var boolParser = func() *EnumParser { | ||||
| 	ep := &EnumParser{} | ||||
| 	ep.AddVals(BoolValues) | ||||
| 	return ep | ||||
| }() | ||||
|  | ||||
| // ParseBool parses bool values according to the definitions in BoolValues. | ||||
| // Parsing is case-insensitive. | ||||
| func ParseBool(s string) (bool, error) { | ||||
| 	v, err := boolParser.Parse(s) | ||||
| 	if err != nil { | ||||
| 		return false, err | ||||
| 	} | ||||
| 	return v.(bool), nil | ||||
| } | ||||
							
								
								
									
										4
									
								
								vendor/github.com/src-d/gcfg/types/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/src-d/gcfg/types/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| // Package types defines helpers for type conversions. | ||||
| // | ||||
| // The API for this package is not finalized yet. | ||||
| package types | ||||
							
								
								
									
										44
									
								
								vendor/github.com/src-d/gcfg/types/enum.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/src-d/gcfg/types/enum.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| package types | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // EnumParser parses "enum" values; i.e. a predefined set of strings to | ||||
| // predefined values. | ||||
| type EnumParser struct { | ||||
| 	Type      string // type name; if not set, use type of first value added | ||||
| 	CaseMatch bool   // if true, matching of strings is case-sensitive | ||||
| 	// PrefixMatch bool | ||||
| 	vals map[string]interface{} | ||||
| } | ||||
|  | ||||
| // AddVals adds strings and values to an EnumParser. | ||||
| func (ep *EnumParser) AddVals(vals map[string]interface{}) { | ||||
| 	if ep.vals == nil { | ||||
| 		ep.vals = make(map[string]interface{}) | ||||
| 	} | ||||
| 	for k, v := range vals { | ||||
| 		if ep.Type == "" { | ||||
| 			ep.Type = reflect.TypeOf(v).Name() | ||||
| 		} | ||||
| 		if !ep.CaseMatch { | ||||
| 			k = strings.ToLower(k) | ||||
| 		} | ||||
| 		ep.vals[k] = v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Parse parses the string and returns the value or an error. | ||||
| func (ep EnumParser) Parse(s string) (interface{}, error) { | ||||
| 	if !ep.CaseMatch { | ||||
| 		s = strings.ToLower(s) | ||||
| 	} | ||||
| 	v, ok := ep.vals[s] | ||||
| 	if !ok { | ||||
| 		return false, fmt.Errorf("failed to parse %s %#q", ep.Type, s) | ||||
| 	} | ||||
| 	return v, nil | ||||
| } | ||||
							
								
								
									
										86
									
								
								vendor/github.com/src-d/gcfg/types/int.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								vendor/github.com/src-d/gcfg/types/int.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| package types | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // An IntMode is a mode for parsing integer values, representing a set of | ||||
| // accepted bases. | ||||
| type IntMode uint8 | ||||
|  | ||||
| // IntMode values for ParseInt; can be combined using binary or. | ||||
| const ( | ||||
| 	Dec IntMode = 1 << iota | ||||
| 	Hex | ||||
| 	Oct | ||||
| ) | ||||
|  | ||||
| // String returns a string representation of IntMode; e.g. `IntMode(Dec|Hex)`. | ||||
| func (m IntMode) String() string { | ||||
| 	var modes []string | ||||
| 	if m&Dec != 0 { | ||||
| 		modes = append(modes, "Dec") | ||||
| 	} | ||||
| 	if m&Hex != 0 { | ||||
| 		modes = append(modes, "Hex") | ||||
| 	} | ||||
| 	if m&Oct != 0 { | ||||
| 		modes = append(modes, "Oct") | ||||
| 	} | ||||
| 	return "IntMode(" + strings.Join(modes, "|") + ")" | ||||
| } | ||||
|  | ||||
| var errIntAmbig = fmt.Errorf("ambiguous integer value; must include '0' prefix") | ||||
|  | ||||
| func prefix0(val string) bool { | ||||
| 	return strings.HasPrefix(val, "0") || strings.HasPrefix(val, "-0") | ||||
| } | ||||
|  | ||||
| func prefix0x(val string) bool { | ||||
| 	return strings.HasPrefix(val, "0x") || strings.HasPrefix(val, "-0x") | ||||
| } | ||||
|  | ||||
| // ParseInt parses val using mode into intptr, which must be a pointer to an | ||||
| // integer kind type. Non-decimal value require prefix `0` or `0x` in the cases | ||||
| // when mode permits ambiguity of base; otherwise the prefix can be omitted. | ||||
| func ParseInt(intptr interface{}, val string, mode IntMode) error { | ||||
| 	val = strings.TrimSpace(val) | ||||
| 	verb := byte(0) | ||||
| 	switch mode { | ||||
| 	case Dec: | ||||
| 		verb = 'd' | ||||
| 	case Dec + Hex: | ||||
| 		if prefix0x(val) { | ||||
| 			verb = 'v' | ||||
| 		} else { | ||||
| 			verb = 'd' | ||||
| 		} | ||||
| 	case Dec + Oct: | ||||
| 		if prefix0(val) && !prefix0x(val) { | ||||
| 			verb = 'v' | ||||
| 		} else { | ||||
| 			verb = 'd' | ||||
| 		} | ||||
| 	case Dec + Hex + Oct: | ||||
| 		verb = 'v' | ||||
| 	case Hex: | ||||
| 		if prefix0x(val) { | ||||
| 			verb = 'v' | ||||
| 		} else { | ||||
| 			verb = 'x' | ||||
| 		} | ||||
| 	case Oct: | ||||
| 		verb = 'o' | ||||
| 	case Hex + Oct: | ||||
| 		if prefix0(val) { | ||||
| 			verb = 'v' | ||||
| 		} else { | ||||
| 			return errIntAmbig | ||||
| 		} | ||||
| 	} | ||||
| 	if verb == 0 { | ||||
| 		panic("unsupported mode") | ||||
| 	} | ||||
| 	return ScanFully(intptr, val, verb) | ||||
| } | ||||
							
								
								
									
										23
									
								
								vendor/github.com/src-d/gcfg/types/scan.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/src-d/gcfg/types/scan.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| package types | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"reflect" | ||||
| ) | ||||
|  | ||||
| // ScanFully uses fmt.Sscanf with verb to fully scan val into ptr. | ||||
| func ScanFully(ptr interface{}, val string, verb byte) error { | ||||
| 	t := reflect.ValueOf(ptr).Elem().Type() | ||||
| 	// attempt to read extra bytes to make sure the value is consumed | ||||
| 	var b []byte | ||||
| 	n, err := fmt.Sscanf(val, "%"+string(verb)+"%s", ptr, &b) | ||||
| 	switch { | ||||
| 	case n < 1 || n == 1 && err != io.EOF: | ||||
| 		return fmt.Errorf("failed to parse %q as %v: %v", val, t, err) | ||||
| 	case n > 1: | ||||
| 		return fmt.Errorf("failed to parse %q as %v: extra characters %q", val, t, string(b)) | ||||
| 	} | ||||
| 	// n == 1 && err == io.EOF | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										2
									
								
								vendor/github.com/urfave/cli/.flake8
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/urfave/cli/.flake8
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| [flake8] | ||||
| max-line-length = 120 | ||||
							
								
								
									
										2
									
								
								vendor/github.com/urfave/cli/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/urfave/cli/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| *.coverprofile | ||||
| node_modules/ | ||||
							
								
								
									
										27
									
								
								vendor/github.com/urfave/cli/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/urfave/cli/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| language: go | ||||
| sudo: false | ||||
| dist: trusty | ||||
| osx_image: xcode8.3 | ||||
| go: 1.8.x | ||||
|  | ||||
| os: | ||||
| - linux | ||||
| - osx | ||||
|  | ||||
| cache: | ||||
|   directories: | ||||
|   - node_modules | ||||
|  | ||||
| before_script: | ||||
| - go get github.com/urfave/gfmrun/... || true | ||||
| - go get golang.org/x/tools/cmd/goimports | ||||
| - if [ ! -f node_modules/.bin/markdown-toc ] ; then | ||||
|     npm install markdown-toc ; | ||||
|   fi | ||||
|  | ||||
| script: | ||||
| - ./runtests gen | ||||
| - ./runtests vet | ||||
| - ./runtests test | ||||
| - ./runtests gfmrun | ||||
| - ./runtests toc | ||||
							
								
								
									
										435
									
								
								vendor/github.com/urfave/cli/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										435
									
								
								vendor/github.com/urfave/cli/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,435 @@ | ||||
| # Change Log | ||||
|  | ||||
| **ATTN**: This project uses [semantic versioning](http://semver.org/). | ||||
|  | ||||
| ## [Unreleased] | ||||
|  | ||||
| ## 1.20.0 - 2017-08-10 | ||||
|  | ||||
| ### Fixed | ||||
|  | ||||
| * `HandleExitCoder` is now correctly iterates over all errors in | ||||
|   a `MultiError`. The exit code is the exit code of the last error or `1` if | ||||
|   there are no `ExitCoder`s in the `MultiError`. | ||||
| * Fixed YAML file loading on Windows (previously would fail validate the file path) | ||||
| * Subcommand `Usage`, `Description`, `ArgsUsage`, `OnUsageError` correctly | ||||
|   propogated | ||||
| * `ErrWriter` is now passed downwards through command structure to avoid the | ||||
|   need to redefine it | ||||
| * Pass `Command` context into `OnUsageError` rather than parent context so that | ||||
|   all fields are avaiable | ||||
| * Errors occuring in `Before` funcs are no longer double printed | ||||
| * Use `UsageText` in the help templates for commands and subcommands if | ||||
|   defined; otherwise build the usage as before (was previously ignoring this | ||||
|   field) | ||||
| * `IsSet` and `GlobalIsSet` now correctly return whether a flag is set if | ||||
|   a program calls `Set` or `GlobalSet` directly after flag parsing (would | ||||
|   previously only return `true` if the flag was set during parsing) | ||||
|  | ||||
| ### Changed | ||||
|  | ||||
| * No longer exit the program on command/subcommand error if the error raised is | ||||
|   not an `OsExiter`. This exiting behavior was introduced in 1.19.0, but was | ||||
|   determined to be a regression in functionality. See [the | ||||
|   PR](https://github.com/urfave/cli/pull/595) for discussion. | ||||
|  | ||||
| ### Added | ||||
|  | ||||
| * `CommandsByName` type was added to make it easy to sort `Command`s by name, | ||||
|   alphabetically | ||||
| * `altsrc` now handles loading of string and int arrays from TOML | ||||
| * Support for definition of custom help templates for `App` via | ||||
|   `CustomAppHelpTemplate` | ||||
| * Support for arbitrary key/value fields on `App` to be used with | ||||
|   `CustomAppHelpTemplate` via `ExtraInfo` | ||||
| * `HelpFlag`, `VersionFlag`, and `BashCompletionFlag` changed to explictly be | ||||
|   `cli.Flag`s allowing for the use of custom flags satisfying the `cli.Flag` | ||||
|   interface to be used. | ||||
|  | ||||
|  | ||||
| ## [1.19.1] - 2016-11-21 | ||||
|  | ||||
| ### Fixed | ||||
|  | ||||
| - Fixes regression introduced in 1.19.0 where using an `ActionFunc` as | ||||
|   the `Action` for a command would cause it to error rather than calling the | ||||
|   function. Should not have a affected declarative cases using `func(c | ||||
|   *cli.Context) err)`. | ||||
| - Shell completion now handles the case where the user specifies | ||||
|   `--generate-bash-completion` immediately after a flag that takes an argument. | ||||
|   Previously it call the application with `--generate-bash-completion` as the | ||||
|   flag value. | ||||
|  | ||||
| ## [1.19.0] - 2016-11-19 | ||||
| ### Added | ||||
| - `FlagsByName` was added to make it easy to sort flags (e.g. `sort.Sort(cli.FlagsByName(app.Flags))`) | ||||
| - A `Description` field was added to `App` for a more detailed description of | ||||
|   the application (similar to the existing `Description` field on `Command`) | ||||
| - Flag type code generation via `go generate` | ||||
| - Write to stderr and exit 1 if action returns non-nil error | ||||
| - Added support for TOML to the `altsrc` loader | ||||
| - `SkipArgReorder` was added to allow users to skip the argument reordering. | ||||
|   This is useful if you want to consider all "flags" after an argument as | ||||
|   arguments rather than flags (the default behavior of the stdlib `flag` | ||||
|   library). This is backported functionality from the [removal of the flag | ||||
|   reordering](https://github.com/urfave/cli/pull/398) in the unreleased version | ||||
|   2 | ||||
| - For formatted errors (those implementing `ErrorFormatter`), the errors will | ||||
|   be formatted during output. Compatible with `pkg/errors`. | ||||
|  | ||||
| ### Changed | ||||
| - Raise minimum tested/supported Go version to 1.2+ | ||||
|  | ||||
| ### Fixed | ||||
| - Consider empty environment variables as set (previously environment variables | ||||
|   with the equivalent of `""` would be skipped rather than their value used). | ||||
| - Return an error if the value in a given environment variable cannot be parsed | ||||
|   as the flag type. Previously these errors were silently swallowed. | ||||
| - Print full error when an invalid flag is specified (which includes the invalid flag) | ||||
| - `App.Writer` defaults to `stdout` when `nil` | ||||
| - If no action is specified on a command or app, the help is now printed instead of `panic`ing | ||||
| - `App.Metadata` is initialized automatically now (previously was `nil` unless initialized) | ||||
| - Correctly show help message if `-h` is provided to a subcommand | ||||
| - `context.(Global)IsSet` now respects environment variables. Previously it | ||||
|   would return `false` if a flag was specified in the environment rather than | ||||
|   as an argument | ||||
| - Removed deprecation warnings to STDERR to avoid them leaking to the end-user | ||||
| - `altsrc`s import paths were updated to use `gopkg.in/urfave/cli.v1`. This | ||||
|   fixes issues that occurred when `gopkg.in/urfave/cli.v1` was imported as well | ||||
|   as `altsrc` where Go would complain that the types didn't match | ||||
|  | ||||
| ## [1.18.1] - 2016-08-28 | ||||
| ### Fixed | ||||
| - Removed deprecation warnings to STDERR to avoid them leaking to the end-user (backported) | ||||
|  | ||||
| ## [1.18.0] - 2016-06-27 | ||||
| ### Added | ||||
| - `./runtests` test runner with coverage tracking by default | ||||
| - testing on OS X | ||||
| - testing on Windows | ||||
| - `UintFlag`, `Uint64Flag`, and `Int64Flag` types and supporting code | ||||
|  | ||||
| ### Changed | ||||
| - Use spaces for alignment in help/usage output instead of tabs, making the | ||||
|   output alignment consistent regardless of tab width | ||||
|  | ||||
| ### Fixed | ||||
| - Printing of command aliases in help text | ||||
| - Printing of visible flags for both struct and struct pointer flags | ||||
| - Display the `help` subcommand when using `CommandCategories` | ||||
| - No longer swallows `panic`s that occur within the `Action`s themselves when | ||||
|   detecting the signature of the `Action` field | ||||
|  | ||||
| ## [1.17.1] - 2016-08-28 | ||||
| ### Fixed | ||||
| - Removed deprecation warnings to STDERR to avoid them leaking to the end-user | ||||
|  | ||||
| ## [1.17.0] - 2016-05-09 | ||||
| ### Added | ||||
| - Pluggable flag-level help text rendering via `cli.DefaultFlagStringFunc` | ||||
| - `context.GlobalBoolT` was added as an analogue to `context.GlobalBool` | ||||
| - Support for hiding commands by setting `Hidden: true` -- this will hide the | ||||
|   commands in help output | ||||
|  | ||||
| ### Changed | ||||
| - `Float64Flag`, `IntFlag`, and `DurationFlag` default values are no longer | ||||
|   quoted in help text output. | ||||
| - All flag types now include `(default: {value})` strings following usage when a | ||||
|   default value can be (reasonably) detected. | ||||
| - `IntSliceFlag` and `StringSliceFlag` usage strings are now more consistent | ||||
|   with non-slice flag types | ||||
| - Apps now exit with a code of 3 if an unknown subcommand is specified | ||||
|   (previously they printed "No help topic for...", but still exited 0. This | ||||
|   makes it easier to script around apps built using `cli` since they can trust | ||||
|   that a 0 exit code indicated a successful execution. | ||||
| - cleanups based on [Go Report Card | ||||
|   feedback](https://goreportcard.com/report/github.com/urfave/cli) | ||||
|  | ||||
| ## [1.16.1] - 2016-08-28 | ||||
| ### Fixed | ||||
| - Removed deprecation warnings to STDERR to avoid them leaking to the end-user | ||||
|  | ||||
| ## [1.16.0] - 2016-05-02 | ||||
| ### Added | ||||
| - `Hidden` field on all flag struct types to omit from generated help text | ||||
|  | ||||
| ### Changed | ||||
| - `BashCompletionFlag` (`--enable-bash-completion`) is now omitted from | ||||
| generated help text via the `Hidden` field | ||||
|  | ||||
| ### Fixed | ||||
| - handling of error values in `HandleAction` and `HandleExitCoder` | ||||
|  | ||||
| ## [1.15.0] - 2016-04-30 | ||||
| ### Added | ||||
| - This file! | ||||
| - Support for placeholders in flag usage strings | ||||
| - `App.Metadata` map for arbitrary data/state management | ||||
| - `Set` and `GlobalSet` methods on `*cli.Context` for altering values after | ||||
| parsing. | ||||
| - Support for nested lookup of dot-delimited keys in structures loaded from | ||||
| YAML. | ||||
|  | ||||
| ### Changed | ||||
| - The `App.Action` and `Command.Action` now prefer a return signature of | ||||
| `func(*cli.Context) error`, as defined by `cli.ActionFunc`.  If a non-nil | ||||
| `error` is returned, there may be two outcomes: | ||||
|     - If the error fulfills `cli.ExitCoder`, then `os.Exit` will be called | ||||
|     automatically | ||||
|     - Else the error is bubbled up and returned from `App.Run` | ||||
| - Specifying an `Action` with the legacy return signature of | ||||
| `func(*cli.Context)` will produce a deprecation message to stderr | ||||
| - Specifying an `Action` that is not a `func` type will produce a non-zero exit | ||||
| from `App.Run` | ||||
| - Specifying an `Action` func that has an invalid (input) signature will | ||||
| produce a non-zero exit from `App.Run` | ||||
|  | ||||
| ### Deprecated | ||||
| - <a name="deprecated-cli-app-runandexitonerror"></a> | ||||
| `cli.App.RunAndExitOnError`, which should now be done by returning an error | ||||
| that fulfills `cli.ExitCoder` to `cli.App.Run`. | ||||
| - <a name="deprecated-cli-app-action-signature"></a> the legacy signature for | ||||
| `cli.App.Action` of `func(*cli.Context)`, which should now have a return | ||||
| signature of `func(*cli.Context) error`, as defined by `cli.ActionFunc`. | ||||
|  | ||||
| ### Fixed | ||||
| - Added missing `*cli.Context.GlobalFloat64` method | ||||
|  | ||||
| ## [1.14.0] - 2016-04-03 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - Codebeat badge | ||||
| - Support for categorization via `CategorizedHelp` and `Categories` on app. | ||||
|  | ||||
| ### Changed | ||||
| - Use `filepath.Base` instead of `path.Base` in `Name` and `HelpName`. | ||||
|  | ||||
| ### Fixed | ||||
| - Ensure version is not shown in help text when `HideVersion` set. | ||||
|  | ||||
| ## [1.13.0] - 2016-03-06 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - YAML file input support. | ||||
| - `NArg` method on context. | ||||
|  | ||||
| ## [1.12.0] - 2016-02-17 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - Custom usage error handling. | ||||
| - Custom text support in `USAGE` section of help output. | ||||
| - Improved help messages for empty strings. | ||||
| - AppVeyor CI configuration. | ||||
|  | ||||
| ### Changed | ||||
| - Removed `panic` from default help printer func. | ||||
| - De-duping and optimizations. | ||||
|  | ||||
| ### Fixed | ||||
| - Correctly handle `Before`/`After` at command level when no subcommands. | ||||
| - Case of literal `-` argument causing flag reordering. | ||||
| - Environment variable hints on Windows. | ||||
| - Docs updates. | ||||
|  | ||||
| ## [1.11.1] - 2015-12-21 (backfilled 2016-04-25) | ||||
| ### Changed | ||||
| - Use `path.Base` in `Name` and `HelpName` | ||||
| - Export `GetName` on flag types. | ||||
|  | ||||
| ### Fixed | ||||
| - Flag parsing when skipping is enabled. | ||||
| - Test output cleanup. | ||||
| - Move completion check to account for empty input case. | ||||
|  | ||||
| ## [1.11.0] - 2015-11-15 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - Destination scan support for flags. | ||||
| - Testing against `tip` in Travis CI config. | ||||
|  | ||||
| ### Changed | ||||
| - Go version in Travis CI config. | ||||
|  | ||||
| ### Fixed | ||||
| - Removed redundant tests. | ||||
| - Use correct example naming in tests. | ||||
|  | ||||
| ## [1.10.2] - 2015-10-29 (backfilled 2016-04-25) | ||||
| ### Fixed | ||||
| - Remove unused var in bash completion. | ||||
|  | ||||
| ## [1.10.1] - 2015-10-21 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - Coverage and reference logos in README. | ||||
|  | ||||
| ### Fixed | ||||
| - Use specified values in help and version parsing. | ||||
| - Only display app version and help message once. | ||||
|  | ||||
| ## [1.10.0] - 2015-10-06 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - More tests for existing functionality. | ||||
| - `ArgsUsage` at app and command level for help text flexibility. | ||||
|  | ||||
| ### Fixed | ||||
| - Honor `HideHelp` and `HideVersion` in `App.Run`. | ||||
| - Remove juvenile word from README. | ||||
|  | ||||
| ## [1.9.0] - 2015-09-08 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - `FullName` on command with accompanying help output update. | ||||
| - Set default `$PROG` in bash completion. | ||||
|  | ||||
| ### Changed | ||||
| - Docs formatting. | ||||
|  | ||||
| ### Fixed | ||||
| - Removed self-referential imports in tests. | ||||
|  | ||||
| ## [1.8.0] - 2015-06-30 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - Support for `Copyright` at app level. | ||||
| - `Parent` func at context level to walk up context lineage. | ||||
|  | ||||
| ### Fixed | ||||
| - Global flag processing at top level. | ||||
|  | ||||
| ## [1.7.1] - 2015-06-11 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - Aggregate errors from `Before`/`After` funcs. | ||||
| - Doc comments on flag structs. | ||||
| - Include non-global flags when checking version and help. | ||||
| - Travis CI config updates. | ||||
|  | ||||
| ### Fixed | ||||
| - Ensure slice type flags have non-nil values. | ||||
| - Collect global flags from the full command hierarchy. | ||||
| - Docs prose. | ||||
|  | ||||
| ## [1.7.0] - 2015-05-03 (backfilled 2016-04-25) | ||||
| ### Changed | ||||
| - `HelpPrinter` signature includes output writer. | ||||
|  | ||||
| ### Fixed | ||||
| - Specify go 1.1+ in docs. | ||||
| - Set `Writer` when running command as app. | ||||
|  | ||||
| ## [1.6.0] - 2015-03-23 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - Multiple author support. | ||||
| - `NumFlags` at context level. | ||||
| - `Aliases` at command level. | ||||
|  | ||||
| ### Deprecated | ||||
| - `ShortName` at command level. | ||||
|  | ||||
| ### Fixed | ||||
| - Subcommand help output. | ||||
| - Backward compatible support for deprecated `Author` and `Email` fields. | ||||
| - Docs regarding `Names`/`Aliases`. | ||||
|  | ||||
| ## [1.5.0] - 2015-02-20 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - `After` hook func support at app and command level. | ||||
|  | ||||
| ### Fixed | ||||
| - Use parsed context when running command as subcommand. | ||||
| - Docs prose. | ||||
|  | ||||
| ## [1.4.1] - 2015-01-09 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - Support for hiding `-h / --help` flags, but not `help` subcommand. | ||||
| - Stop flag parsing after `--`. | ||||
|  | ||||
| ### Fixed | ||||
| - Help text for generic flags to specify single value. | ||||
| - Use double quotes in output for defaults. | ||||
| - Use `ParseInt` instead of `ParseUint` for int environment var values. | ||||
| - Use `0` as base when parsing int environment var values. | ||||
|  | ||||
| ## [1.4.0] - 2014-12-12 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - Support for environment variable lookup "cascade". | ||||
| - Support for `Stdout` on app for output redirection. | ||||
|  | ||||
| ### Fixed | ||||
| - Print command help instead of app help in `ShowCommandHelp`. | ||||
|  | ||||
| ## [1.3.1] - 2014-11-13 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - Docs and example code updates. | ||||
|  | ||||
| ### Changed | ||||
| - Default `-v / --version` flag made optional. | ||||
|  | ||||
| ## [1.3.0] - 2014-08-10 (backfilled 2016-04-25) | ||||
| ### Added | ||||
| - `FlagNames` at context level. | ||||
| - Exposed `VersionPrinter` var for more control over version output. | ||||
| - Zsh completion hook. | ||||
| - `AUTHOR` section in default app help template. | ||||
| - Contribution guidelines. | ||||
| - `DurationFlag` type. | ||||
|  | ||||
| ## [1.2.0] - 2014-08-02 | ||||
| ### Added | ||||
| - Support for environment variable defaults on flags plus tests. | ||||
|  | ||||
| ## [1.1.0] - 2014-07-15 | ||||
| ### Added | ||||
| - Bash completion. | ||||
| - Optional hiding of built-in help command. | ||||
| - Optional skipping of flag parsing at command level. | ||||
| - `Author`, `Email`, and `Compiled` metadata on app. | ||||
| - `Before` hook func support at app and command level. | ||||
| - `CommandNotFound` func support at app level. | ||||
| - Command reference available on context. | ||||
| - `GenericFlag` type. | ||||
| - `Float64Flag` type. | ||||
| - `BoolTFlag` type. | ||||
| - `IsSet` flag helper on context. | ||||
| - More flag lookup funcs at context level. | ||||
| - More tests & docs. | ||||
|  | ||||
| ### Changed | ||||
| - Help template updates to account for presence/absence of flags. | ||||
| - Separated subcommand help template. | ||||
| - Exposed `HelpPrinter` var for more control over help output. | ||||
|  | ||||
| ## [1.0.0] - 2013-11-01 | ||||
| ### Added | ||||
| - `help` flag in default app flag set and each command flag set. | ||||
| - Custom handling of argument parsing errors. | ||||
| - Command lookup by name at app level. | ||||
| - `StringSliceFlag` type and supporting `StringSlice` type. | ||||
| - `IntSliceFlag` type and supporting `IntSlice` type. | ||||
| - Slice type flag lookups by name at context level. | ||||
| - Export of app and command help functions. | ||||
| - More tests & docs. | ||||
|  | ||||
| ## 0.1.0 - 2013-07-22 | ||||
| ### Added | ||||
| - Initial implementation. | ||||
|  | ||||
| [Unreleased]: https://github.com/urfave/cli/compare/v1.18.0...HEAD | ||||
| [1.18.0]: https://github.com/urfave/cli/compare/v1.17.0...v1.18.0 | ||||
| [1.17.0]: https://github.com/urfave/cli/compare/v1.16.0...v1.17.0 | ||||
| [1.16.0]: https://github.com/urfave/cli/compare/v1.15.0...v1.16.0 | ||||
| [1.15.0]: https://github.com/urfave/cli/compare/v1.14.0...v1.15.0 | ||||
| [1.14.0]: https://github.com/urfave/cli/compare/v1.13.0...v1.14.0 | ||||
| [1.13.0]: https://github.com/urfave/cli/compare/v1.12.0...v1.13.0 | ||||
| [1.12.0]: https://github.com/urfave/cli/compare/v1.11.1...v1.12.0 | ||||
| [1.11.1]: https://github.com/urfave/cli/compare/v1.11.0...v1.11.1 | ||||
| [1.11.0]: https://github.com/urfave/cli/compare/v1.10.2...v1.11.0 | ||||
| [1.10.2]: https://github.com/urfave/cli/compare/v1.10.1...v1.10.2 | ||||
| [1.10.1]: https://github.com/urfave/cli/compare/v1.10.0...v1.10.1 | ||||
| [1.10.0]: https://github.com/urfave/cli/compare/v1.9.0...v1.10.0 | ||||
| [1.9.0]: https://github.com/urfave/cli/compare/v1.8.0...v1.9.0 | ||||
| [1.8.0]: https://github.com/urfave/cli/compare/v1.7.1...v1.8.0 | ||||
| [1.7.1]: https://github.com/urfave/cli/compare/v1.7.0...v1.7.1 | ||||
| [1.7.0]: https://github.com/urfave/cli/compare/v1.6.0...v1.7.0 | ||||
| [1.6.0]: https://github.com/urfave/cli/compare/v1.5.0...v1.6.0 | ||||
| [1.5.0]: https://github.com/urfave/cli/compare/v1.4.1...v1.5.0 | ||||
| [1.4.1]: https://github.com/urfave/cli/compare/v1.4.0...v1.4.1 | ||||
| [1.4.0]: https://github.com/urfave/cli/compare/v1.3.1...v1.4.0 | ||||
| [1.3.1]: https://github.com/urfave/cli/compare/v1.3.0...v1.3.1 | ||||
| [1.3.0]: https://github.com/urfave/cli/compare/v1.2.0...v1.3.0 | ||||
| [1.2.0]: https://github.com/urfave/cli/compare/v1.1.0...v1.2.0 | ||||
| [1.1.0]: https://github.com/urfave/cli/compare/v1.0.0...v1.1.0 | ||||
| [1.0.0]: https://github.com/urfave/cli/compare/v0.1.0...v1.0.0 | ||||
							
								
								
									
										21
									
								
								vendor/github.com/urfave/cli/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/urfave/cli/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| MIT License | ||||
|  | ||||
| Copyright (c) 2016 Jeremy Saenz & Contributors | ||||
|  | ||||
| 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. | ||||
							
								
								
									
										1381
									
								
								vendor/github.com/urfave/cli/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1381
									
								
								vendor/github.com/urfave/cli/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										497
									
								
								vendor/github.com/urfave/cli/app.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										497
									
								
								vendor/github.com/urfave/cli/app.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,497 @@ | ||||
| package cli | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"sort" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	changeLogURL                    = "https://github.com/urfave/cli/blob/master/CHANGELOG.md" | ||||
| 	appActionDeprecationURL         = fmt.Sprintf("%s#deprecated-cli-app-action-signature", changeLogURL) | ||||
| 	runAndExitOnErrorDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-runandexitonerror", changeLogURL) | ||||
|  | ||||
| 	contactSysadmin = "This is an error in the application.  Please contact the distributor of this application if this is not you." | ||||
|  | ||||
| 	errInvalidActionType = NewExitError("ERROR invalid Action type. "+ | ||||
| 		fmt.Sprintf("Must be `func(*Context`)` or `func(*Context) error).  %s", contactSysadmin)+ | ||||
| 		fmt.Sprintf("See %s", appActionDeprecationURL), 2) | ||||
| ) | ||||
|  | ||||
| // App is the main structure of a cli application. It is recommended that | ||||
| // an app be created with the cli.NewApp() function | ||||
| type App struct { | ||||
| 	// The name of the program. Defaults to path.Base(os.Args[0]) | ||||
| 	Name string | ||||
| 	// Full name of command for help, defaults to Name | ||||
| 	HelpName string | ||||
| 	// Description of the program. | ||||
| 	Usage string | ||||
| 	// Text to override the USAGE section of help | ||||
| 	UsageText string | ||||
| 	// Description of the program argument format. | ||||
| 	ArgsUsage string | ||||
| 	// Version of the program | ||||
| 	Version string | ||||
| 	// Description of the program | ||||
| 	Description string | ||||
| 	// List of commands to execute | ||||
| 	Commands []Command | ||||
| 	// List of flags to parse | ||||
| 	Flags []Flag | ||||
| 	// Boolean to enable bash completion commands | ||||
| 	EnableBashCompletion bool | ||||
| 	// Boolean to hide built-in help command | ||||
| 	HideHelp bool | ||||
| 	// Boolean to hide built-in version flag and the VERSION section of help | ||||
| 	HideVersion bool | ||||
| 	// Populate on app startup, only gettable through method Categories() | ||||
| 	categories CommandCategories | ||||
| 	// An action to execute when the bash-completion flag is set | ||||
| 	BashComplete BashCompleteFunc | ||||
| 	// An action to execute before any subcommands are run, but after the context is ready | ||||
| 	// If a non-nil error is returned, no subcommands are run | ||||
| 	Before BeforeFunc | ||||
| 	// An action to execute after any subcommands are run, but after the subcommand has finished | ||||
| 	// It is run even if Action() panics | ||||
| 	After AfterFunc | ||||
|  | ||||
| 	// The action to execute when no subcommands are specified | ||||
| 	// Expects a `cli.ActionFunc` but will accept the *deprecated* signature of `func(*cli.Context) {}` | ||||
| 	// *Note*: support for the deprecated `Action` signature will be removed in a future version | ||||
| 	Action interface{} | ||||
|  | ||||
| 	// Execute this function if the proper command cannot be found | ||||
| 	CommandNotFound CommandNotFoundFunc | ||||
| 	// Execute this function if an usage error occurs | ||||
| 	OnUsageError OnUsageErrorFunc | ||||
| 	// Compilation date | ||||
| 	Compiled time.Time | ||||
| 	// List of all authors who contributed | ||||
| 	Authors []Author | ||||
| 	// Copyright of the binary if any | ||||
| 	Copyright string | ||||
| 	// Name of Author (Note: Use App.Authors, this is deprecated) | ||||
| 	Author string | ||||
| 	// Email of Author (Note: Use App.Authors, this is deprecated) | ||||
| 	Email string | ||||
| 	// Writer writer to write output to | ||||
| 	Writer io.Writer | ||||
| 	// ErrWriter writes error output | ||||
| 	ErrWriter io.Writer | ||||
| 	// Other custom info | ||||
| 	Metadata map[string]interface{} | ||||
| 	// Carries a function which returns app specific info. | ||||
| 	ExtraInfo func() map[string]string | ||||
| 	// CustomAppHelpTemplate the text template for app help topic. | ||||
| 	// cli.go uses text/template to render templates. You can | ||||
| 	// render custom help text by setting this variable. | ||||
| 	CustomAppHelpTemplate string | ||||
|  | ||||
| 	didSetup bool | ||||
| } | ||||
|  | ||||
| // Tries to find out when this binary was compiled. | ||||
| // Returns the current time if it fails to find it. | ||||
| func compileTime() time.Time { | ||||
| 	info, err := os.Stat(os.Args[0]) | ||||
| 	if err != nil { | ||||
| 		return time.Now() | ||||
| 	} | ||||
| 	return info.ModTime() | ||||
| } | ||||
|  | ||||
| // NewApp creates a new cli Application with some reasonable defaults for Name, | ||||
| // Usage, Version and Action. | ||||
| func NewApp() *App { | ||||
| 	return &App{ | ||||
| 		Name:         filepath.Base(os.Args[0]), | ||||
| 		HelpName:     filepath.Base(os.Args[0]), | ||||
| 		Usage:        "A new cli application", | ||||
| 		UsageText:    "", | ||||
| 		Version:      "0.0.0", | ||||
| 		BashComplete: DefaultAppComplete, | ||||
| 		Action:       helpCommand.Action, | ||||
| 		Compiled:     compileTime(), | ||||
| 		Writer:       os.Stdout, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Setup runs initialization code to ensure all data structures are ready for | ||||
| // `Run` or inspection prior to `Run`.  It is internally called by `Run`, but | ||||
| // will return early if setup has already happened. | ||||
| func (a *App) Setup() { | ||||
| 	if a.didSetup { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	a.didSetup = true | ||||
|  | ||||
| 	if a.Author != "" || a.Email != "" { | ||||
| 		a.Authors = append(a.Authors, Author{Name: a.Author, Email: a.Email}) | ||||
| 	} | ||||
|  | ||||
| 	newCmds := []Command{} | ||||
| 	for _, c := range a.Commands { | ||||
| 		if c.HelpName == "" { | ||||
| 			c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) | ||||
| 		} | ||||
| 		newCmds = append(newCmds, c) | ||||
| 	} | ||||
| 	a.Commands = newCmds | ||||
|  | ||||
| 	if a.Command(helpCommand.Name) == nil && !a.HideHelp { | ||||
| 		a.Commands = append(a.Commands, helpCommand) | ||||
| 		if (HelpFlag != BoolFlag{}) { | ||||
| 			a.appendFlag(HelpFlag) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if !a.HideVersion { | ||||
| 		a.appendFlag(VersionFlag) | ||||
| 	} | ||||
|  | ||||
| 	a.categories = CommandCategories{} | ||||
| 	for _, command := range a.Commands { | ||||
| 		a.categories = a.categories.AddCommand(command.Category, command) | ||||
| 	} | ||||
| 	sort.Sort(a.categories) | ||||
|  | ||||
| 	if a.Metadata == nil { | ||||
| 		a.Metadata = make(map[string]interface{}) | ||||
| 	} | ||||
|  | ||||
| 	if a.Writer == nil { | ||||
| 		a.Writer = os.Stdout | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Run is the entry point to the cli app. Parses the arguments slice and routes | ||||
| // to the proper flag/args combination | ||||
| func (a *App) Run(arguments []string) (err error) { | ||||
| 	a.Setup() | ||||
|  | ||||
| 	// handle the completion flag separately from the flagset since | ||||
| 	// completion could be attempted after a flag, but before its value was put | ||||
| 	// on the command line. this causes the flagset to interpret the completion | ||||
| 	// flag name as the value of the flag before it which is undesirable | ||||
| 	// note that we can only do this because the shell autocomplete function | ||||
| 	// always appends the completion flag at the end of the command | ||||
| 	shellComplete, arguments := checkShellCompleteFlag(a, arguments) | ||||
|  | ||||
| 	// parse flags | ||||
| 	set, err := flagSet(a.Name, a.Flags) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	set.SetOutput(ioutil.Discard) | ||||
| 	err = set.Parse(arguments[1:]) | ||||
| 	nerr := normalizeFlags(a.Flags, set) | ||||
| 	context := NewContext(a, set, nil) | ||||
| 	if nerr != nil { | ||||
| 		fmt.Fprintln(a.Writer, nerr) | ||||
| 		ShowAppHelp(context) | ||||
| 		return nerr | ||||
| 	} | ||||
| 	context.shellComplete = shellComplete | ||||
|  | ||||
| 	if checkCompletions(context) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	if err != nil { | ||||
| 		if a.OnUsageError != nil { | ||||
| 			err := a.OnUsageError(context, err, false) | ||||
| 			HandleExitCoder(err) | ||||
| 			return err | ||||
| 		} | ||||
| 		fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) | ||||
| 		ShowAppHelp(context) | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if !a.HideHelp && checkHelp(context) { | ||||
| 		ShowAppHelp(context) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	if !a.HideVersion && checkVersion(context) { | ||||
| 		ShowVersion(context) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	if a.After != nil { | ||||
| 		defer func() { | ||||
| 			if afterErr := a.After(context); afterErr != nil { | ||||
| 				if err != nil { | ||||
| 					err = NewMultiError(err, afterErr) | ||||
| 				} else { | ||||
| 					err = afterErr | ||||
| 				} | ||||
| 			} | ||||
| 		}() | ||||
| 	} | ||||
|  | ||||
| 	if a.Before != nil { | ||||
| 		beforeErr := a.Before(context) | ||||
| 		if beforeErr != nil { | ||||
| 			ShowAppHelp(context) | ||||
| 			HandleExitCoder(beforeErr) | ||||
| 			err = beforeErr | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	args := context.Args() | ||||
| 	if args.Present() { | ||||
| 		name := args.First() | ||||
| 		c := a.Command(name) | ||||
| 		if c != nil { | ||||
| 			return c.Run(context) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if a.Action == nil { | ||||
| 		a.Action = helpCommand.Action | ||||
| 	} | ||||
|  | ||||
| 	// Run default Action | ||||
| 	err = HandleAction(a.Action, context) | ||||
|  | ||||
| 	HandleExitCoder(err) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // RunAndExitOnError calls .Run() and exits non-zero if an error was returned | ||||
| // | ||||
| // Deprecated: instead you should return an error that fulfills cli.ExitCoder | ||||
| // to cli.App.Run. This will cause the application to exit with the given eror | ||||
| // code in the cli.ExitCoder | ||||
| func (a *App) RunAndExitOnError() { | ||||
| 	if err := a.Run(os.Args); err != nil { | ||||
| 		fmt.Fprintln(a.errWriter(), err) | ||||
| 		OsExiter(1) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // RunAsSubcommand invokes the subcommand given the context, parses ctx.Args() to | ||||
| // generate command-specific flags | ||||
| func (a *App) RunAsSubcommand(ctx *Context) (err error) { | ||||
| 	// append help to commands | ||||
| 	if len(a.Commands) > 0 { | ||||
| 		if a.Command(helpCommand.Name) == nil && !a.HideHelp { | ||||
| 			a.Commands = append(a.Commands, helpCommand) | ||||
| 			if (HelpFlag != BoolFlag{}) { | ||||
| 				a.appendFlag(HelpFlag) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	newCmds := []Command{} | ||||
| 	for _, c := range a.Commands { | ||||
| 		if c.HelpName == "" { | ||||
| 			c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) | ||||
| 		} | ||||
| 		newCmds = append(newCmds, c) | ||||
| 	} | ||||
| 	a.Commands = newCmds | ||||
|  | ||||
| 	// parse flags | ||||
| 	set, err := flagSet(a.Name, a.Flags) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	set.SetOutput(ioutil.Discard) | ||||
| 	err = set.Parse(ctx.Args().Tail()) | ||||
| 	nerr := normalizeFlags(a.Flags, set) | ||||
| 	context := NewContext(a, set, ctx) | ||||
|  | ||||
| 	if nerr != nil { | ||||
| 		fmt.Fprintln(a.Writer, nerr) | ||||
| 		fmt.Fprintln(a.Writer) | ||||
| 		if len(a.Commands) > 0 { | ||||
| 			ShowSubcommandHelp(context) | ||||
| 		} else { | ||||
| 			ShowCommandHelp(ctx, context.Args().First()) | ||||
| 		} | ||||
| 		return nerr | ||||
| 	} | ||||
|  | ||||
| 	if checkCompletions(context) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	if err != nil { | ||||
| 		if a.OnUsageError != nil { | ||||
| 			err = a.OnUsageError(context, err, true) | ||||
| 			HandleExitCoder(err) | ||||
| 			return err | ||||
| 		} | ||||
| 		fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) | ||||
| 		ShowSubcommandHelp(context) | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if len(a.Commands) > 0 { | ||||
| 		if checkSubcommandHelp(context) { | ||||
| 			return nil | ||||
| 		} | ||||
| 	} else { | ||||
| 		if checkCommandHelp(ctx, context.Args().First()) { | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if a.After != nil { | ||||
| 		defer func() { | ||||
| 			afterErr := a.After(context) | ||||
| 			if afterErr != nil { | ||||
| 				HandleExitCoder(err) | ||||
| 				if err != nil { | ||||
| 					err = NewMultiError(err, afterErr) | ||||
| 				} else { | ||||
| 					err = afterErr | ||||
| 				} | ||||
| 			} | ||||
| 		}() | ||||
| 	} | ||||
|  | ||||
| 	if a.Before != nil { | ||||
| 		beforeErr := a.Before(context) | ||||
| 		if beforeErr != nil { | ||||
| 			HandleExitCoder(beforeErr) | ||||
| 			err = beforeErr | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	args := context.Args() | ||||
| 	if args.Present() { | ||||
| 		name := args.First() | ||||
| 		c := a.Command(name) | ||||
| 		if c != nil { | ||||
| 			return c.Run(context) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Run default Action | ||||
| 	err = HandleAction(a.Action, context) | ||||
|  | ||||
| 	HandleExitCoder(err) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // Command returns the named command on App. Returns nil if the command does not exist | ||||
| func (a *App) Command(name string) *Command { | ||||
| 	for _, c := range a.Commands { | ||||
| 		if c.HasName(name) { | ||||
| 			return &c | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Categories returns a slice containing all the categories with the commands they contain | ||||
| func (a *App) Categories() CommandCategories { | ||||
| 	return a.categories | ||||
| } | ||||
|  | ||||
| // VisibleCategories returns a slice of categories and commands that are | ||||
| // Hidden=false | ||||
| func (a *App) VisibleCategories() []*CommandCategory { | ||||
| 	ret := []*CommandCategory{} | ||||
| 	for _, category := range a.categories { | ||||
| 		if visible := func() *CommandCategory { | ||||
| 			for _, command := range category.Commands { | ||||
| 				if !command.Hidden { | ||||
| 					return category | ||||
| 				} | ||||
| 			} | ||||
| 			return nil | ||||
| 		}(); visible != nil { | ||||
| 			ret = append(ret, visible) | ||||
| 		} | ||||
| 	} | ||||
| 	return ret | ||||
| } | ||||
|  | ||||
| // VisibleCommands returns a slice of the Commands with Hidden=false | ||||
| func (a *App) VisibleCommands() []Command { | ||||
| 	ret := []Command{} | ||||
| 	for _, command := range a.Commands { | ||||
| 		if !command.Hidden { | ||||
| 			ret = append(ret, command) | ||||
| 		} | ||||
| 	} | ||||
| 	return ret | ||||
| } | ||||
|  | ||||
| // VisibleFlags returns a slice of the Flags with Hidden=false | ||||
| func (a *App) VisibleFlags() []Flag { | ||||
| 	return visibleFlags(a.Flags) | ||||
| } | ||||
|  | ||||
| func (a *App) hasFlag(flag Flag) bool { | ||||
| 	for _, f := range a.Flags { | ||||
| 		if flag == f { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (a *App) errWriter() io.Writer { | ||||
|  | ||||
| 	// When the app ErrWriter is nil use the package level one. | ||||
| 	if a.ErrWriter == nil { | ||||
| 		return ErrWriter | ||||
| 	} | ||||
|  | ||||
| 	return a.ErrWriter | ||||
| } | ||||
|  | ||||
| func (a *App) appendFlag(flag Flag) { | ||||
| 	if !a.hasFlag(flag) { | ||||
| 		a.Flags = append(a.Flags, flag) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Author represents someone who has contributed to a cli project. | ||||
| type Author struct { | ||||
| 	Name  string // The Authors name | ||||
| 	Email string // The Authors email | ||||
| } | ||||
|  | ||||
| // String makes Author comply to the Stringer interface, to allow an easy print in the templating process | ||||
| func (a Author) String() string { | ||||
| 	e := "" | ||||
| 	if a.Email != "" { | ||||
| 		e = " <" + a.Email + ">" | ||||
| 	} | ||||
|  | ||||
| 	return fmt.Sprintf("%v%v", a.Name, e) | ||||
| } | ||||
|  | ||||
| // HandleAction attempts to figure out which Action signature was used.  If | ||||
| // it's an ActionFunc or a func with the legacy signature for Action, the func | ||||
| // is run! | ||||
| func HandleAction(action interface{}, context *Context) (err error) { | ||||
| 	if a, ok := action.(ActionFunc); ok { | ||||
| 		return a(context) | ||||
| 	} else if a, ok := action.(func(*Context) error); ok { | ||||
| 		return a(context) | ||||
| 	} else if a, ok := action.(func(*Context)); ok { // deprecated function signature | ||||
| 		a(context) | ||||
| 		return nil | ||||
| 	} else { | ||||
| 		return errInvalidActionType | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										26
									
								
								vendor/github.com/urfave/cli/appveyor.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/urfave/cli/appveyor.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| version: "{build}" | ||||
|  | ||||
| os: Windows Server 2016 | ||||
|  | ||||
| image: Visual Studio 2017 | ||||
|  | ||||
| clone_folder: c:\gopath\src\github.com\urfave\cli | ||||
|  | ||||
| environment: | ||||
|   GOPATH: C:\gopath | ||||
|   GOVERSION: 1.8.x | ||||
|   PYTHON: C:\Python36-x64 | ||||
|   PYTHON_VERSION: 3.6.x | ||||
|   PYTHON_ARCH: 64 | ||||
|  | ||||
| install: | ||||
| - set PATH=%GOPATH%\bin;C:\go\bin;%PATH% | ||||
| - go version | ||||
| - go env | ||||
| - go get github.com/urfave/gfmrun/... | ||||
| - go get -v -t ./... | ||||
|  | ||||
| build_script: | ||||
| - python runtests vet | ||||
| - python runtests test | ||||
| - python runtests gfmrun | ||||
							
								
								
									
										44
									
								
								vendor/github.com/urfave/cli/category.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/urfave/cli/category.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| package cli | ||||
|  | ||||
| // CommandCategories is a slice of *CommandCategory. | ||||
| type CommandCategories []*CommandCategory | ||||
|  | ||||
| // CommandCategory is a category containing commands. | ||||
| type CommandCategory struct { | ||||
| 	Name     string | ||||
| 	Commands Commands | ||||
| } | ||||
|  | ||||
| func (c CommandCategories) Less(i, j int) bool { | ||||
| 	return c[i].Name < c[j].Name | ||||
| } | ||||
|  | ||||
| func (c CommandCategories) Len() int { | ||||
| 	return len(c) | ||||
| } | ||||
|  | ||||
| func (c CommandCategories) Swap(i, j int) { | ||||
| 	c[i], c[j] = c[j], c[i] | ||||
| } | ||||
|  | ||||
| // AddCommand adds a command to a category. | ||||
| func (c CommandCategories) AddCommand(category string, command Command) CommandCategories { | ||||
| 	for _, commandCategory := range c { | ||||
| 		if commandCategory.Name == category { | ||||
| 			commandCategory.Commands = append(commandCategory.Commands, command) | ||||
| 			return c | ||||
| 		} | ||||
| 	} | ||||
| 	return append(c, &CommandCategory{Name: category, Commands: []Command{command}}) | ||||
| } | ||||
|  | ||||
| // VisibleCommands returns a slice of the Commands with Hidden=false | ||||
| func (c *CommandCategory) VisibleCommands() []Command { | ||||
| 	ret := []Command{} | ||||
| 	for _, command := range c.Commands { | ||||
| 		if !command.Hidden { | ||||
| 			ret = append(ret, command) | ||||
| 		} | ||||
| 	} | ||||
| 	return ret | ||||
| } | ||||
							
								
								
									
										22
									
								
								vendor/github.com/urfave/cli/cli.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/urfave/cli/cli.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| // Package cli provides a minimal framework for creating and organizing command line | ||||
| // Go applications. cli is designed to be easy to understand and write, the most simple | ||||
| // cli application can be written as follows: | ||||
| //   func main() { | ||||
| //     cli.NewApp().Run(os.Args) | ||||
| //   } | ||||
| // | ||||
| // Of course this application does not do much, so let's make this an actual application: | ||||
| //   func main() { | ||||
| //     app := cli.NewApp() | ||||
| //     app.Name = "greet" | ||||
| //     app.Usage = "say a greeting" | ||||
| //     app.Action = func(c *cli.Context) error { | ||||
| //       println("Greetings") | ||||
| //       return nil | ||||
| //     } | ||||
| // | ||||
| //     app.Run(os.Args) | ||||
| //   } | ||||
| package cli | ||||
|  | ||||
| //go:generate python ./generate-flag-types cli -i flag-types.json -o flag_generated.go | ||||
							
								
								
									
										304
									
								
								vendor/github.com/urfave/cli/command.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										304
									
								
								vendor/github.com/urfave/cli/command.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,304 @@ | ||||
| package cli | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"sort" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // Command is a subcommand for a cli.App. | ||||
| type Command struct { | ||||
| 	// The name of the command | ||||
| 	Name string | ||||
| 	// short name of the command. Typically one character (deprecated, use `Aliases`) | ||||
| 	ShortName string | ||||
| 	// A list of aliases for the command | ||||
| 	Aliases []string | ||||
| 	// A short description of the usage of this command | ||||
| 	Usage string | ||||
| 	// Custom text to show on USAGE section of help | ||||
| 	UsageText string | ||||
| 	// A longer explanation of how the command works | ||||
| 	Description string | ||||
| 	// A short description of the arguments of this command | ||||
| 	ArgsUsage string | ||||
| 	// The category the command is part of | ||||
| 	Category string | ||||
| 	// The function to call when checking for bash command completions | ||||
| 	BashComplete BashCompleteFunc | ||||
| 	// An action to execute before any sub-subcommands are run, but after the context is ready | ||||
| 	// If a non-nil error is returned, no sub-subcommands are run | ||||
| 	Before BeforeFunc | ||||
| 	// An action to execute after any subcommands are run, but after the subcommand has finished | ||||
| 	// It is run even if Action() panics | ||||
| 	After AfterFunc | ||||
| 	// The function to call when this command is invoked | ||||
| 	Action interface{} | ||||
| 	// TODO: replace `Action: interface{}` with `Action: ActionFunc` once some kind | ||||
| 	// of deprecation period has passed, maybe? | ||||
|  | ||||
| 	// Execute this function if a usage error occurs. | ||||
| 	OnUsageError OnUsageErrorFunc | ||||
| 	// List of child commands | ||||
| 	Subcommands Commands | ||||
| 	// List of flags to parse | ||||
| 	Flags []Flag | ||||
| 	// Treat all flags as normal arguments if true | ||||
| 	SkipFlagParsing bool | ||||
| 	// Skip argument reordering which attempts to move flags before arguments, | ||||
| 	// but only works if all flags appear after all arguments. This behavior was | ||||
| 	// removed n version 2 since it only works under specific conditions so we | ||||
| 	// backport here by exposing it as an option for compatibility. | ||||
| 	SkipArgReorder bool | ||||
| 	// Boolean to hide built-in help command | ||||
| 	HideHelp bool | ||||
| 	// Boolean to hide this command from help or completion | ||||
| 	Hidden bool | ||||
|  | ||||
| 	// Full name of command for help, defaults to full command name, including parent commands. | ||||
| 	HelpName        string | ||||
| 	commandNamePath []string | ||||
|  | ||||
| 	// CustomHelpTemplate the text template for the command help topic. | ||||
| 	// cli.go uses text/template to render templates. You can | ||||
| 	// render custom help text by setting this variable. | ||||
| 	CustomHelpTemplate string | ||||
| } | ||||
|  | ||||
| type CommandsByName []Command | ||||
|  | ||||
| func (c CommandsByName) Len() int { | ||||
| 	return len(c) | ||||
| } | ||||
|  | ||||
| func (c CommandsByName) Less(i, j int) bool { | ||||
| 	return c[i].Name < c[j].Name | ||||
| } | ||||
|  | ||||
| func (c CommandsByName) Swap(i, j int) { | ||||
| 	c[i], c[j] = c[j], c[i] | ||||
| } | ||||
|  | ||||
| // FullName returns the full name of the command. | ||||
| // For subcommands this ensures that parent commands are part of the command path | ||||
| func (c Command) FullName() string { | ||||
| 	if c.commandNamePath == nil { | ||||
| 		return c.Name | ||||
| 	} | ||||
| 	return strings.Join(c.commandNamePath, " ") | ||||
| } | ||||
|  | ||||
| // Commands is a slice of Command | ||||
| type Commands []Command | ||||
|  | ||||
| // Run invokes the command given the context, parses ctx.Args() to generate command-specific flags | ||||
| func (c Command) Run(ctx *Context) (err error) { | ||||
| 	if len(c.Subcommands) > 0 { | ||||
| 		return c.startApp(ctx) | ||||
| 	} | ||||
|  | ||||
| 	if !c.HideHelp && (HelpFlag != BoolFlag{}) { | ||||
| 		// append help to flags | ||||
| 		c.Flags = append( | ||||
| 			c.Flags, | ||||
| 			HelpFlag, | ||||
| 		) | ||||
| 	} | ||||
|  | ||||
| 	set, err := flagSet(c.Name, c.Flags) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	set.SetOutput(ioutil.Discard) | ||||
|  | ||||
| 	if c.SkipFlagParsing { | ||||
| 		err = set.Parse(append([]string{"--"}, ctx.Args().Tail()...)) | ||||
| 	} else if !c.SkipArgReorder { | ||||
| 		firstFlagIndex := -1 | ||||
| 		terminatorIndex := -1 | ||||
| 		for index, arg := range ctx.Args() { | ||||
| 			if arg == "--" { | ||||
| 				terminatorIndex = index | ||||
| 				break | ||||
| 			} else if arg == "-" { | ||||
| 				// Do nothing. A dash alone is not really a flag. | ||||
| 				continue | ||||
| 			} else if strings.HasPrefix(arg, "-") && firstFlagIndex == -1 { | ||||
| 				firstFlagIndex = index | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if firstFlagIndex > -1 { | ||||
| 			args := ctx.Args() | ||||
| 			regularArgs := make([]string, len(args[1:firstFlagIndex])) | ||||
| 			copy(regularArgs, args[1:firstFlagIndex]) | ||||
|  | ||||
| 			var flagArgs []string | ||||
| 			if terminatorIndex > -1 { | ||||
| 				flagArgs = args[firstFlagIndex:terminatorIndex] | ||||
| 				regularArgs = append(regularArgs, args[terminatorIndex:]...) | ||||
| 			} else { | ||||
| 				flagArgs = args[firstFlagIndex:] | ||||
| 			} | ||||
|  | ||||
| 			err = set.Parse(append(flagArgs, regularArgs...)) | ||||
| 		} else { | ||||
| 			err = set.Parse(ctx.Args().Tail()) | ||||
| 		} | ||||
| 	} else { | ||||
| 		err = set.Parse(ctx.Args().Tail()) | ||||
| 	} | ||||
|  | ||||
| 	nerr := normalizeFlags(c.Flags, set) | ||||
| 	if nerr != nil { | ||||
| 		fmt.Fprintln(ctx.App.Writer, nerr) | ||||
| 		fmt.Fprintln(ctx.App.Writer) | ||||
| 		ShowCommandHelp(ctx, c.Name) | ||||
| 		return nerr | ||||
| 	} | ||||
|  | ||||
| 	context := NewContext(ctx.App, set, ctx) | ||||
| 	context.Command = c | ||||
| 	if checkCommandCompletions(context, c.Name) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	if err != nil { | ||||
| 		if c.OnUsageError != nil { | ||||
| 			err := c.OnUsageError(context, err, false) | ||||
| 			HandleExitCoder(err) | ||||
| 			return err | ||||
| 		} | ||||
| 		fmt.Fprintln(context.App.Writer, "Incorrect Usage:", err.Error()) | ||||
| 		fmt.Fprintln(context.App.Writer) | ||||
| 		ShowCommandHelp(context, c.Name) | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if checkCommandHelp(context, c.Name) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	if c.After != nil { | ||||
| 		defer func() { | ||||
| 			afterErr := c.After(context) | ||||
| 			if afterErr != nil { | ||||
| 				HandleExitCoder(err) | ||||
| 				if err != nil { | ||||
| 					err = NewMultiError(err, afterErr) | ||||
| 				} else { | ||||
| 					err = afterErr | ||||
| 				} | ||||
| 			} | ||||
| 		}() | ||||
| 	} | ||||
|  | ||||
| 	if c.Before != nil { | ||||
| 		err = c.Before(context) | ||||
| 		if err != nil { | ||||
| 			ShowCommandHelp(context, c.Name) | ||||
| 			HandleExitCoder(err) | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if c.Action == nil { | ||||
| 		c.Action = helpSubcommand.Action | ||||
| 	} | ||||
|  | ||||
| 	err = HandleAction(c.Action, context) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		HandleExitCoder(err) | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // Names returns the names including short names and aliases. | ||||
| func (c Command) Names() []string { | ||||
| 	names := []string{c.Name} | ||||
|  | ||||
| 	if c.ShortName != "" { | ||||
| 		names = append(names, c.ShortName) | ||||
| 	} | ||||
|  | ||||
| 	return append(names, c.Aliases...) | ||||
| } | ||||
|  | ||||
| // HasName returns true if Command.Name or Command.ShortName matches given name | ||||
| func (c Command) HasName(name string) bool { | ||||
| 	for _, n := range c.Names() { | ||||
| 		if n == name { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (c Command) startApp(ctx *Context) error { | ||||
| 	app := NewApp() | ||||
| 	app.Metadata = ctx.App.Metadata | ||||
| 	// set the name and usage | ||||
| 	app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name) | ||||
| 	if c.HelpName == "" { | ||||
| 		app.HelpName = c.HelpName | ||||
| 	} else { | ||||
| 		app.HelpName = app.Name | ||||
| 	} | ||||
|  | ||||
| 	app.Usage = c.Usage | ||||
| 	app.Description = c.Description | ||||
| 	app.ArgsUsage = c.ArgsUsage | ||||
|  | ||||
| 	// set CommandNotFound | ||||
| 	app.CommandNotFound = ctx.App.CommandNotFound | ||||
| 	app.CustomAppHelpTemplate = c.CustomHelpTemplate | ||||
|  | ||||
| 	// set the flags and commands | ||||
| 	app.Commands = c.Subcommands | ||||
| 	app.Flags = c.Flags | ||||
| 	app.HideHelp = c.HideHelp | ||||
|  | ||||
| 	app.Version = ctx.App.Version | ||||
| 	app.HideVersion = ctx.App.HideVersion | ||||
| 	app.Compiled = ctx.App.Compiled | ||||
| 	app.Author = ctx.App.Author | ||||
| 	app.Email = ctx.App.Email | ||||
| 	app.Writer = ctx.App.Writer | ||||
| 	app.ErrWriter = ctx.App.ErrWriter | ||||
|  | ||||
| 	app.categories = CommandCategories{} | ||||
| 	for _, command := range c.Subcommands { | ||||
| 		app.categories = app.categories.AddCommand(command.Category, command) | ||||
| 	} | ||||
|  | ||||
| 	sort.Sort(app.categories) | ||||
|  | ||||
| 	// bash completion | ||||
| 	app.EnableBashCompletion = ctx.App.EnableBashCompletion | ||||
| 	if c.BashComplete != nil { | ||||
| 		app.BashComplete = c.BashComplete | ||||
| 	} | ||||
|  | ||||
| 	// set the actions | ||||
| 	app.Before = c.Before | ||||
| 	app.After = c.After | ||||
| 	if c.Action != nil { | ||||
| 		app.Action = c.Action | ||||
| 	} else { | ||||
| 		app.Action = helpSubcommand.Action | ||||
| 	} | ||||
| 	app.OnUsageError = c.OnUsageError | ||||
|  | ||||
| 	for index, cc := range app.Commands { | ||||
| 		app.Commands[index].commandNamePath = []string{c.Name, cc.Name} | ||||
| 	} | ||||
|  | ||||
| 	return app.RunAsSubcommand(ctx) | ||||
| } | ||||
|  | ||||
| // VisibleFlags returns a slice of the Flags with Hidden=false | ||||
| func (c Command) VisibleFlags() []Flag { | ||||
| 	return visibleFlags(c.Flags) | ||||
| } | ||||
							
								
								
									
										278
									
								
								vendor/github.com/urfave/cli/context.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										278
									
								
								vendor/github.com/urfave/cli/context.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,278 @@ | ||||
| package cli | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"flag" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"syscall" | ||||
| ) | ||||
|  | ||||
| // Context is a type that is passed through to | ||||
| // each Handler action in a cli application. Context | ||||
| // can be used to retrieve context-specific Args and | ||||
| // parsed command-line options. | ||||
| type Context struct { | ||||
| 	App           *App | ||||
| 	Command       Command | ||||
| 	shellComplete bool | ||||
| 	flagSet       *flag.FlagSet | ||||
| 	setFlags      map[string]bool | ||||
| 	parentContext *Context | ||||
| } | ||||
|  | ||||
| // NewContext creates a new context. For use in when invoking an App or Command action. | ||||
| func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context { | ||||
| 	c := &Context{App: app, flagSet: set, parentContext: parentCtx} | ||||
|  | ||||
| 	if parentCtx != nil { | ||||
| 		c.shellComplete = parentCtx.shellComplete | ||||
| 	} | ||||
|  | ||||
| 	return c | ||||
| } | ||||
|  | ||||
| // NumFlags returns the number of flags set | ||||
| func (c *Context) NumFlags() int { | ||||
| 	return c.flagSet.NFlag() | ||||
| } | ||||
|  | ||||
| // Set sets a context flag to a value. | ||||
| func (c *Context) Set(name, value string) error { | ||||
| 	c.setFlags = nil | ||||
| 	return c.flagSet.Set(name, value) | ||||
| } | ||||
|  | ||||
| // GlobalSet sets a context flag to a value on the global flagset | ||||
| func (c *Context) GlobalSet(name, value string) error { | ||||
| 	globalContext(c).setFlags = nil | ||||
| 	return globalContext(c).flagSet.Set(name, value) | ||||
| } | ||||
|  | ||||
| // IsSet determines if the flag was actually set | ||||
| func (c *Context) IsSet(name string) bool { | ||||
| 	if c.setFlags == nil { | ||||
| 		c.setFlags = make(map[string]bool) | ||||
|  | ||||
| 		c.flagSet.Visit(func(f *flag.Flag) { | ||||
| 			c.setFlags[f.Name] = true | ||||
| 		}) | ||||
|  | ||||
| 		c.flagSet.VisitAll(func(f *flag.Flag) { | ||||
| 			if _, ok := c.setFlags[f.Name]; ok { | ||||
| 				return | ||||
| 			} | ||||
| 			c.setFlags[f.Name] = false | ||||
| 		}) | ||||
|  | ||||
| 		// XXX hack to support IsSet for flags with EnvVar | ||||
| 		// | ||||
| 		// There isn't an easy way to do this with the current implementation since | ||||
| 		// whether a flag was set via an environment variable is very difficult to | ||||
| 		// determine here. Instead, we intend to introduce a backwards incompatible | ||||
| 		// change in version 2 to add `IsSet` to the Flag interface to push the | ||||
| 		// responsibility closer to where the information required to determine | ||||
| 		// whether a flag is set by non-standard means such as environment | ||||
| 		// variables is avaliable. | ||||
| 		// | ||||
| 		// See https://github.com/urfave/cli/issues/294 for additional discussion | ||||
| 		flags := c.Command.Flags | ||||
| 		if c.Command.Name == "" { // cannot == Command{} since it contains slice types | ||||
| 			if c.App != nil { | ||||
| 				flags = c.App.Flags | ||||
| 			} | ||||
| 		} | ||||
| 		for _, f := range flags { | ||||
| 			eachName(f.GetName(), func(name string) { | ||||
| 				if isSet, ok := c.setFlags[name]; isSet || !ok { | ||||
| 					return | ||||
| 				} | ||||
|  | ||||
| 				val := reflect.ValueOf(f) | ||||
| 				if val.Kind() == reflect.Ptr { | ||||
| 					val = val.Elem() | ||||
| 				} | ||||
|  | ||||
| 				envVarValue := val.FieldByName("EnvVar") | ||||
| 				if !envVarValue.IsValid() { | ||||
| 					return | ||||
| 				} | ||||
|  | ||||
| 				eachName(envVarValue.String(), func(envVar string) { | ||||
| 					envVar = strings.TrimSpace(envVar) | ||||
| 					if _, ok := syscall.Getenv(envVar); ok { | ||||
| 						c.setFlags[name] = true | ||||
| 						return | ||||
| 					} | ||||
| 				}) | ||||
| 			}) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return c.setFlags[name] | ||||
| } | ||||
|  | ||||
| // GlobalIsSet determines if the global flag was actually set | ||||
| func (c *Context) GlobalIsSet(name string) bool { | ||||
| 	ctx := c | ||||
| 	if ctx.parentContext != nil { | ||||
| 		ctx = ctx.parentContext | ||||
| 	} | ||||
|  | ||||
| 	for ; ctx != nil; ctx = ctx.parentContext { | ||||
| 		if ctx.IsSet(name) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // FlagNames returns a slice of flag names used in this context. | ||||
| func (c *Context) FlagNames() (names []string) { | ||||
| 	for _, flag := range c.Command.Flags { | ||||
| 		name := strings.Split(flag.GetName(), ",")[0] | ||||
| 		if name == "help" { | ||||
| 			continue | ||||
| 		} | ||||
| 		names = append(names, name) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // GlobalFlagNames returns a slice of global flag names used by the app. | ||||
| func (c *Context) GlobalFlagNames() (names []string) { | ||||
| 	for _, flag := range c.App.Flags { | ||||
| 		name := strings.Split(flag.GetName(), ",")[0] | ||||
| 		if name == "help" || name == "version" { | ||||
| 			continue | ||||
| 		} | ||||
| 		names = append(names, name) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Parent returns the parent context, if any | ||||
| func (c *Context) Parent() *Context { | ||||
| 	return c.parentContext | ||||
| } | ||||
|  | ||||
| // value returns the value of the flag coressponding to `name` | ||||
| func (c *Context) value(name string) interface{} { | ||||
| 	return c.flagSet.Lookup(name).Value.(flag.Getter).Get() | ||||
| } | ||||
|  | ||||
| // Args contains apps console arguments | ||||
| type Args []string | ||||
|  | ||||
| // Args returns the command line arguments associated with the context. | ||||
| func (c *Context) Args() Args { | ||||
| 	args := Args(c.flagSet.Args()) | ||||
| 	return args | ||||
| } | ||||
|  | ||||
| // NArg returns the number of the command line arguments. | ||||
| func (c *Context) NArg() int { | ||||
| 	return len(c.Args()) | ||||
| } | ||||
|  | ||||
| // Get returns the nth argument, or else a blank string | ||||
| func (a Args) Get(n int) string { | ||||
| 	if len(a) > n { | ||||
| 		return a[n] | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| // First returns the first argument, or else a blank string | ||||
| func (a Args) First() string { | ||||
| 	return a.Get(0) | ||||
| } | ||||
|  | ||||
| // Tail returns the rest of the arguments (not the first one) | ||||
| // or else an empty string slice | ||||
| func (a Args) Tail() []string { | ||||
| 	if len(a) >= 2 { | ||||
| 		return []string(a)[1:] | ||||
| 	} | ||||
| 	return []string{} | ||||
| } | ||||
|  | ||||
| // Present checks if there are any arguments present | ||||
| func (a Args) Present() bool { | ||||
| 	return len(a) != 0 | ||||
| } | ||||
|  | ||||
| // Swap swaps arguments at the given indexes | ||||
| func (a Args) Swap(from, to int) error { | ||||
| 	if from >= len(a) || to >= len(a) { | ||||
| 		return errors.New("index out of range") | ||||
| 	} | ||||
| 	a[from], a[to] = a[to], a[from] | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func globalContext(ctx *Context) *Context { | ||||
| 	if ctx == nil { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	for { | ||||
| 		if ctx.parentContext == nil { | ||||
| 			return ctx | ||||
| 		} | ||||
| 		ctx = ctx.parentContext | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet { | ||||
| 	if ctx.parentContext != nil { | ||||
| 		ctx = ctx.parentContext | ||||
| 	} | ||||
| 	for ; ctx != nil; ctx = ctx.parentContext { | ||||
| 		if f := ctx.flagSet.Lookup(name); f != nil { | ||||
| 			return ctx.flagSet | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) { | ||||
| 	switch ff.Value.(type) { | ||||
| 	case *StringSlice: | ||||
| 	default: | ||||
| 		set.Set(name, ff.Value.String()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func normalizeFlags(flags []Flag, set *flag.FlagSet) error { | ||||
| 	visited := make(map[string]bool) | ||||
| 	set.Visit(func(f *flag.Flag) { | ||||
| 		visited[f.Name] = true | ||||
| 	}) | ||||
| 	for _, f := range flags { | ||||
| 		parts := strings.Split(f.GetName(), ",") | ||||
| 		if len(parts) == 1 { | ||||
| 			continue | ||||
| 		} | ||||
| 		var ff *flag.Flag | ||||
| 		for _, name := range parts { | ||||
| 			name = strings.Trim(name, " ") | ||||
| 			if visited[name] { | ||||
| 				if ff != nil { | ||||
| 					return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name) | ||||
| 				} | ||||
| 				ff = set.Lookup(name) | ||||
| 			} | ||||
| 		} | ||||
| 		if ff == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		for _, name := range parts { | ||||
| 			name = strings.Trim(name, " ") | ||||
| 			if !visited[name] { | ||||
| 				copyFlag(name, ff, set) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										115
									
								
								vendor/github.com/urfave/cli/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								vendor/github.com/urfave/cli/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | ||||
| package cli | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // OsExiter is the function used when the app exits. If not set defaults to os.Exit. | ||||
| var OsExiter = os.Exit | ||||
|  | ||||
| // ErrWriter is used to write errors to the user. This can be anything | ||||
| // implementing the io.Writer interface and defaults to os.Stderr. | ||||
| var ErrWriter io.Writer = os.Stderr | ||||
|  | ||||
| // MultiError is an error that wraps multiple errors. | ||||
| type MultiError struct { | ||||
| 	Errors []error | ||||
| } | ||||
|  | ||||
| // NewMultiError creates a new MultiError. Pass in one or more errors. | ||||
| func NewMultiError(err ...error) MultiError { | ||||
| 	return MultiError{Errors: err} | ||||
| } | ||||
|  | ||||
| // Error implements the error interface. | ||||
| func (m MultiError) Error() string { | ||||
| 	errs := make([]string, len(m.Errors)) | ||||
| 	for i, err := range m.Errors { | ||||
| 		errs[i] = err.Error() | ||||
| 	} | ||||
|  | ||||
| 	return strings.Join(errs, "\n") | ||||
| } | ||||
|  | ||||
| type ErrorFormatter interface { | ||||
| 	Format(s fmt.State, verb rune) | ||||
| } | ||||
|  | ||||
| // ExitCoder is the interface checked by `App` and `Command` for a custom exit | ||||
| // code | ||||
| type ExitCoder interface { | ||||
| 	error | ||||
| 	ExitCode() int | ||||
| } | ||||
|  | ||||
| // ExitError fulfills both the builtin `error` interface and `ExitCoder` | ||||
| type ExitError struct { | ||||
| 	exitCode int | ||||
| 	message  interface{} | ||||
| } | ||||
|  | ||||
| // NewExitError makes a new *ExitError | ||||
| func NewExitError(message interface{}, exitCode int) *ExitError { | ||||
| 	return &ExitError{ | ||||
| 		exitCode: exitCode, | ||||
| 		message:  message, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Error returns the string message, fulfilling the interface required by | ||||
| // `error` | ||||
| func (ee *ExitError) Error() string { | ||||
| 	return fmt.Sprintf("%v", ee.message) | ||||
| } | ||||
|  | ||||
| // ExitCode returns the exit code, fulfilling the interface required by | ||||
| // `ExitCoder` | ||||
| func (ee *ExitError) ExitCode() int { | ||||
| 	return ee.exitCode | ||||
| } | ||||
|  | ||||
| // HandleExitCoder checks if the error fulfills the ExitCoder interface, and if | ||||
| // so prints the error to stderr (if it is non-empty) and calls OsExiter with the | ||||
| // given exit code.  If the given error is a MultiError, then this func is | ||||
| // called on all members of the Errors slice and calls OsExiter with the last exit code. | ||||
| func HandleExitCoder(err error) { | ||||
| 	if err == nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if exitErr, ok := err.(ExitCoder); ok { | ||||
| 		if err.Error() != "" { | ||||
| 			if _, ok := exitErr.(ErrorFormatter); ok { | ||||
| 				fmt.Fprintf(ErrWriter, "%+v\n", err) | ||||
| 			} else { | ||||
| 				fmt.Fprintln(ErrWriter, err) | ||||
| 			} | ||||
| 		} | ||||
| 		OsExiter(exitErr.ExitCode()) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if multiErr, ok := err.(MultiError); ok { | ||||
| 		code := handleMultiError(multiErr) | ||||
| 		OsExiter(code) | ||||
| 		return | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func handleMultiError(multiErr MultiError) int { | ||||
| 	code := 1 | ||||
| 	for _, merr := range multiErr.Errors { | ||||
| 		if multiErr2, ok := merr.(MultiError); ok { | ||||
| 			code = handleMultiError(multiErr2) | ||||
| 		} else { | ||||
| 			fmt.Fprintln(ErrWriter, merr) | ||||
| 			if exitErr, ok := merr.(ExitCoder); ok { | ||||
| 				code = exitErr.ExitCode() | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return code | ||||
| } | ||||
							
								
								
									
										93
									
								
								vendor/github.com/urfave/cli/flag-types.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								vendor/github.com/urfave/cli/flag-types.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| [ | ||||
|   { | ||||
|     "name": "Bool", | ||||
|     "type": "bool", | ||||
|     "value": false, | ||||
|     "context_default": "false", | ||||
|     "parser": "strconv.ParseBool(f.Value.String())" | ||||
|   }, | ||||
|   { | ||||
|     "name": "BoolT", | ||||
|     "type": "bool", | ||||
|     "value": false, | ||||
|     "doctail": " that is true by default", | ||||
|     "context_default": "false", | ||||
|     "parser": "strconv.ParseBool(f.Value.String())" | ||||
|   }, | ||||
|   { | ||||
|     "name": "Duration", | ||||
|     "type": "time.Duration", | ||||
|     "doctail": " (see https://golang.org/pkg/time/#ParseDuration)", | ||||
|     "context_default": "0", | ||||
|     "parser": "time.ParseDuration(f.Value.String())" | ||||
|   }, | ||||
|   { | ||||
|     "name": "Float64", | ||||
|     "type": "float64", | ||||
|     "context_default": "0", | ||||
|     "parser": "strconv.ParseFloat(f.Value.String(), 64)" | ||||
|   }, | ||||
|   { | ||||
|     "name": "Generic", | ||||
|     "type": "Generic", | ||||
|     "dest": false, | ||||
|     "context_default": "nil", | ||||
|     "context_type": "interface{}" | ||||
|   }, | ||||
|   { | ||||
|     "name": "Int64", | ||||
|     "type": "int64", | ||||
|     "context_default": "0", | ||||
|     "parser": "strconv.ParseInt(f.Value.String(), 0, 64)" | ||||
|   }, | ||||
|   { | ||||
|     "name": "Int", | ||||
|     "type": "int", | ||||
|     "context_default": "0", | ||||
|     "parser": "strconv.ParseInt(f.Value.String(), 0, 64)", | ||||
|     "parser_cast": "int(parsed)" | ||||
|   }, | ||||
|   { | ||||
|     "name": "IntSlice", | ||||
|     "type": "*IntSlice", | ||||
|     "dest": false, | ||||
|     "context_default": "nil", | ||||
|     "context_type": "[]int", | ||||
|     "parser": "(f.Value.(*IntSlice)).Value(), error(nil)" | ||||
|   }, | ||||
|   { | ||||
|     "name": "Int64Slice", | ||||
|     "type": "*Int64Slice", | ||||
|     "dest": false, | ||||
|     "context_default": "nil", | ||||
|     "context_type": "[]int64", | ||||
|     "parser": "(f.Value.(*Int64Slice)).Value(), error(nil)" | ||||
|   }, | ||||
|   { | ||||
|     "name": "String", | ||||
|     "type": "string", | ||||
|     "context_default": "\"\"", | ||||
|     "parser": "f.Value.String(), error(nil)" | ||||
|   }, | ||||
|   { | ||||
|     "name": "StringSlice", | ||||
|     "type": "*StringSlice", | ||||
|     "dest": false, | ||||
|     "context_default": "nil", | ||||
|     "context_type": "[]string", | ||||
|     "parser": "(f.Value.(*StringSlice)).Value(), error(nil)" | ||||
|   }, | ||||
|   { | ||||
|     "name": "Uint64", | ||||
|     "type": "uint64", | ||||
|     "context_default": "0", | ||||
|     "parser": "strconv.ParseUint(f.Value.String(), 0, 64)" | ||||
|   }, | ||||
|   { | ||||
|     "name": "Uint", | ||||
|     "type": "uint", | ||||
|     "context_default": "0", | ||||
|     "parser": "strconv.ParseUint(f.Value.String(), 0, 64)", | ||||
|     "parser_cast": "uint(parsed)" | ||||
|   } | ||||
| ] | ||||
							
								
								
									
										799
									
								
								vendor/github.com/urfave/cli/flag.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										799
									
								
								vendor/github.com/urfave/cli/flag.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,799 @@ | ||||
| package cli | ||||
|  | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"runtime" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"syscall" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| const defaultPlaceholder = "value" | ||||
|  | ||||
| // BashCompletionFlag enables bash-completion for all commands and subcommands | ||||
| var BashCompletionFlag Flag = BoolFlag{ | ||||
| 	Name:   "generate-bash-completion", | ||||
| 	Hidden: true, | ||||
| } | ||||
|  | ||||
| // VersionFlag prints the version for the application | ||||
| var VersionFlag Flag = BoolFlag{ | ||||
| 	Name:  "version, v", | ||||
| 	Usage: "print the version", | ||||
| } | ||||
|  | ||||
| // HelpFlag prints the help for all commands and subcommands | ||||
| // Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand | ||||
| // unless HideHelp is set to true) | ||||
| var HelpFlag Flag = BoolFlag{ | ||||
| 	Name:  "help, h", | ||||
| 	Usage: "show help", | ||||
| } | ||||
|  | ||||
| // FlagStringer converts a flag definition to a string. This is used by help | ||||
| // to display a flag. | ||||
| var FlagStringer FlagStringFunc = stringifyFlag | ||||
|  | ||||
| // FlagsByName is a slice of Flag. | ||||
| type FlagsByName []Flag | ||||
|  | ||||
| func (f FlagsByName) Len() int { | ||||
| 	return len(f) | ||||
| } | ||||
|  | ||||
| func (f FlagsByName) Less(i, j int) bool { | ||||
| 	return f[i].GetName() < f[j].GetName() | ||||
| } | ||||
|  | ||||
| func (f FlagsByName) Swap(i, j int) { | ||||
| 	f[i], f[j] = f[j], f[i] | ||||
| } | ||||
|  | ||||
| // Flag is a common interface related to parsing flags in cli. | ||||
| // For more advanced flag parsing techniques, it is recommended that | ||||
| // this interface be implemented. | ||||
| type Flag interface { | ||||
| 	fmt.Stringer | ||||
| 	// Apply Flag settings to the given flag set | ||||
| 	Apply(*flag.FlagSet) | ||||
| 	GetName() string | ||||
| } | ||||
|  | ||||
| // errorableFlag is an interface that allows us to return errors during apply | ||||
| // it allows flags defined in this library to return errors in a fashion backwards compatible | ||||
| // TODO remove in v2 and modify the existing Flag interface to return errors | ||||
| type errorableFlag interface { | ||||
| 	Flag | ||||
|  | ||||
| 	ApplyWithError(*flag.FlagSet) error | ||||
| } | ||||
|  | ||||
| func flagSet(name string, flags []Flag) (*flag.FlagSet, error) { | ||||
| 	set := flag.NewFlagSet(name, flag.ContinueOnError) | ||||
|  | ||||
| 	for _, f := range flags { | ||||
| 		//TODO remove in v2 when errorableFlag is removed | ||||
| 		if ef, ok := f.(errorableFlag); ok { | ||||
| 			if err := ef.ApplyWithError(set); err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 		} else { | ||||
| 			f.Apply(set) | ||||
| 		} | ||||
| 	} | ||||
| 	return set, nil | ||||
| } | ||||
|  | ||||
| func eachName(longName string, fn func(string)) { | ||||
| 	parts := strings.Split(longName, ",") | ||||
| 	for _, name := range parts { | ||||
| 		name = strings.Trim(name, " ") | ||||
| 		fn(name) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Generic is a generic parseable type identified by a specific flag | ||||
| type Generic interface { | ||||
| 	Set(value string) error | ||||
| 	String() string | ||||
| } | ||||
|  | ||||
| // Apply takes the flagset and calls Set on the generic flag with the value | ||||
| // provided by the user for parsing by the flag | ||||
| // Ignores parsing errors | ||||
| func (f GenericFlag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError takes the flagset and calls Set on the generic flag with the value | ||||
| // provided by the user for parsing by the flag | ||||
| func (f GenericFlag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	val := f.Value | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				if err := val.Set(envVal); err != nil { | ||||
| 					return fmt.Errorf("could not parse %s as value for flag %s: %s", envVal, f.Name, err) | ||||
| 				} | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		set.Var(f.Value, name, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // StringSlice is an opaque type for []string to satisfy flag.Value and flag.Getter | ||||
| type StringSlice []string | ||||
|  | ||||
| // Set appends the string value to the list of values | ||||
| func (f *StringSlice) Set(value string) error { | ||||
| 	*f = append(*f, value) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value (for usage defaults) | ||||
| func (f *StringSlice) String() string { | ||||
| 	return fmt.Sprintf("%s", *f) | ||||
| } | ||||
|  | ||||
| // Value returns the slice of strings set by this flag | ||||
| func (f *StringSlice) Value() []string { | ||||
| 	return *f | ||||
| } | ||||
|  | ||||
| // Get returns the slice of strings set by this flag | ||||
| func (f *StringSlice) Get() interface{} { | ||||
| 	return *f | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f StringSliceFlag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f StringSliceFlag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				newVal := &StringSlice{} | ||||
| 				for _, s := range strings.Split(envVal, ",") { | ||||
| 					s = strings.TrimSpace(s) | ||||
| 					if err := newVal.Set(s); err != nil { | ||||
| 						return fmt.Errorf("could not parse %s as string value for flag %s: %s", envVal, f.Name, err) | ||||
| 					} | ||||
| 				} | ||||
| 				f.Value = newVal | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Value == nil { | ||||
| 			f.Value = &StringSlice{} | ||||
| 		} | ||||
| 		set.Var(f.Value, name, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // IntSlice is an opaque type for []int to satisfy flag.Value and flag.Getter | ||||
| type IntSlice []int | ||||
|  | ||||
| // Set parses the value into an integer and appends it to the list of values | ||||
| func (f *IntSlice) Set(value string) error { | ||||
| 	tmp, err := strconv.Atoi(value) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*f = append(*f, tmp) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value (for usage defaults) | ||||
| func (f *IntSlice) String() string { | ||||
| 	return fmt.Sprintf("%#v", *f) | ||||
| } | ||||
|  | ||||
| // Value returns the slice of ints set by this flag | ||||
| func (f *IntSlice) Value() []int { | ||||
| 	return *f | ||||
| } | ||||
|  | ||||
| // Get returns the slice of ints set by this flag | ||||
| func (f *IntSlice) Get() interface{} { | ||||
| 	return *f | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f IntSliceFlag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f IntSliceFlag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				newVal := &IntSlice{} | ||||
| 				for _, s := range strings.Split(envVal, ",") { | ||||
| 					s = strings.TrimSpace(s) | ||||
| 					if err := newVal.Set(s); err != nil { | ||||
| 						return fmt.Errorf("could not parse %s as int slice value for flag %s: %s", envVal, f.Name, err) | ||||
| 					} | ||||
| 				} | ||||
| 				f.Value = newVal | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Value == nil { | ||||
| 			f.Value = &IntSlice{} | ||||
| 		} | ||||
| 		set.Var(f.Value, name, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Int64Slice is an opaque type for []int to satisfy flag.Value and flag.Getter | ||||
| type Int64Slice []int64 | ||||
|  | ||||
| // Set parses the value into an integer and appends it to the list of values | ||||
| func (f *Int64Slice) Set(value string) error { | ||||
| 	tmp, err := strconv.ParseInt(value, 10, 64) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*f = append(*f, tmp) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value (for usage defaults) | ||||
| func (f *Int64Slice) String() string { | ||||
| 	return fmt.Sprintf("%#v", *f) | ||||
| } | ||||
|  | ||||
| // Value returns the slice of ints set by this flag | ||||
| func (f *Int64Slice) Value() []int64 { | ||||
| 	return *f | ||||
| } | ||||
|  | ||||
| // Get returns the slice of ints set by this flag | ||||
| func (f *Int64Slice) Get() interface{} { | ||||
| 	return *f | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f Int64SliceFlag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f Int64SliceFlag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				newVal := &Int64Slice{} | ||||
| 				for _, s := range strings.Split(envVal, ",") { | ||||
| 					s = strings.TrimSpace(s) | ||||
| 					if err := newVal.Set(s); err != nil { | ||||
| 						return fmt.Errorf("could not parse %s as int64 slice value for flag %s: %s", envVal, f.Name, err) | ||||
| 					} | ||||
| 				} | ||||
| 				f.Value = newVal | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Value == nil { | ||||
| 			f.Value = &Int64Slice{} | ||||
| 		} | ||||
| 		set.Var(f.Value, name, f.Usage) | ||||
| 	}) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f BoolFlag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f BoolFlag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	val := false | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				if envVal == "" { | ||||
| 					val = false | ||||
| 					break | ||||
| 				} | ||||
|  | ||||
| 				envValBool, err := strconv.ParseBool(envVal) | ||||
| 				if err != nil { | ||||
| 					return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) | ||||
| 				} | ||||
|  | ||||
| 				val = envValBool | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Destination != nil { | ||||
| 			set.BoolVar(f.Destination, name, val, f.Usage) | ||||
| 			return | ||||
| 		} | ||||
| 		set.Bool(name, val, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f BoolTFlag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f BoolTFlag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	val := true | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				if envVal == "" { | ||||
| 					val = false | ||||
| 					break | ||||
| 				} | ||||
|  | ||||
| 				envValBool, err := strconv.ParseBool(envVal) | ||||
| 				if err != nil { | ||||
| 					return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) | ||||
| 				} | ||||
|  | ||||
| 				val = envValBool | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Destination != nil { | ||||
| 			set.BoolVar(f.Destination, name, val, f.Usage) | ||||
| 			return | ||||
| 		} | ||||
| 		set.Bool(name, val, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f StringFlag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f StringFlag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				f.Value = envVal | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Destination != nil { | ||||
| 			set.StringVar(f.Destination, name, f.Value, f.Usage) | ||||
| 			return | ||||
| 		} | ||||
| 		set.String(name, f.Value, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f IntFlag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f IntFlag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				envValInt, err := strconv.ParseInt(envVal, 0, 64) | ||||
| 				if err != nil { | ||||
| 					return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) | ||||
| 				} | ||||
| 				f.Value = int(envValInt) | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Destination != nil { | ||||
| 			set.IntVar(f.Destination, name, f.Value, f.Usage) | ||||
| 			return | ||||
| 		} | ||||
| 		set.Int(name, f.Value, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f Int64Flag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f Int64Flag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				envValInt, err := strconv.ParseInt(envVal, 0, 64) | ||||
| 				if err != nil { | ||||
| 					return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) | ||||
| 				} | ||||
|  | ||||
| 				f.Value = envValInt | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Destination != nil { | ||||
| 			set.Int64Var(f.Destination, name, f.Value, f.Usage) | ||||
| 			return | ||||
| 		} | ||||
| 		set.Int64(name, f.Value, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f UintFlag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f UintFlag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				envValInt, err := strconv.ParseUint(envVal, 0, 64) | ||||
| 				if err != nil { | ||||
| 					return fmt.Errorf("could not parse %s as uint value for flag %s: %s", envVal, f.Name, err) | ||||
| 				} | ||||
|  | ||||
| 				f.Value = uint(envValInt) | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Destination != nil { | ||||
| 			set.UintVar(f.Destination, name, f.Value, f.Usage) | ||||
| 			return | ||||
| 		} | ||||
| 		set.Uint(name, f.Value, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f Uint64Flag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f Uint64Flag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				envValInt, err := strconv.ParseUint(envVal, 0, 64) | ||||
| 				if err != nil { | ||||
| 					return fmt.Errorf("could not parse %s as uint64 value for flag %s: %s", envVal, f.Name, err) | ||||
| 				} | ||||
|  | ||||
| 				f.Value = uint64(envValInt) | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Destination != nil { | ||||
| 			set.Uint64Var(f.Destination, name, f.Value, f.Usage) | ||||
| 			return | ||||
| 		} | ||||
| 		set.Uint64(name, f.Value, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f DurationFlag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f DurationFlag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				envValDuration, err := time.ParseDuration(envVal) | ||||
| 				if err != nil { | ||||
| 					return fmt.Errorf("could not parse %s as duration for flag %s: %s", envVal, f.Name, err) | ||||
| 				} | ||||
|  | ||||
| 				f.Value = envValDuration | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Destination != nil { | ||||
| 			set.DurationVar(f.Destination, name, f.Value, f.Usage) | ||||
| 			return | ||||
| 		} | ||||
| 		set.Duration(name, f.Value, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Apply populates the flag given the flag set and environment | ||||
| // Ignores errors | ||||
| func (f Float64Flag) Apply(set *flag.FlagSet) { | ||||
| 	f.ApplyWithError(set) | ||||
| } | ||||
|  | ||||
| // ApplyWithError populates the flag given the flag set and environment | ||||
| func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error { | ||||
| 	if f.EnvVar != "" { | ||||
| 		for _, envVar := range strings.Split(f.EnvVar, ",") { | ||||
| 			envVar = strings.TrimSpace(envVar) | ||||
| 			if envVal, ok := syscall.Getenv(envVar); ok { | ||||
| 				envValFloat, err := strconv.ParseFloat(envVal, 10) | ||||
| 				if err != nil { | ||||
| 					return fmt.Errorf("could not parse %s as float64 value for flag %s: %s", envVal, f.Name, err) | ||||
| 				} | ||||
|  | ||||
| 				f.Value = float64(envValFloat) | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	eachName(f.Name, func(name string) { | ||||
| 		if f.Destination != nil { | ||||
| 			set.Float64Var(f.Destination, name, f.Value, f.Usage) | ||||
| 			return | ||||
| 		} | ||||
| 		set.Float64(name, f.Value, f.Usage) | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func visibleFlags(fl []Flag) []Flag { | ||||
| 	visible := []Flag{} | ||||
| 	for _, flag := range fl { | ||||
| 		field := flagValue(flag).FieldByName("Hidden") | ||||
| 		if !field.IsValid() || !field.Bool() { | ||||
| 			visible = append(visible, flag) | ||||
| 		} | ||||
| 	} | ||||
| 	return visible | ||||
| } | ||||
|  | ||||
| func prefixFor(name string) (prefix string) { | ||||
| 	if len(name) == 1 { | ||||
| 		prefix = "-" | ||||
| 	} else { | ||||
| 		prefix = "--" | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Returns the placeholder, if any, and the unquoted usage string. | ||||
| func unquoteUsage(usage string) (string, string) { | ||||
| 	for i := 0; i < len(usage); i++ { | ||||
| 		if usage[i] == '`' { | ||||
| 			for j := i + 1; j < len(usage); j++ { | ||||
| 				if usage[j] == '`' { | ||||
| 					name := usage[i+1 : j] | ||||
| 					usage = usage[:i] + name + usage[j+1:] | ||||
| 					return name, usage | ||||
| 				} | ||||
| 			} | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return "", usage | ||||
| } | ||||
|  | ||||
| func prefixedNames(fullName, placeholder string) string { | ||||
| 	var prefixed string | ||||
| 	parts := strings.Split(fullName, ",") | ||||
| 	for i, name := range parts { | ||||
| 		name = strings.Trim(name, " ") | ||||
| 		prefixed += prefixFor(name) + name | ||||
| 		if placeholder != "" { | ||||
| 			prefixed += " " + placeholder | ||||
| 		} | ||||
| 		if i < len(parts)-1 { | ||||
| 			prefixed += ", " | ||||
| 		} | ||||
| 	} | ||||
| 	return prefixed | ||||
| } | ||||
|  | ||||
| func withEnvHint(envVar, str string) string { | ||||
| 	envText := "" | ||||
| 	if envVar != "" { | ||||
| 		prefix := "$" | ||||
| 		suffix := "" | ||||
| 		sep := ", $" | ||||
| 		if runtime.GOOS == "windows" { | ||||
| 			prefix = "%" | ||||
| 			suffix = "%" | ||||
| 			sep = "%, %" | ||||
| 		} | ||||
| 		envText = fmt.Sprintf(" [%s%s%s]", prefix, strings.Join(strings.Split(envVar, ","), sep), suffix) | ||||
| 	} | ||||
| 	return str + envText | ||||
| } | ||||
|  | ||||
| func flagValue(f Flag) reflect.Value { | ||||
| 	fv := reflect.ValueOf(f) | ||||
| 	for fv.Kind() == reflect.Ptr { | ||||
| 		fv = reflect.Indirect(fv) | ||||
| 	} | ||||
| 	return fv | ||||
| } | ||||
|  | ||||
| func stringifyFlag(f Flag) string { | ||||
| 	fv := flagValue(f) | ||||
|  | ||||
| 	switch f.(type) { | ||||
| 	case IntSliceFlag: | ||||
| 		return withEnvHint(fv.FieldByName("EnvVar").String(), | ||||
| 			stringifyIntSliceFlag(f.(IntSliceFlag))) | ||||
| 	case Int64SliceFlag: | ||||
| 		return withEnvHint(fv.FieldByName("EnvVar").String(), | ||||
| 			stringifyInt64SliceFlag(f.(Int64SliceFlag))) | ||||
| 	case StringSliceFlag: | ||||
| 		return withEnvHint(fv.FieldByName("EnvVar").String(), | ||||
| 			stringifyStringSliceFlag(f.(StringSliceFlag))) | ||||
| 	} | ||||
|  | ||||
| 	placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String()) | ||||
|  | ||||
| 	needsPlaceholder := false | ||||
| 	defaultValueString := "" | ||||
|  | ||||
| 	if val := fv.FieldByName("Value"); val.IsValid() { | ||||
| 		needsPlaceholder = true | ||||
| 		defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface()) | ||||
|  | ||||
| 		if val.Kind() == reflect.String && val.String() != "" { | ||||
| 			defaultValueString = fmt.Sprintf(" (default: %q)", val.String()) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if defaultValueString == " (default: )" { | ||||
| 		defaultValueString = "" | ||||
| 	} | ||||
|  | ||||
| 	if needsPlaceholder && placeholder == "" { | ||||
| 		placeholder = defaultPlaceholder | ||||
| 	} | ||||
|  | ||||
| 	usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultValueString)) | ||||
|  | ||||
| 	return withEnvHint(fv.FieldByName("EnvVar").String(), | ||||
| 		fmt.Sprintf("%s\t%s", prefixedNames(fv.FieldByName("Name").String(), placeholder), usageWithDefault)) | ||||
| } | ||||
|  | ||||
| func stringifyIntSliceFlag(f IntSliceFlag) string { | ||||
| 	defaultVals := []string{} | ||||
| 	if f.Value != nil && len(f.Value.Value()) > 0 { | ||||
| 		for _, i := range f.Value.Value() { | ||||
| 			defaultVals = append(defaultVals, fmt.Sprintf("%d", i)) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return stringifySliceFlag(f.Usage, f.Name, defaultVals) | ||||
| } | ||||
|  | ||||
| func stringifyInt64SliceFlag(f Int64SliceFlag) string { | ||||
| 	defaultVals := []string{} | ||||
| 	if f.Value != nil && len(f.Value.Value()) > 0 { | ||||
| 		for _, i := range f.Value.Value() { | ||||
| 			defaultVals = append(defaultVals, fmt.Sprintf("%d", i)) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return stringifySliceFlag(f.Usage, f.Name, defaultVals) | ||||
| } | ||||
|  | ||||
| func stringifyStringSliceFlag(f StringSliceFlag) string { | ||||
| 	defaultVals := []string{} | ||||
| 	if f.Value != nil && len(f.Value.Value()) > 0 { | ||||
| 		for _, s := range f.Value.Value() { | ||||
| 			if len(s) > 0 { | ||||
| 				defaultVals = append(defaultVals, fmt.Sprintf("%q", s)) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return stringifySliceFlag(f.Usage, f.Name, defaultVals) | ||||
| } | ||||
|  | ||||
| func stringifySliceFlag(usage, name string, defaultVals []string) string { | ||||
| 	placeholder, usage := unquoteUsage(usage) | ||||
| 	if placeholder == "" { | ||||
| 		placeholder = defaultPlaceholder | ||||
| 	} | ||||
|  | ||||
| 	defaultVal := "" | ||||
| 	if len(defaultVals) > 0 { | ||||
| 		defaultVal = fmt.Sprintf(" (default: %s)", strings.Join(defaultVals, ", ")) | ||||
| 	} | ||||
|  | ||||
| 	usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultVal)) | ||||
| 	return fmt.Sprintf("%s\t%s", prefixedNames(name, placeholder), usageWithDefault) | ||||
| } | ||||
							
								
								
									
										627
									
								
								vendor/github.com/urfave/cli/flag_generated.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										627
									
								
								vendor/github.com/urfave/cli/flag_generated.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,627 @@ | ||||
| package cli | ||||
|  | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"strconv" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // WARNING: This file is generated! | ||||
|  | ||||
| // BoolFlag is a flag with type bool | ||||
| type BoolFlag struct { | ||||
| 	Name        string | ||||
| 	Usage       string | ||||
| 	EnvVar      string | ||||
| 	Hidden      bool | ||||
| 	Destination *bool | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f BoolFlag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f BoolFlag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // Bool looks up the value of a local BoolFlag, returns | ||||
| // false if not found | ||||
| func (c *Context) Bool(name string) bool { | ||||
| 	return lookupBool(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalBool looks up the value of a global BoolFlag, returns | ||||
| // false if not found | ||||
| func (c *Context) GlobalBool(name string) bool { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupBool(name, fs) | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func lookupBool(name string, set *flag.FlagSet) bool { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := strconv.ParseBool(f.Value.String()) | ||||
| 		if err != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 		return parsed | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // BoolTFlag is a flag with type bool that is true by default | ||||
| type BoolTFlag struct { | ||||
| 	Name        string | ||||
| 	Usage       string | ||||
| 	EnvVar      string | ||||
| 	Hidden      bool | ||||
| 	Destination *bool | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f BoolTFlag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f BoolTFlag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // BoolT looks up the value of a local BoolTFlag, returns | ||||
| // false if not found | ||||
| func (c *Context) BoolT(name string) bool { | ||||
| 	return lookupBoolT(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalBoolT looks up the value of a global BoolTFlag, returns | ||||
| // false if not found | ||||
| func (c *Context) GlobalBoolT(name string) bool { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupBoolT(name, fs) | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func lookupBoolT(name string, set *flag.FlagSet) bool { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := strconv.ParseBool(f.Value.String()) | ||||
| 		if err != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 		return parsed | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration) | ||||
| type DurationFlag struct { | ||||
| 	Name        string | ||||
| 	Usage       string | ||||
| 	EnvVar      string | ||||
| 	Hidden      bool | ||||
| 	Value       time.Duration | ||||
| 	Destination *time.Duration | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f DurationFlag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f DurationFlag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // Duration looks up the value of a local DurationFlag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) Duration(name string) time.Duration { | ||||
| 	return lookupDuration(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalDuration looks up the value of a global DurationFlag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) GlobalDuration(name string) time.Duration { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupDuration(name, fs) | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func lookupDuration(name string, set *flag.FlagSet) time.Duration { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := time.ParseDuration(f.Value.String()) | ||||
| 		if err != nil { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		return parsed | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| // Float64Flag is a flag with type float64 | ||||
| type Float64Flag struct { | ||||
| 	Name        string | ||||
| 	Usage       string | ||||
| 	EnvVar      string | ||||
| 	Hidden      bool | ||||
| 	Value       float64 | ||||
| 	Destination *float64 | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f Float64Flag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f Float64Flag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // Float64 looks up the value of a local Float64Flag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) Float64(name string) float64 { | ||||
| 	return lookupFloat64(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalFloat64 looks up the value of a global Float64Flag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) GlobalFloat64(name string) float64 { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupFloat64(name, fs) | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func lookupFloat64(name string, set *flag.FlagSet) float64 { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := strconv.ParseFloat(f.Value.String(), 64) | ||||
| 		if err != nil { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		return parsed | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| // GenericFlag is a flag with type Generic | ||||
| type GenericFlag struct { | ||||
| 	Name   string | ||||
| 	Usage  string | ||||
| 	EnvVar string | ||||
| 	Hidden bool | ||||
| 	Value  Generic | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f GenericFlag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f GenericFlag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // Generic looks up the value of a local GenericFlag, returns | ||||
| // nil if not found | ||||
| func (c *Context) Generic(name string) interface{} { | ||||
| 	return lookupGeneric(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalGeneric looks up the value of a global GenericFlag, returns | ||||
| // nil if not found | ||||
| func (c *Context) GlobalGeneric(name string) interface{} { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupGeneric(name, fs) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func lookupGeneric(name string, set *flag.FlagSet) interface{} { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := f.Value, error(nil) | ||||
| 		if err != nil { | ||||
| 			return nil | ||||
| 		} | ||||
| 		return parsed | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Int64Flag is a flag with type int64 | ||||
| type Int64Flag struct { | ||||
| 	Name        string | ||||
| 	Usage       string | ||||
| 	EnvVar      string | ||||
| 	Hidden      bool | ||||
| 	Value       int64 | ||||
| 	Destination *int64 | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f Int64Flag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f Int64Flag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // Int64 looks up the value of a local Int64Flag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) Int64(name string) int64 { | ||||
| 	return lookupInt64(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalInt64 looks up the value of a global Int64Flag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) GlobalInt64(name string) int64 { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupInt64(name, fs) | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func lookupInt64(name string, set *flag.FlagSet) int64 { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) | ||||
| 		if err != nil { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		return parsed | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| // IntFlag is a flag with type int | ||||
| type IntFlag struct { | ||||
| 	Name        string | ||||
| 	Usage       string | ||||
| 	EnvVar      string | ||||
| 	Hidden      bool | ||||
| 	Value       int | ||||
| 	Destination *int | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f IntFlag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f IntFlag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // Int looks up the value of a local IntFlag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) Int(name string) int { | ||||
| 	return lookupInt(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalInt looks up the value of a global IntFlag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) GlobalInt(name string) int { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupInt(name, fs) | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func lookupInt(name string, set *flag.FlagSet) int { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) | ||||
| 		if err != nil { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		return int(parsed) | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| // IntSliceFlag is a flag with type *IntSlice | ||||
| type IntSliceFlag struct { | ||||
| 	Name   string | ||||
| 	Usage  string | ||||
| 	EnvVar string | ||||
| 	Hidden bool | ||||
| 	Value  *IntSlice | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f IntSliceFlag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f IntSliceFlag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // IntSlice looks up the value of a local IntSliceFlag, returns | ||||
| // nil if not found | ||||
| func (c *Context) IntSlice(name string) []int { | ||||
| 	return lookupIntSlice(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalIntSlice looks up the value of a global IntSliceFlag, returns | ||||
| // nil if not found | ||||
| func (c *Context) GlobalIntSlice(name string) []int { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupIntSlice(name, fs) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func lookupIntSlice(name string, set *flag.FlagSet) []int { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := (f.Value.(*IntSlice)).Value(), error(nil) | ||||
| 		if err != nil { | ||||
| 			return nil | ||||
| 		} | ||||
| 		return parsed | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Int64SliceFlag is a flag with type *Int64Slice | ||||
| type Int64SliceFlag struct { | ||||
| 	Name   string | ||||
| 	Usage  string | ||||
| 	EnvVar string | ||||
| 	Hidden bool | ||||
| 	Value  *Int64Slice | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f Int64SliceFlag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f Int64SliceFlag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // Int64Slice looks up the value of a local Int64SliceFlag, returns | ||||
| // nil if not found | ||||
| func (c *Context) Int64Slice(name string) []int64 { | ||||
| 	return lookupInt64Slice(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalInt64Slice looks up the value of a global Int64SliceFlag, returns | ||||
| // nil if not found | ||||
| func (c *Context) GlobalInt64Slice(name string) []int64 { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupInt64Slice(name, fs) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func lookupInt64Slice(name string, set *flag.FlagSet) []int64 { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := (f.Value.(*Int64Slice)).Value(), error(nil) | ||||
| 		if err != nil { | ||||
| 			return nil | ||||
| 		} | ||||
| 		return parsed | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // StringFlag is a flag with type string | ||||
| type StringFlag struct { | ||||
| 	Name        string | ||||
| 	Usage       string | ||||
| 	EnvVar      string | ||||
| 	Hidden      bool | ||||
| 	Value       string | ||||
| 	Destination *string | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f StringFlag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f StringFlag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // String looks up the value of a local StringFlag, returns | ||||
| // "" if not found | ||||
| func (c *Context) String(name string) string { | ||||
| 	return lookupString(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalString looks up the value of a global StringFlag, returns | ||||
| // "" if not found | ||||
| func (c *Context) GlobalString(name string) string { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupString(name, fs) | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func lookupString(name string, set *flag.FlagSet) string { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := f.Value.String(), error(nil) | ||||
| 		if err != nil { | ||||
| 			return "" | ||||
| 		} | ||||
| 		return parsed | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| // StringSliceFlag is a flag with type *StringSlice | ||||
| type StringSliceFlag struct { | ||||
| 	Name   string | ||||
| 	Usage  string | ||||
| 	EnvVar string | ||||
| 	Hidden bool | ||||
| 	Value  *StringSlice | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f StringSliceFlag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f StringSliceFlag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // StringSlice looks up the value of a local StringSliceFlag, returns | ||||
| // nil if not found | ||||
| func (c *Context) StringSlice(name string) []string { | ||||
| 	return lookupStringSlice(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalStringSlice looks up the value of a global StringSliceFlag, returns | ||||
| // nil if not found | ||||
| func (c *Context) GlobalStringSlice(name string) []string { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupStringSlice(name, fs) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func lookupStringSlice(name string, set *flag.FlagSet) []string { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := (f.Value.(*StringSlice)).Value(), error(nil) | ||||
| 		if err != nil { | ||||
| 			return nil | ||||
| 		} | ||||
| 		return parsed | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Uint64Flag is a flag with type uint64 | ||||
| type Uint64Flag struct { | ||||
| 	Name        string | ||||
| 	Usage       string | ||||
| 	EnvVar      string | ||||
| 	Hidden      bool | ||||
| 	Value       uint64 | ||||
| 	Destination *uint64 | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f Uint64Flag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f Uint64Flag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // Uint64 looks up the value of a local Uint64Flag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) Uint64(name string) uint64 { | ||||
| 	return lookupUint64(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalUint64 looks up the value of a global Uint64Flag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) GlobalUint64(name string) uint64 { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupUint64(name, fs) | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func lookupUint64(name string, set *flag.FlagSet) uint64 { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) | ||||
| 		if err != nil { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		return parsed | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| // UintFlag is a flag with type uint | ||||
| type UintFlag struct { | ||||
| 	Name        string | ||||
| 	Usage       string | ||||
| 	EnvVar      string | ||||
| 	Hidden      bool | ||||
| 	Value       uint | ||||
| 	Destination *uint | ||||
| } | ||||
|  | ||||
| // String returns a readable representation of this value | ||||
| // (for usage defaults) | ||||
| func (f UintFlag) String() string { | ||||
| 	return FlagStringer(f) | ||||
| } | ||||
|  | ||||
| // GetName returns the name of the flag | ||||
| func (f UintFlag) GetName() string { | ||||
| 	return f.Name | ||||
| } | ||||
|  | ||||
| // Uint looks up the value of a local UintFlag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) Uint(name string) uint { | ||||
| 	return lookupUint(name, c.flagSet) | ||||
| } | ||||
|  | ||||
| // GlobalUint looks up the value of a global UintFlag, returns | ||||
| // 0 if not found | ||||
| func (c *Context) GlobalUint(name string) uint { | ||||
| 	if fs := lookupGlobalFlagSet(name, c); fs != nil { | ||||
| 		return lookupUint(name, fs) | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func lookupUint(name string, set *flag.FlagSet) uint { | ||||
| 	f := set.Lookup(name) | ||||
| 	if f != nil { | ||||
| 		parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) | ||||
| 		if err != nil { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		return uint(parsed) | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
							
								
								
									
										28
									
								
								vendor/github.com/urfave/cli/funcs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/urfave/cli/funcs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| package cli | ||||
|  | ||||
| // BashCompleteFunc is an action to execute when the bash-completion flag is set | ||||
| type BashCompleteFunc func(*Context) | ||||
|  | ||||
| // BeforeFunc is an action to execute before any subcommands are run, but after | ||||
| // the context is ready if a non-nil error is returned, no subcommands are run | ||||
| type BeforeFunc func(*Context) error | ||||
|  | ||||
| // AfterFunc is an action to execute after any subcommands are run, but after the | ||||
| // subcommand has finished it is run even if Action() panics | ||||
| type AfterFunc func(*Context) error | ||||
|  | ||||
| // ActionFunc is the action to execute when no subcommands are specified | ||||
| type ActionFunc func(*Context) error | ||||
|  | ||||
| // CommandNotFoundFunc is executed if the proper command cannot be found | ||||
| type CommandNotFoundFunc func(*Context, string) | ||||
|  | ||||
| // OnUsageErrorFunc is executed if an usage error occurs. This is useful for displaying | ||||
| // customized usage error messages.  This function is able to replace the | ||||
| // original error messages.  If this function is not set, the "Incorrect usage" | ||||
| // is displayed and the execution is interrupted. | ||||
| type OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error | ||||
|  | ||||
| // FlagStringFunc is used by the help generation to display a flag, which is | ||||
| // expected to be a single line. | ||||
| type FlagStringFunc func(Flag) string | ||||
							
								
								
									
										255
									
								
								vendor/github.com/urfave/cli/generate-flag-types
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										255
									
								
								vendor/github.com/urfave/cli/generate-flag-types
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,255 @@ | ||||
| #!/usr/bin/env python | ||||
| """ | ||||
| The flag types that ship with the cli library have many things in common, and | ||||
| so we can take advantage of the `go generate` command to create much of the | ||||
| source code from a list of definitions.  These definitions attempt to cover | ||||
| the parts that vary between flag types, and should evolve as needed. | ||||
|  | ||||
| An example of the minimum definition needed is: | ||||
|  | ||||
|     { | ||||
|       "name": "SomeType", | ||||
|       "type": "sometype", | ||||
|       "context_default": "nil" | ||||
|     } | ||||
|  | ||||
| In this example, the code generated for the `cli` package will include a type | ||||
| named `SomeTypeFlag` that is expected to wrap a value of type `sometype`. | ||||
| Fetching values by name via `*cli.Context` will default to a value of `nil`. | ||||
|  | ||||
| A more complete, albeit somewhat redundant, example showing all available | ||||
| definition keys is: | ||||
|  | ||||
|     { | ||||
|       "name": "VeryMuchType", | ||||
|       "type": "*VeryMuchType", | ||||
|       "value": true, | ||||
|       "dest": false, | ||||
|       "doctail": " which really only wraps a []float64, oh well!", | ||||
|       "context_type": "[]float64", | ||||
|       "context_default": "nil", | ||||
|       "parser": "parseVeryMuchType(f.Value.String())", | ||||
|       "parser_cast": "[]float64(parsed)" | ||||
|     } | ||||
|  | ||||
| The meaning of each field is as follows: | ||||
|  | ||||
|                name (string) - The type "name", which will be suffixed with | ||||
|                                `Flag` when generating the type definition | ||||
|                                for `cli` and the wrapper type for `altsrc` | ||||
|                type (string) - The type that the generated `Flag` type for `cli` | ||||
|                                is expected to "contain" as its `.Value` member | ||||
|                 value (bool) - Should the generated `cli` type have a `Value` | ||||
|                                member? | ||||
|                  dest (bool) - Should the generated `cli` type support a | ||||
|                                destination pointer? | ||||
|             doctail (string) - Additional docs for the `cli` flag type comment | ||||
|        context_type (string) - The literal type used in the `*cli.Context` | ||||
|                                reader func signature | ||||
|     context_default (string) - The literal value used as the default by the | ||||
|                                `*cli.Context` reader funcs when no value is | ||||
|                                present | ||||
|              parser (string) - Literal code used to parse the flag `f`, | ||||
|                                expected to have a return signature of | ||||
|                                (value, error) | ||||
|         parser_cast (string) - Literal code used to cast the `parsed` value | ||||
|                                returned from the `parser` code | ||||
| """ | ||||
|  | ||||
| from __future__ import print_function, unicode_literals | ||||
|  | ||||
| import argparse | ||||
| import json | ||||
| import os | ||||
| import subprocess | ||||
| import sys | ||||
| import tempfile | ||||
| import textwrap | ||||
|  | ||||
|  | ||||
| class _FancyFormatter(argparse.ArgumentDefaultsHelpFormatter, | ||||
|                       argparse.RawDescriptionHelpFormatter): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| def main(sysargs=sys.argv[:]): | ||||
|     parser = argparse.ArgumentParser( | ||||
|         description='Generate flag type code!', | ||||
|         formatter_class=_FancyFormatter) | ||||
|     parser.add_argument( | ||||
|         'package', | ||||
|         type=str, default='cli', choices=_WRITEFUNCS.keys(), | ||||
|         help='Package for which flag types will be generated' | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         '-i', '--in-json', | ||||
|         type=argparse.FileType('r'), | ||||
|         default=sys.stdin, | ||||
|         help='Input JSON file which defines each type to be generated' | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         '-o', '--out-go', | ||||
|         type=argparse.FileType('w'), | ||||
|         default=sys.stdout, | ||||
|         help='Output file/stream to which generated source will be written' | ||||
|     ) | ||||
|     parser.epilog = __doc__ | ||||
|  | ||||
|     args = parser.parse_args(sysargs[1:]) | ||||
|     _generate_flag_types(_WRITEFUNCS[args.package], args.out_go, args.in_json) | ||||
|     return 0 | ||||
|  | ||||
|  | ||||
| def _generate_flag_types(writefunc, output_go, input_json): | ||||
|     types = json.load(input_json) | ||||
|  | ||||
|     tmp = tempfile.NamedTemporaryFile(suffix='.go', delete=False) | ||||
|     writefunc(tmp, types) | ||||
|     tmp.close() | ||||
|  | ||||
|     new_content = subprocess.check_output( | ||||
|         ['goimports', tmp.name] | ||||
|     ).decode('utf-8') | ||||
|  | ||||
|     print(new_content, file=output_go, end='') | ||||
|     output_go.flush() | ||||
|     os.remove(tmp.name) | ||||
|  | ||||
|  | ||||
| def _set_typedef_defaults(typedef): | ||||
|     typedef.setdefault('doctail', '') | ||||
|     typedef.setdefault('context_type', typedef['type']) | ||||
|     typedef.setdefault('dest', True) | ||||
|     typedef.setdefault('value', True) | ||||
|     typedef.setdefault('parser', 'f.Value, error(nil)') | ||||
|     typedef.setdefault('parser_cast', 'parsed') | ||||
|  | ||||
|  | ||||
| def _write_cli_flag_types(outfile, types): | ||||
|     _fwrite(outfile, """\ | ||||
|         package cli | ||||
|  | ||||
|         // WARNING: This file is generated! | ||||
|  | ||||
|         """) | ||||
|  | ||||
|     for typedef in types: | ||||
|         _set_typedef_defaults(typedef) | ||||
|  | ||||
|         _fwrite(outfile, """\ | ||||
|         // {name}Flag is a flag with type {type}{doctail} | ||||
|         type {name}Flag struct {{ | ||||
|             Name string | ||||
|             Usage string | ||||
|             EnvVar string | ||||
|             Hidden bool | ||||
|         """.format(**typedef)) | ||||
|  | ||||
|         if typedef['value']: | ||||
|             _fwrite(outfile, """\ | ||||
|             Value {type} | ||||
|             """.format(**typedef)) | ||||
|  | ||||
|         if typedef['dest']: | ||||
|             _fwrite(outfile, """\ | ||||
|             Destination *{type} | ||||
|             """.format(**typedef)) | ||||
|  | ||||
|         _fwrite(outfile, "\n}\n\n") | ||||
|  | ||||
|         _fwrite(outfile, """\ | ||||
|             // String returns a readable representation of this value | ||||
|             // (for usage defaults) | ||||
|             func (f {name}Flag) String() string {{ | ||||
|                 return FlagStringer(f) | ||||
|             }} | ||||
|  | ||||
|             // GetName returns the name of the flag | ||||
|             func (f {name}Flag) GetName() string {{ | ||||
|                 return f.Name | ||||
|             }} | ||||
|  | ||||
|             // {name} looks up the value of a local {name}Flag, returns | ||||
|             // {context_default} if not found | ||||
|             func (c *Context) {name}(name string) {context_type} {{ | ||||
|                 return lookup{name}(name, c.flagSet) | ||||
|             }} | ||||
|  | ||||
|             // Global{name} looks up the value of a global {name}Flag, returns | ||||
|             // {context_default} if not found | ||||
|             func (c *Context) Global{name}(name string) {context_type} {{ | ||||
|                 if fs := lookupGlobalFlagSet(name, c); fs != nil {{ | ||||
|                     return lookup{name}(name, fs) | ||||
|                 }} | ||||
|                 return {context_default} | ||||
|             }} | ||||
|  | ||||
|             func lookup{name}(name string, set *flag.FlagSet) {context_type} {{ | ||||
|                 f := set.Lookup(name) | ||||
|                 if f != nil {{ | ||||
|                     parsed, err := {parser} | ||||
|                     if err != nil {{ | ||||
|                         return {context_default} | ||||
|                     }} | ||||
|                     return {parser_cast} | ||||
|                 }} | ||||
|                 return {context_default} | ||||
|             }} | ||||
|             """.format(**typedef)) | ||||
|  | ||||
|  | ||||
| def _write_altsrc_flag_types(outfile, types): | ||||
|     _fwrite(outfile, """\ | ||||
|         package altsrc | ||||
|  | ||||
|         import ( | ||||
|             "gopkg.in/urfave/cli.v1" | ||||
|         ) | ||||
|  | ||||
|         // WARNING: This file is generated! | ||||
|  | ||||
|         """) | ||||
|  | ||||
|     for typedef in types: | ||||
|         _set_typedef_defaults(typedef) | ||||
|  | ||||
|         _fwrite(outfile, """\ | ||||
|         // {name}Flag is the flag type that wraps cli.{name}Flag to allow | ||||
|         // for other values to be specified | ||||
|         type {name}Flag struct {{ | ||||
|             cli.{name}Flag | ||||
|             set *flag.FlagSet | ||||
|         }} | ||||
|  | ||||
|         // New{name}Flag creates a new {name}Flag | ||||
|         func New{name}Flag(fl cli.{name}Flag) *{name}Flag {{ | ||||
|             return &{name}Flag{{{name}Flag: fl, set: nil}} | ||||
|         }} | ||||
|  | ||||
|         // Apply saves the flagSet for later usage calls, then calls the | ||||
|         // wrapped {name}Flag.Apply | ||||
|         func (f *{name}Flag) Apply(set *flag.FlagSet) {{ | ||||
|             f.set = set | ||||
|             f.{name}Flag.Apply(set) | ||||
|         }} | ||||
|  | ||||
|         // ApplyWithError saves the flagSet for later usage calls, then calls the | ||||
|         // wrapped {name}Flag.ApplyWithError | ||||
|         func (f *{name}Flag) ApplyWithError(set *flag.FlagSet) error {{ | ||||
|             f.set = set | ||||
|             return f.{name}Flag.ApplyWithError(set) | ||||
|         }} | ||||
|         """.format(**typedef)) | ||||
|  | ||||
|  | ||||
| def _fwrite(outfile, text): | ||||
|     print(textwrap.dedent(text), end='', file=outfile) | ||||
|  | ||||
|  | ||||
| _WRITEFUNCS = { | ||||
|     'cli': _write_cli_flag_types, | ||||
|     'altsrc': _write_altsrc_flag_types | ||||
| } | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     sys.exit(main()) | ||||
							
								
								
									
										338
									
								
								vendor/github.com/urfave/cli/help.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										338
									
								
								vendor/github.com/urfave/cli/help.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,338 @@ | ||||
| package cli | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| 	"text/tabwriter" | ||||
| 	"text/template" | ||||
| ) | ||||
|  | ||||
| // AppHelpTemplate is the text template for the Default help topic. | ||||
| // cli.go uses text/template to render templates. You can | ||||
| // render custom help text by setting this variable. | ||||
| var AppHelpTemplate = `NAME: | ||||
|    {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} | ||||
|  | ||||
| USAGE: | ||||
|    {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} | ||||
|  | ||||
| VERSION: | ||||
|    {{.Version}}{{end}}{{end}}{{if .Description}} | ||||
|  | ||||
| DESCRIPTION: | ||||
|    {{.Description}}{{end}}{{if len .Authors}} | ||||
|  | ||||
| AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: | ||||
|    {{range $index, $author := .Authors}}{{if $index}} | ||||
|    {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} | ||||
|  | ||||
| COMMANDS:{{range .VisibleCategories}}{{if .Name}} | ||||
|    {{.Name}}:{{end}}{{range .VisibleCommands}} | ||||
|      {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} | ||||
|  | ||||
| GLOBAL OPTIONS: | ||||
|    {{range $index, $option := .VisibleFlags}}{{if $index}} | ||||
|    {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} | ||||
|  | ||||
| COPYRIGHT: | ||||
|    {{.Copyright}}{{end}} | ||||
| ` | ||||
|  | ||||
| // CommandHelpTemplate is the text template for the command help topic. | ||||
| // cli.go uses text/template to render templates. You can | ||||
| // render custom help text by setting this variable. | ||||
| var CommandHelpTemplate = `NAME: | ||||
|    {{.HelpName}} - {{.Usage}} | ||||
|  | ||||
| USAGE: | ||||
|    {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}} | ||||
|  | ||||
| CATEGORY: | ||||
|    {{.Category}}{{end}}{{if .Description}} | ||||
|  | ||||
| DESCRIPTION: | ||||
|    {{.Description}}{{end}}{{if .VisibleFlags}} | ||||
|  | ||||
| OPTIONS: | ||||
|    {{range .VisibleFlags}}{{.}} | ||||
|    {{end}}{{end}} | ||||
| ` | ||||
|  | ||||
| // SubcommandHelpTemplate is the text template for the subcommand help topic. | ||||
| // cli.go uses text/template to render templates. You can | ||||
| // render custom help text by setting this variable. | ||||
| var SubcommandHelpTemplate = `NAME: | ||||
|    {{.HelpName}} - {{if .Description}}{{.Description}}{{else}}{{.Usage}}{{end}} | ||||
|  | ||||
| USAGE: | ||||
|    {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}} | ||||
|  | ||||
| COMMANDS:{{range .VisibleCategories}}{{if .Name}} | ||||
|    {{.Name}}:{{end}}{{range .VisibleCommands}} | ||||
|      {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}} | ||||
| {{end}}{{if .VisibleFlags}} | ||||
| OPTIONS: | ||||
|    {{range .VisibleFlags}}{{.}} | ||||
|    {{end}}{{end}} | ||||
| ` | ||||
|  | ||||
| var helpCommand = Command{ | ||||
| 	Name:      "help", | ||||
| 	Aliases:   []string{"h"}, | ||||
| 	Usage:     "Shows a list of commands or help for one command", | ||||
| 	ArgsUsage: "[command]", | ||||
| 	Action: func(c *Context) error { | ||||
| 		args := c.Args() | ||||
| 		if args.Present() { | ||||
| 			return ShowCommandHelp(c, args.First()) | ||||
| 		} | ||||
|  | ||||
| 		ShowAppHelp(c) | ||||
| 		return nil | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| var helpSubcommand = Command{ | ||||
| 	Name:      "help", | ||||
| 	Aliases:   []string{"h"}, | ||||
| 	Usage:     "Shows a list of commands or help for one command", | ||||
| 	ArgsUsage: "[command]", | ||||
| 	Action: func(c *Context) error { | ||||
| 		args := c.Args() | ||||
| 		if args.Present() { | ||||
| 			return ShowCommandHelp(c, args.First()) | ||||
| 		} | ||||
|  | ||||
| 		return ShowSubcommandHelp(c) | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| // Prints help for the App or Command | ||||
| type helpPrinter func(w io.Writer, templ string, data interface{}) | ||||
|  | ||||
| // Prints help for the App or Command with custom template function. | ||||
| type helpPrinterCustom func(w io.Writer, templ string, data interface{}, customFunc map[string]interface{}) | ||||
|  | ||||
| // HelpPrinter is a function that writes the help output. If not set a default | ||||
| // is used. The function signature is: | ||||
| // func(w io.Writer, templ string, data interface{}) | ||||
| var HelpPrinter helpPrinter = printHelp | ||||
|  | ||||
| // HelpPrinterCustom is same as HelpPrinter but | ||||
| // takes a custom function for template function map. | ||||
| var HelpPrinterCustom helpPrinterCustom = printHelpCustom | ||||
|  | ||||
| // VersionPrinter prints the version for the App | ||||
| var VersionPrinter = printVersion | ||||
|  | ||||
| // ShowAppHelpAndExit - Prints the list of subcommands for the app and exits with exit code. | ||||
| func ShowAppHelpAndExit(c *Context, exitCode int) { | ||||
| 	ShowAppHelp(c) | ||||
| 	os.Exit(exitCode) | ||||
| } | ||||
|  | ||||
| // ShowAppHelp is an action that displays the help. | ||||
| func ShowAppHelp(c *Context) (err error) { | ||||
| 	if c.App.CustomAppHelpTemplate == "" { | ||||
| 		HelpPrinter(c.App.Writer, AppHelpTemplate, c.App) | ||||
| 		return | ||||
| 	} | ||||
| 	customAppData := func() map[string]interface{} { | ||||
| 		if c.App.ExtraInfo == nil { | ||||
| 			return nil | ||||
| 		} | ||||
| 		return map[string]interface{}{ | ||||
| 			"ExtraInfo": c.App.ExtraInfo, | ||||
| 		} | ||||
| 	} | ||||
| 	HelpPrinterCustom(c.App.Writer, c.App.CustomAppHelpTemplate, c.App, customAppData()) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // DefaultAppComplete prints the list of subcommands as the default app completion method | ||||
| func DefaultAppComplete(c *Context) { | ||||
| 	for _, command := range c.App.Commands { | ||||
| 		if command.Hidden { | ||||
| 			continue | ||||
| 		} | ||||
| 		for _, name := range command.Names() { | ||||
| 			fmt.Fprintln(c.App.Writer, name) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ShowCommandHelpAndExit - exits with code after showing help | ||||
| func ShowCommandHelpAndExit(c *Context, command string, code int) { | ||||
| 	ShowCommandHelp(c, command) | ||||
| 	os.Exit(code) | ||||
| } | ||||
|  | ||||
| // ShowCommandHelp prints help for the given command | ||||
| func ShowCommandHelp(ctx *Context, command string) error { | ||||
| 	// show the subcommand help for a command with subcommands | ||||
| 	if command == "" { | ||||
| 		HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	for _, c := range ctx.App.Commands { | ||||
| 		if c.HasName(command) { | ||||
| 			if c.CustomHelpTemplate != "" { | ||||
| 				HelpPrinterCustom(ctx.App.Writer, c.CustomHelpTemplate, c, nil) | ||||
| 			} else { | ||||
| 				HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c) | ||||
| 			} | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if ctx.App.CommandNotFound == nil { | ||||
| 		return NewExitError(fmt.Sprintf("No help topic for '%v'", command), 3) | ||||
| 	} | ||||
|  | ||||
| 	ctx.App.CommandNotFound(ctx, command) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // ShowSubcommandHelp prints help for the given subcommand | ||||
| func ShowSubcommandHelp(c *Context) error { | ||||
| 	return ShowCommandHelp(c, c.Command.Name) | ||||
| } | ||||
|  | ||||
| // ShowVersion prints the version number of the App | ||||
| func ShowVersion(c *Context) { | ||||
| 	VersionPrinter(c) | ||||
| } | ||||
|  | ||||
| func printVersion(c *Context) { | ||||
| 	fmt.Fprintf(c.App.Writer, "%v version %v\n", c.App.Name, c.App.Version) | ||||
| } | ||||
|  | ||||
| // ShowCompletions prints the lists of commands within a given context | ||||
| func ShowCompletions(c *Context) { | ||||
| 	a := c.App | ||||
| 	if a != nil && a.BashComplete != nil { | ||||
| 		a.BashComplete(c) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ShowCommandCompletions prints the custom completions for a given command | ||||
| func ShowCommandCompletions(ctx *Context, command string) { | ||||
| 	c := ctx.App.Command(command) | ||||
| 	if c != nil && c.BashComplete != nil { | ||||
| 		c.BashComplete(ctx) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func printHelpCustom(out io.Writer, templ string, data interface{}, customFunc map[string]interface{}) { | ||||
| 	funcMap := template.FuncMap{ | ||||
| 		"join": strings.Join, | ||||
| 	} | ||||
| 	if customFunc != nil { | ||||
| 		for key, value := range customFunc { | ||||
| 			funcMap[key] = value | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0) | ||||
| 	t := template.Must(template.New("help").Funcs(funcMap).Parse(templ)) | ||||
| 	err := t.Execute(w, data) | ||||
| 	if err != nil { | ||||
| 		// If the writer is closed, t.Execute will fail, and there's nothing | ||||
| 		// we can do to recover. | ||||
| 		if os.Getenv("CLI_TEMPLATE_ERROR_DEBUG") != "" { | ||||
| 			fmt.Fprintf(ErrWriter, "CLI TEMPLATE ERROR: %#v\n", err) | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 	w.Flush() | ||||
| } | ||||
|  | ||||
| func printHelp(out io.Writer, templ string, data interface{}) { | ||||
| 	printHelpCustom(out, templ, data, nil) | ||||
| } | ||||
|  | ||||
| func checkVersion(c *Context) bool { | ||||
| 	found := false | ||||
| 	if VersionFlag.GetName() != "" { | ||||
| 		eachName(VersionFlag.GetName(), func(name string) { | ||||
| 			if c.GlobalBool(name) || c.Bool(name) { | ||||
| 				found = true | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| 	return found | ||||
| } | ||||
|  | ||||
| func checkHelp(c *Context) bool { | ||||
| 	found := false | ||||
| 	if HelpFlag.GetName() != "" { | ||||
| 		eachName(HelpFlag.GetName(), func(name string) { | ||||
| 			if c.GlobalBool(name) || c.Bool(name) { | ||||
| 				found = true | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| 	return found | ||||
| } | ||||
|  | ||||
| func checkCommandHelp(c *Context, name string) bool { | ||||
| 	if c.Bool("h") || c.Bool("help") { | ||||
| 		ShowCommandHelp(c, name) | ||||
| 		return true | ||||
| 	} | ||||
|  | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func checkSubcommandHelp(c *Context) bool { | ||||
| 	if c.Bool("h") || c.Bool("help") { | ||||
| 		ShowSubcommandHelp(c) | ||||
| 		return true | ||||
| 	} | ||||
|  | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) { | ||||
| 	if !a.EnableBashCompletion { | ||||
| 		return false, arguments | ||||
| 	} | ||||
|  | ||||
| 	pos := len(arguments) - 1 | ||||
| 	lastArg := arguments[pos] | ||||
|  | ||||
| 	if lastArg != "--"+BashCompletionFlag.GetName() { | ||||
| 		return false, arguments | ||||
| 	} | ||||
|  | ||||
| 	return true, arguments[:pos] | ||||
| } | ||||
|  | ||||
| func checkCompletions(c *Context) bool { | ||||
| 	if !c.shellComplete { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if args := c.Args(); args.Present() { | ||||
| 		name := args.First() | ||||
| 		if cmd := c.App.Command(name); cmd != nil { | ||||
| 			// let the command handle the completion | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	ShowCompletions(c) | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func checkCommandCompletions(c *Context, name string) bool { | ||||
| 	if !c.shellComplete { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	ShowCommandCompletions(c, name) | ||||
| 	return true | ||||
| } | ||||
							
								
								
									
										122
									
								
								vendor/github.com/urfave/cli/runtests
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								vendor/github.com/urfave/cli/runtests
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | ||||
| #!/usr/bin/env python | ||||
| from __future__ import print_function | ||||
|  | ||||
| import argparse | ||||
| import os | ||||
| import sys | ||||
| import tempfile | ||||
|  | ||||
| from subprocess import check_call, check_output | ||||
|  | ||||
|  | ||||
| PACKAGE_NAME = os.environ.get( | ||||
|     'CLI_PACKAGE_NAME', 'github.com/urfave/cli' | ||||
| ) | ||||
|  | ||||
|  | ||||
| def main(sysargs=sys.argv[:]): | ||||
|     targets = { | ||||
|         'vet': _vet, | ||||
|         'test': _test, | ||||
|         'gfmrun': _gfmrun, | ||||
|         'toc': _toc, | ||||
|         'gen': _gen, | ||||
|     } | ||||
|  | ||||
|     parser = argparse.ArgumentParser() | ||||
|     parser.add_argument( | ||||
|         'target', nargs='?', choices=tuple(targets.keys()), default='test' | ||||
|     ) | ||||
|     args = parser.parse_args(sysargs[1:]) | ||||
|  | ||||
|     targets[args.target]() | ||||
|     return 0 | ||||
|  | ||||
|  | ||||
| def _test(): | ||||
|     if check_output('go version'.split()).split()[2] < 'go1.2': | ||||
|         _run('go test -v .') | ||||
|         return | ||||
|  | ||||
|     coverprofiles = [] | ||||
|     for subpackage in ['', 'altsrc']: | ||||
|         coverprofile = 'cli.coverprofile' | ||||
|         if subpackage != '': | ||||
|             coverprofile = '{}.coverprofile'.format(subpackage) | ||||
|  | ||||
|         coverprofiles.append(coverprofile) | ||||
|  | ||||
|         _run('go test -v'.split() + [ | ||||
|             '-coverprofile={}'.format(coverprofile), | ||||
|             ('{}/{}'.format(PACKAGE_NAME, subpackage)).rstrip('/') | ||||
|         ]) | ||||
|  | ||||
|     combined_name = _combine_coverprofiles(coverprofiles) | ||||
|     _run('go tool cover -func={}'.format(combined_name)) | ||||
|     os.remove(combined_name) | ||||
|  | ||||
|  | ||||
| def _gfmrun(): | ||||
|     go_version = check_output('go version'.split()).split()[2] | ||||
|     if go_version < 'go1.3': | ||||
|         print('runtests: skip on {}'.format(go_version), file=sys.stderr) | ||||
|         return | ||||
|     _run(['gfmrun', '-c', str(_gfmrun_count()), '-s', 'README.md']) | ||||
|  | ||||
|  | ||||
| def _vet(): | ||||
|     _run('go vet ./...') | ||||
|  | ||||
|  | ||||
| def _toc(): | ||||
|     _run('node_modules/.bin/markdown-toc -i README.md') | ||||
|     _run('git diff --exit-code') | ||||
|  | ||||
|  | ||||
| def _gen(): | ||||
|     go_version = check_output('go version'.split()).split()[2] | ||||
|     if go_version < 'go1.5': | ||||
|         print('runtests: skip on {}'.format(go_version), file=sys.stderr) | ||||
|         return | ||||
|  | ||||
|     _run('go generate ./...') | ||||
|     _run('git diff --exit-code') | ||||
|  | ||||
|  | ||||
| def _run(command): | ||||
|     if hasattr(command, 'split'): | ||||
|         command = command.split() | ||||
|     print('runtests: {}'.format(' '.join(command)), file=sys.stderr) | ||||
|     check_call(command) | ||||
|  | ||||
|  | ||||
| def _gfmrun_count(): | ||||
|     with open('README.md') as infile: | ||||
|         lines = infile.read().splitlines() | ||||
|         return len(filter(_is_go_runnable, lines)) | ||||
|  | ||||
|  | ||||
| def _is_go_runnable(line): | ||||
|     return line.startswith('package main') | ||||
|  | ||||
|  | ||||
| def _combine_coverprofiles(coverprofiles): | ||||
|     combined = tempfile.NamedTemporaryFile( | ||||
|         suffix='.coverprofile', delete=False | ||||
|     ) | ||||
|     combined.write('mode: set\n') | ||||
|  | ||||
|     for coverprofile in coverprofiles: | ||||
|         with open(coverprofile, 'r') as infile: | ||||
|             for line in infile.readlines(): | ||||
|                 if not line.startswith('mode: '): | ||||
|                     combined.write(line) | ||||
|  | ||||
|     combined.flush() | ||||
|     name = combined.name | ||||
|     combined.close() | ||||
|     return name | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     sys.exit(main()) | ||||
							
								
								
									
										201
									
								
								vendor/gopkg.in/src-d/go-git.v4/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								vendor/gopkg.in/src-d/go-git.v4/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "{}" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright 2018 Sourced Technologies, S.L. | ||||
|  | ||||
|    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. | ||||
							
								
								
									
										71
									
								
								vendor/gopkg.in/src-d/go-git.v4/config/branch.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								vendor/gopkg.in/src-d/go-git.v4/config/branch.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| package config | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
|  | ||||
| 	"gopkg.in/src-d/go-git.v4/plumbing" | ||||
| 	format "gopkg.in/src-d/go-git.v4/plumbing/format/config" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	errBranchEmptyName    = errors.New("branch config: empty name") | ||||
| 	errBranchInvalidMerge = errors.New("branch config: invalid merge") | ||||
| ) | ||||
|  | ||||
| // Branch contains information on the | ||||
| // local branches and which remote to track | ||||
| type Branch struct { | ||||
| 	// Name of branch | ||||
| 	Name string | ||||
| 	// Remote name of remote to track | ||||
| 	Remote string | ||||
| 	// Merge is the local refspec for the branch | ||||
| 	Merge plumbing.ReferenceName | ||||
|  | ||||
| 	raw *format.Subsection | ||||
| } | ||||
|  | ||||
| // Validate validates fields of branch | ||||
| func (b *Branch) Validate() error { | ||||
| 	if b.Name == "" { | ||||
| 		return errBranchEmptyName | ||||
| 	} | ||||
|  | ||||
| 	if b.Merge != "" && !b.Merge.IsBranch() { | ||||
| 		return errBranchInvalidMerge | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (b *Branch) marshal() *format.Subsection { | ||||
| 	if b.raw == nil { | ||||
| 		b.raw = &format.Subsection{} | ||||
| 	} | ||||
|  | ||||
| 	b.raw.Name = b.Name | ||||
|  | ||||
| 	if b.Remote == "" { | ||||
| 		b.raw.RemoveOption(remoteSection) | ||||
| 	} else { | ||||
| 		b.raw.SetOption(remoteSection, b.Remote) | ||||
| 	} | ||||
|  | ||||
| 	if b.Merge == "" { | ||||
| 		b.raw.RemoveOption(mergeKey) | ||||
| 	} else { | ||||
| 		b.raw.SetOption(mergeKey, string(b.Merge)) | ||||
| 	} | ||||
|  | ||||
| 	return b.raw | ||||
| } | ||||
|  | ||||
| func (b *Branch) unmarshal(s *format.Subsection) error { | ||||
| 	b.raw = s | ||||
|  | ||||
| 	b.Name = b.raw.Name | ||||
| 	b.Remote = b.raw.Options.Get(remoteSection) | ||||
| 	b.Merge = plumbing.ReferenceName(b.raw.Options.Get(mergeKey)) | ||||
|  | ||||
| 	return b.Validate() | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 Lunny Xiao
					Lunny Xiao