mirror of
				https://gitea.com/gitea/tea.git
				synced 2025-10-30 16:55:25 +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:
		
							
								
								
									
										186
									
								
								.drone.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								.drone.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | |||||||
|  | workspace: | ||||||
|  |   base: /go | ||||||
|  |   path: src/code.gitea.io/tea | ||||||
|  |  | ||||||
|  | clone: | ||||||
|  |   git: | ||||||
|  |     image: plugins/git:next | ||||||
|  |     depth: 50 | ||||||
|  |     tags: true | ||||||
|  |  | ||||||
|  | pipeline: | ||||||
|  |   build: | ||||||
|  |     image: golang:1.12 | ||||||
|  |     pull: true | ||||||
|  |     commands: | ||||||
|  |       - make clean | ||||||
|  |       - make vet | ||||||
|  |       - make lint | ||||||
|  |       - make fmt-check | ||||||
|  |       - make misspell-check | ||||||
|  |       - make test-vendor | ||||||
|  |       - make build | ||||||
|  |     when: | ||||||
|  |       event: [ push, tag, pull_request ] | ||||||
|  |  | ||||||
|  |   unit-test: | ||||||
|  |     image: golang:1.12 | ||||||
|  |     pull: true | ||||||
|  |     group: test | ||||||
|  |     commands: | ||||||
|  |       - make unit-test-coverage | ||||||
|  |     when: | ||||||
|  |       event: [ push, pull_request ] | ||||||
|  |       branch: [ master ] | ||||||
|  |  | ||||||
|  |   release-test: | ||||||
|  |     image: golang:1.12 | ||||||
|  |     pull: true | ||||||
|  |     group: test | ||||||
|  |     commands: | ||||||
|  |       - make test | ||||||
|  |     when: | ||||||
|  |       event: [ push, pull_request ] | ||||||
|  |       branch: [ release/* ] | ||||||
|  |  | ||||||
|  |   tag-test: | ||||||
|  |     image: golang:1.12 | ||||||
|  |     pull: true | ||||||
|  |     group: test | ||||||
|  |     commands: | ||||||
|  |       - make test | ||||||
|  |     when: | ||||||
|  |       event: [ tag ] | ||||||
|  |  | ||||||
|  |   generate-coverage: | ||||||
|  |     image: golang:1.12 | ||||||
|  |     pull: true | ||||||
|  |     environment: | ||||||
|  |       TAGS: bindata | ||||||
|  |     commands: | ||||||
|  |       - make coverage | ||||||
|  |     when: | ||||||
|  |       event: [ push, pull_request ] | ||||||
|  |       branch: [ master ] | ||||||
|  |  | ||||||
|  |   coverage: | ||||||
|  |     image: robertstettner/drone-codecov | ||||||
|  |     secrets: [ codecov_token ] | ||||||
|  |     files: | ||||||
|  |       - coverage.all | ||||||
|  |     when: | ||||||
|  |       event: [ push, pull_request ] | ||||||
|  |       branch: [ master ] | ||||||
|  |  | ||||||
|  |   static: | ||||||
|  |     image: techknowlogick/xgo:latest | ||||||
|  |     pull: true | ||||||
|  |     commands: | ||||||
|  |       - export PATH=$PATH:$GOPATH/bin | ||||||
|  |       - make release | ||||||
|  |     when: | ||||||
|  |       event: [ push, tag ] | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   docker-dryrun: | ||||||
|  |     image: plugins/docker:17.12 | ||||||
|  |     pull: true | ||||||
|  |     repo: gitea/tea | ||||||
|  |     cache_from: gitea/tea | ||||||
|  |     dry_run: true | ||||||
|  |     when: | ||||||
|  |       event: [ pull_request ] | ||||||
|  |  | ||||||
|  |   release-docker: | ||||||
|  |     image: plugins/docker:17.12 | ||||||
|  |     pull: true | ||||||
|  |     secrets: [ docker_username, docker_password ] | ||||||
|  |     repo: gitea/tea | ||||||
|  |     tags: [ '${DRONE_BRANCH##release/v}' ] | ||||||
|  |     cache_from: gitea/tea | ||||||
|  |     when: | ||||||
|  |       event: [ push ] | ||||||
|  |       branch: [ release/* ] | ||||||
|  |  | ||||||
|  |   docker: | ||||||
|  |     image: plugins/docker:17.12 | ||||||
|  |     secrets: [ docker_username, docker_password ] | ||||||
|  |     pull: true | ||||||
|  |     repo: gitea/tea | ||||||
|  |     cache_from: gitea/tea | ||||||
|  |     default_tags: true | ||||||
|  |     when: | ||||||
|  |       event: [ push, tag ] | ||||||
|  |  | ||||||
|  |   gpg-sign: | ||||||
|  |     image: plugins/gpgsign:1 | ||||||
|  |     pull: true | ||||||
|  |     secrets: [ gpgsign_key, gpgsign_passphrase ] | ||||||
|  |     detach_sign: true | ||||||
|  |     files: | ||||||
|  |       - dist/release/* | ||||||
|  |     excludes: | ||||||
|  |       - dist/release/*.sha256 | ||||||
|  |     when: | ||||||
|  |       event: [ push, tag ] | ||||||
|  |  | ||||||
|  |   tag-release: | ||||||
|  |     image: plugins/s3:1 | ||||||
|  |     pull: true | ||||||
|  |     secrets: [ aws_access_key_id, aws_secret_access_key ] | ||||||
|  |     bucket: releases | ||||||
|  |     acl: public-read | ||||||
|  |     endpoint: https://storage.gitea.io | ||||||
|  |     path_style: true | ||||||
|  |     strip_prefix: dist/release/ | ||||||
|  |     source: dist/release/* | ||||||
|  |     target: /tea/${DRONE_TAG##v} | ||||||
|  |     when: | ||||||
|  |       event: [ tag ] | ||||||
|  |  | ||||||
|  |   release-branch-release: | ||||||
|  |     image: plugins/s3:1 | ||||||
|  |     pull: true | ||||||
|  |     secrets: [ aws_access_key_id, aws_secret_access_key ] | ||||||
|  |     bucket: releases | ||||||
|  |     acl: public-read | ||||||
|  |     endpoint: https://storage.gitea.io | ||||||
|  |     path_style: true | ||||||
|  |     strip_prefix: dist/release/ | ||||||
|  |     source: dist/release/* | ||||||
|  |     target: /tea/${DRONE_BRANCH##release/v} | ||||||
|  |     when: | ||||||
|  |       event: [ push ] | ||||||
|  |       branch: [ release/* ] | ||||||
|  |  | ||||||
|  |   release: | ||||||
|  |     image: plugins/s3:1 | ||||||
|  |     pull: true | ||||||
|  |     secrets: [ aws_access_key_id, aws_secret_access_key ] | ||||||
|  |     bucket: releases | ||||||
|  |     acl: public-read | ||||||
|  |     endpoint: https://storage.gitea.io | ||||||
|  |     path_style: true | ||||||
|  |     strip_prefix: dist/release/ | ||||||
|  |     source: dist/release/* | ||||||
|  |     target: /tea/master | ||||||
|  |     when: | ||||||
|  |       event: [ push ] | ||||||
|  |       branch: [ master ] | ||||||
|  |  | ||||||
|  |   github: | ||||||
|  |     image: plugins/github-release:1 | ||||||
|  |     pull: true | ||||||
|  |     secrets: [ github_token ] | ||||||
|  |     files: | ||||||
|  |       - dist/release/* | ||||||
|  |     when: | ||||||
|  |       event: [ tag ] | ||||||
|  |  | ||||||
|  |   discord: | ||||||
|  |     image: appleboy/drone-discord:1.0.0 | ||||||
|  |     pull: true | ||||||
|  |     secrets: [ discord_webhook_id, discord_webhook_token ] | ||||||
|  |     when: | ||||||
|  |       event: [ push, tag, pull_request ] | ||||||
|  |       status: [ changed, failure ] | ||||||
							
								
								
									
										25
									
								
								.revive.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								.revive.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | ignoreGeneratedHeader = false | ||||||
|  | severity = "warning" | ||||||
|  | confidence = 0.8 | ||||||
|  | errorCode = 1 | ||||||
|  | warningCode = 1 | ||||||
|  |  | ||||||
|  | [rule.blank-imports] | ||||||
|  | [rule.context-as-argument] | ||||||
|  | [rule.context-keys-type] | ||||||
|  | [rule.dot-imports] | ||||||
|  | [rule.error-return] | ||||||
|  | [rule.error-strings] | ||||||
|  | [rule.error-naming] | ||||||
|  | [rule.exported] | ||||||
|  | [rule.if-return] | ||||||
|  | [rule.increment-decrement] | ||||||
|  | [rule.var-naming] | ||||||
|  | [rule.var-declaration] | ||||||
|  | [rule.package-comments] | ||||||
|  | [rule.range] | ||||||
|  | [rule.receiver-naming] | ||||||
|  | [rule.time-naming] | ||||||
|  | [rule.unexported-return] | ||||||
|  | [rule.indent-error-flow] | ||||||
|  | [rule.errorf] | ||||||
							
								
								
									
										197
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,197 @@ | |||||||
|  | DIST := dist | ||||||
|  | IMPORT := code.gitea.io/tea | ||||||
|  | export GO111MODULE=off | ||||||
|  |  | ||||||
|  | GO ?= go | ||||||
|  | SED_INPLACE := sed -i | ||||||
|  | SHASUM ?= shasum -a 256 | ||||||
|  |  | ||||||
|  | export PATH := $($(GO) env GOPATH)/bin:$(PATH) | ||||||
|  |  | ||||||
|  | ifeq ($(OS), Windows_NT) | ||||||
|  | 	EXECUTABLE := tea.exe | ||||||
|  | else | ||||||
|  | 	EXECUTABLE := tea | ||||||
|  | 	UNAME_S := $(shell uname -s) | ||||||
|  | 	ifeq ($(UNAME_S),Darwin) | ||||||
|  | 		SED_INPLACE := sed -i '' | ||||||
|  | 	endif | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | GOFILES := $(shell find . -name "*.go" -type f ! -path "./vendor/*" ! -path "*/bindata.go") | ||||||
|  | GOFMT ?= gofmt -s | ||||||
|  |  | ||||||
|  | GOFLAGS := -i -v | ||||||
|  | EXTRA_GOFLAGS ?= | ||||||
|  |  | ||||||
|  | MAKE_VERSION := $(shell make -v | head -n 1) | ||||||
|  |  | ||||||
|  | ifneq ($(DRONE_TAG),) | ||||||
|  | 	VERSION ?= $(subst v,,$(DRONE_TAG)) | ||||||
|  | 	GITEA_VERSION ?= $(VERSION) | ||||||
|  | else | ||||||
|  | 	ifneq ($(DRONE_BRANCH),) | ||||||
|  | 		VERSION ?= $(subst release/v,,$(DRONE_BRANCH)) | ||||||
|  | 	else | ||||||
|  | 		VERSION ?= master | ||||||
|  | 	endif | ||||||
|  | 	GITEA_VERSION ?= $(shell git describe --tags --always | sed 's/-/+/' | sed 's/^v//') | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | LDFLAGS := -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)" | ||||||
|  |  | ||||||
|  | PACKAGES ?= $(filter-out code.gitea.io/gitea/integrations/migration-test,$(filter-out code.gitea.io/gitea/integrations,$(shell $(GO) list ./... | grep -v /vendor/))) | ||||||
|  | SOURCES ?= $(shell find . -name "*.go" -type f) | ||||||
|  |  | ||||||
|  | TAGS ?= | ||||||
|  |  | ||||||
|  | TMPDIR := $(shell mktemp -d 2>/dev/null || mktemp -d -t 'gitea-temp') | ||||||
|  |  | ||||||
|  | ifeq ($(OS), Windows_NT) | ||||||
|  | 	EXECUTABLE := tea.exe | ||||||
|  | else | ||||||
|  | 	EXECUTABLE := tea | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | # $(call strip-suffix,filename) | ||||||
|  | strip-suffix = $(firstword $(subst ., ,$(1))) | ||||||
|  |  | ||||||
|  | .PHONY: all | ||||||
|  | all: build | ||||||
|  |  | ||||||
|  | .PHONY: clean | ||||||
|  | clean: | ||||||
|  | 	$(GO) clean -i ./... | ||||||
|  | 	rm -rf $(EXECUTABLE) $(DIST) $(BINDATA) | ||||||
|  |  | ||||||
|  | .PHONY: fmt | ||||||
|  | fmt: | ||||||
|  | 	$(GOFMT) -w $(GOFILES) | ||||||
|  |  | ||||||
|  | .PHONY: vet | ||||||
|  | vet: | ||||||
|  | 	$(GO) vet $(PACKAGES) | ||||||
|  |  | ||||||
|  | .PHONY: errcheck | ||||||
|  | errcheck: | ||||||
|  | 	@hash errcheck > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ | ||||||
|  | 		$(GO) get -u github.com/kisielk/errcheck; \ | ||||||
|  | 	fi | ||||||
|  | 	errcheck $(PACKAGES) | ||||||
|  |  | ||||||
|  | .PHONY: lint | ||||||
|  | lint: | ||||||
|  | 	@hash revive > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ | ||||||
|  | 		$(GO) get -u github.com/mgechev/revive; \ | ||||||
|  | 	fi | ||||||
|  | 	revive -config .revive.toml -exclude=./vendor/... ./... || exit 1 | ||||||
|  |  | ||||||
|  | .PHONY: misspell-check | ||||||
|  | misspell-check: | ||||||
|  | 	@hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ | ||||||
|  | 		$(GO) get -u github.com/client9/misspell/cmd/misspell; \ | ||||||
|  | 	fi | ||||||
|  | 	misspell -error -i unknwon,destory $(GOFILES) | ||||||
|  |  | ||||||
|  | .PHONY: misspell | ||||||
|  | misspell: | ||||||
|  | 	@hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ | ||||||
|  | 		$(GO) get -u github.com/client9/misspell/cmd/misspell; \ | ||||||
|  | 	fi | ||||||
|  | 	misspell -w -i unknwon $(GOFILES) | ||||||
|  |  | ||||||
|  | .PHONY: fmt-check | ||||||
|  | fmt-check: | ||||||
|  | 	# get all go files and run go fmt on them | ||||||
|  | 	@diff=$$($(GOFMT) -d $(GOFILES)); \ | ||||||
|  | 	if [ -n "$$diff" ]; then \ | ||||||
|  | 		echo "Please run 'make fmt' and commit the result:"; \ | ||||||
|  | 		echo "$${diff}"; \ | ||||||
|  | 		exit 1; \ | ||||||
|  | 	fi; | ||||||
|  |  | ||||||
|  | .PHONY: test | ||||||
|  | test: | ||||||
|  | 	GO111MODULE=on $(GO) test -mod=vendor -tags='sqlite sqlite_unlock_notify' $(PACKAGES) | ||||||
|  |  | ||||||
|  | .PHONY: coverage | ||||||
|  | coverage: | ||||||
|  | 	@hash gocovmerge > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ | ||||||
|  | 		$(GO) get -u github.com/wadey/gocovmerge; \ | ||||||
|  | 	fi | ||||||
|  | 	gocovmerge integration.coverage.out $(shell find . -type f -name "coverage.out") > coverage.all;\ | ||||||
|  |  | ||||||
|  | .PHONY: unit-test-coverage | ||||||
|  | unit-test-coverage: | ||||||
|  | 	$(GO) test -tags='sqlite sqlite_unlock_notify' -cover -coverprofile coverage.out $(PACKAGES) && echo "\n==>\033[32m Ok\033[m\n" || exit 1 | ||||||
|  |  | ||||||
|  | .PHONY: vendor | ||||||
|  | vendor: | ||||||
|  | 	GO111MODULE=on $(GO) mod tidy && GO111MODULE=on $(GO) mod vendor | ||||||
|  |  | ||||||
|  | .PHONY: test-vendor | ||||||
|  | test-vendor: vendor | ||||||
|  | 	@diff=$$(git diff vendor/); \ | ||||||
|  | 	if [ -n "$$diff" ]; then \ | ||||||
|  | 		echo "Please run 'make vendor' and commit the result:"; \ | ||||||
|  | 		echo "$${diff}"; \ | ||||||
|  | 		exit 1; \ | ||||||
|  | 	fi; | ||||||
|  |  | ||||||
|  | .PHONY: check | ||||||
|  | check: test | ||||||
|  |  | ||||||
|  | .PHONY: install | ||||||
|  | install: $(wildcard *.go) | ||||||
|  | 	$(GO) install -v -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' | ||||||
|  |  | ||||||
|  | .PHONY: build | ||||||
|  | build: $(EXECUTABLE) | ||||||
|  |  | ||||||
|  | $(EXECUTABLE): $(SOURCES) | ||||||
|  | 	GO111MODULE=on $(GO) build -mod=vendor $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' -o $@ | ||||||
|  |  | ||||||
|  | .PHONY: release | ||||||
|  | release: release-dirs release-windows release-linux release-darwin release-copy release-compress release-check | ||||||
|  |  | ||||||
|  | .PHONY: release-dirs | ||||||
|  | release-dirs: | ||||||
|  | 	mkdir -p $(DIST)/binaries $(DIST)/release | ||||||
|  |  | ||||||
|  | .PHONY: release-windows | ||||||
|  | release-windows: | ||||||
|  | 	@hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ | ||||||
|  | 		$(GO) get -u src.techknowlogick.com/xgo; \ | ||||||
|  | 	fi | ||||||
|  | 	xgo -dest $(DIST)/binaries -tags 'netgo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets 'windows/*' -out gitea-$(VERSION) . | ||||||
|  | ifeq ($(CI),drone) | ||||||
|  | 	cp /build/* $(DIST)/binaries | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | .PHONY: release-linux | ||||||
|  | release-linux: | ||||||
|  | 	@hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ | ||||||
|  | 		$(GO) get -u src.techknowlogick.com/xgo; \ | ||||||
|  | 	fi | ||||||
|  | 	xgo -dest $(DIST)/binaries -tags 'netgo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets 'linux/*' -out gitea-$(VERSION) . | ||||||
|  | ifeq ($(CI),drone) | ||||||
|  | 	cp /build/* $(DIST)/binaries | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | .PHONY: release-darwin | ||||||
|  | release-darwin: | ||||||
|  | 	@hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ | ||||||
|  | 		$(GO) get -u src.techknowlogick.com/xgo; \ | ||||||
|  | 	fi | ||||||
|  | 	xgo -dest $(DIST)/binaries -tags 'netgo $(TAGS)' -ldflags '$(LDFLAGS)' -targets 'darwin/*' -out gitea-$(VERSION) . | ||||||
|  | ifeq ($(CI),drone) | ||||||
|  | 	cp /build/* $(DIST)/binaries | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | .PHONY: release-copy | ||||||
|  | release-copy: | ||||||
|  | 	cd $(DIST); for file in `find /build -type f -name "*"`; do cp $${file} ./release/; done; | ||||||
|  |  | ||||||
|  | .PHONY: release-check | ||||||
|  | release-check: | ||||||
|  | 	cd $(DIST)/release/; for file in `find . -type f -name "*"`; do echo "checksumming $${file}" && $(SHASUM) `echo $${file} | sed 's/^..//'` > $${file}.sha256; done; | ||||||
| @@ -17,14 +17,15 @@ import ( | |||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"code.gitea.io/git" |  | ||||||
| 	"code.gitea.io/sdk/gitea" | 	"code.gitea.io/sdk/gitea" | ||||||
| 	local_git "code.gitea.io/tea/modules/git" | 	local_git "code.gitea.io/tea/modules/git" | ||||||
| 	"code.gitea.io/tea/modules/utils" | 	"code.gitea.io/tea/modules/utils" | ||||||
|  | 	git_config "gopkg.in/src-d/go-git.v4/config" | ||||||
|  |  | ||||||
| 	"github.com/go-gitea/yaml" | 	"github.com/go-gitea/yaml" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | // Login represents a login to a gitea server, you even could add multiple logins for one gitea server | ||||||
| type Login struct { | type Login struct { | ||||||
| 	Name     string `yaml:"name"` | 	Name     string `yaml:"name"` | ||||||
| 	URL      string `yaml:"url"` | 	URL      string `yaml:"url"` | ||||||
| @@ -34,6 +35,7 @@ type Login struct { | |||||||
| 	Insecure bool   `yaml:"insecure"` | 	Insecure bool   `yaml:"insecure"` | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Client returns a client to operate Gitea API | ||||||
| func (l *Login) Client() *gitea.Client { | func (l *Login) Client() *gitea.Client { | ||||||
| 	client := gitea.NewClient(l.URL, l.Token) | 	client := gitea.NewClient(l.URL, l.Token) | ||||||
| 	if l.Insecure { | 	if l.Insecure { | ||||||
| @@ -49,6 +51,7 @@ func (l *Login) Client() *gitea.Client { | |||||||
| 	return client | 	return client | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetSSHHost returns SSH host name | ||||||
| func (l *Login) GetSSHHost() string { | func (l *Login) GetSSHHost() string { | ||||||
| 	if l.SSHHost != "" { | 	if l.SSHHost != "" { | ||||||
| 		return l.SSHHost | 		return l.SSHHost | ||||||
| @@ -62,6 +65,7 @@ func (l *Login) GetSSHHost() string { | |||||||
| 	return u.Hostname() | 	return u.Hostname() | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Config reprensents local configurations | ||||||
| type Config struct { | type Config struct { | ||||||
| 	Logins []Login `yaml:"logins"` | 	Logins []Login `yaml:"logins"` | ||||||
| } | } | ||||||
| @@ -183,27 +187,35 @@ func saveConfig(ymlPath string) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func curGitRepoPath() (*Login, string, error) { | func curGitRepoPath() (*Login, string, error) { | ||||||
| 	cmd := git.NewCommand("remote", "get-url", "origin") | 	gitConfig := git_config.NewConfig() | ||||||
| 	u, err := cmd.RunInDir(filepath.Dir(os.Args[0])) | 	bs, err := ioutil.ReadFile(filepath.Join(filepath.Dir(os.Args[0]), ".git", "config")) | ||||||
| 	if err != nil || len(u) == 0 { |  | ||||||
| 		return nil, "", errors.New("You have to indicate a repo or execute the command in a repo") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	p, err := local_git.ParseURL(strings.TrimSpace(u)) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, "", fmt.Errorf("Git remote URL parse failed: %s", err.Error()) | 		return nil, "", err | ||||||
|  | 	} | ||||||
|  | 	if err := gitConfig.Unmarshal(bs); err != nil { | ||||||
|  | 		return nil, "", err | ||||||
|  | 	} | ||||||
|  | 	remoteConfig, ok := gitConfig.Remotes["origin"] | ||||||
|  | 	if !ok || remoteConfig == nil { | ||||||
|  | 		return nil, "", errors.New("No remote origin found on this git repository") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for _, l := range config.Logins { | 	for _, l := range config.Logins { | ||||||
| 		if p.Scheme == "http" || p.Scheme == "https" { | 		for _, u := range remoteConfig.URLs { | ||||||
| 			if strings.HasPrefix(u, l.URL) { | 			p, err := local_git.ParseURL(strings.TrimSpace(u)) | ||||||
| 				ps := strings.Split(p.Path, "/") | 			if err != nil { | ||||||
| 				path := strings.Join(ps[len(ps)-2:], "/") | 				return nil, "", fmt.Errorf("Git remote URL parse failed: %s", err.Error()) | ||||||
| 				return &l, strings.TrimSuffix(path, ".git"), nil |  | ||||||
| 			} | 			} | ||||||
| 		} else if p.Scheme == "ssh" { | 			if strings.EqualFold(p.Scheme, "http") || strings.EqualFold(p.Scheme, "https") { | ||||||
| 			if l.GetSSHHost() == p.Host { | 				if strings.HasPrefix(u, l.URL) { | ||||||
| 				return &l, strings.TrimLeft(strings.TrimSuffix(p.Path, ".git"), "/"), nil | 					ps := strings.Split(p.Path, "/") | ||||||
|  | 					path := strings.Join(ps[len(ps)-2:], "/") | ||||||
|  | 					return &l, strings.TrimSuffix(path, ".git"), nil | ||||||
|  | 				} | ||||||
|  | 			} else if strings.EqualFold(p.Scheme, "ssh") { | ||||||
|  | 				if l.GetSSHHost() == p.Host { | ||||||
|  | 					return &l, strings.TrimLeft(strings.TrimSuffix(p.Path, ".git"), "/"), nil | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -38,6 +38,7 @@ var CmdIssues = cli.Command{ | |||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // CmdIssuesList represents a sub command of issues to list issues | ||||||
| var CmdIssuesList = cli.Command{ | var CmdIssuesList = cli.Command{ | ||||||
| 	Name:        "ls", | 	Name:        "ls", | ||||||
| 	Usage:       "List issues of the repository", | 	Usage:       "List issues of the repository", | ||||||
| @@ -106,6 +107,7 @@ func runIssuesList(ctx *cli.Context) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // CmdIssuesCreate represents a sub command of issues to create issue | ||||||
| var CmdIssuesCreate = cli.Command{ | var CmdIssuesCreate = cli.Command{ | ||||||
| 	Name:        "create", | 	Name:        "create", | ||||||
| 	Usage:       "Create an issue on repository", | 	Usage:       "Create an issue on repository", | ||||||
|   | |||||||
| @@ -59,6 +59,7 @@ func runReleases(ctx *cli.Context) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // CmdReleaseCreate represents a sub command of Release to create release. | ||||||
| var CmdReleaseCreate = cli.Command{ | var CmdReleaseCreate = cli.Command{ | ||||||
| 	Name:        "create", | 	Name:        "create", | ||||||
| 	Usage:       "Create a release in repository", | 	Usage:       "Create a release in repository", | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | module code.gitea.io/tea | ||||||
|  |  | ||||||
|  | go 1.12 | ||||||
|  |  | ||||||
|  | require ( | ||||||
|  | 	code.gitea.io/sdk v0.0.0-20190424055801-13a7bf625b83 | ||||||
|  | 	github.com/go-gitea/yaml v0.0.0-20170812160011-eb3733d160e7 | ||||||
|  | 	github.com/urfave/cli v1.20.0 | ||||||
|  | 	gopkg.in/src-d/go-git.v4 v4.11.0 | ||||||
|  | 	gopkg.in/yaml.v2 v2.2.2 // indirect | ||||||
|  | ) | ||||||
							
								
								
									
										66
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | |||||||
|  | code.gitea.io/sdk v0.0.0-20190424055801-13a7bf625b83 h1:wrdvJESj8NgPL4tDGNHGAIDOe/rFE8+gIGDwsvC6MuE= | ||||||
|  | code.gitea.io/sdk v0.0.0-20190424055801-13a7bf625b83/go.mod h1:5bZt0dRznpn2JysytQnV0yCru3FwDv9O5G91jo+lDAk= | ||||||
|  | github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= | ||||||
|  | github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= | ||||||
|  | github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= | ||||||
|  | github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= | ||||||
|  | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||||
|  | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
|  | github.com/emirpasic/gods v1.9.0 h1:rUF4PuzEjMChMiNsVjdI+SyLu7rEqpQ5reNFnhC7oFo= | ||||||
|  | github.com/emirpasic/gods v1.9.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= | ||||||
|  | github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= | ||||||
|  | github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= | ||||||
|  | github.com/gliderlabs/ssh v0.1.1 h1:j3L6gSLQalDETeEg/Jg0mGY0/y/N6zI2xX1978P0Uqw= | ||||||
|  | github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= | ||||||
|  | github.com/go-gitea/yaml v0.0.0-20170812160011-eb3733d160e7 h1:/FEVbfrJ50yBk73Lyq1oCZ4VaCc0g1xd9xLHjz+Znf8= | ||||||
|  | github.com/go-gitea/yaml v0.0.0-20170812160011-eb3733d160e7/go.mod h1:WjJPyqjAk/UMv+Fk/ZRjEOh5SXszSALnSzKqICd7pNg= | ||||||
|  | github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= | ||||||
|  | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | ||||||
|  | github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= | ||||||
|  | github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= | ||||||
|  | github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= | ||||||
|  | github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e h1:RgQk53JHp/Cjunrr1WlsXSZpqXn+uREuHvUVcK82CV8= | ||||||
|  | github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= | ||||||
|  | github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= | ||||||
|  | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | ||||||
|  | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||||
|  | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | ||||||
|  | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||||
|  | github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0= | ||||||
|  | github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= | ||||||
|  | github.com/pelletier/go-buffruneio v0.2.0 h1:U4t4R6YkofJ5xHm3dJzuRpPZ0mr5MMCoAWooScCR7aA= | ||||||
|  | github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= | ||||||
|  | github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= | ||||||
|  | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||||
|  | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||||
|  | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
|  | github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= | ||||||
|  | github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= | ||||||
|  | github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= | ||||||
|  | github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= | ||||||
|  | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||||
|  | github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= | ||||||
|  | github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= | ||||||
|  | github.com/xanzy/ssh-agent v0.2.0 h1:Adglfbi5p9Z0BmK2oKU9nTG+zKfniSfnaMYB+ULd+Ro= | ||||||
|  | github.com/xanzy/ssh-agent v0.2.0/go.mod h1:0NyE30eGUDliuLEHJgYte/zncp2zdTStcOnWhgSqHD8= | ||||||
|  | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I= | ||||||
|  | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||||
|  | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= | ||||||
|  | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
|  | golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9 h1:lkiLiLBHGoH3XnqSLUIaBsilGMUjI+Uy2Xu2JLUtTas= | ||||||
|  | golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
|  | golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= | ||||||
|  | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
|  | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= | ||||||
|  | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  | gopkg.in/src-d/go-billy.v4 v4.2.1 h1:omN5CrMrMcQ+4I8bJ0wEhOBPanIRWzFC953IiXKdYzo= | ||||||
|  | gopkg.in/src-d/go-billy.v4 v4.2.1/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk= | ||||||
|  | gopkg.in/src-d/go-git-fixtures.v3 v3.1.1 h1:XWW/s5W18RaJpmo1l0IYGqXKuJITWRFuA45iOf1dKJs= | ||||||
|  | gopkg.in/src-d/go-git-fixtures.v3 v3.1.1/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= | ||||||
|  | gopkg.in/src-d/go-git.v4 v4.11.0 h1:cJwWgJ0DXifrNrXM6RGN1Y2yR60Rr1zQ9Q5DX5S9qgU= | ||||||
|  | gopkg.in/src-d/go-git.v4 v4.11.0/go.mod h1:Vtut8izDyrM8BUVQnzJ+YvmNcem2J89EmfZYCkLokZk= | ||||||
|  | gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= | ||||||
|  | gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= | ||||||
|  | gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= | ||||||
|  | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
| @@ -10,9 +10,11 @@ var ( | |||||||
| 	protocolRe = regexp.MustCompile("^[a-zA-Z_+-]+://") | 	protocolRe = regexp.MustCompile("^[a-zA-Z_+-]+://") | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | // URLParser represents a git URL parser | ||||||
| type URLParser struct { | type URLParser struct { | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Parse parses the git URL | ||||||
| func (p *URLParser) Parse(rawURL string) (u *url.URL, err error) { | func (p *URLParser) Parse(rawURL string) (u *url.URL, err error) { | ||||||
| 	if !protocolRe.MatchString(rawURL) && | 	if !protocolRe.MatchString(rawURL) && | ||||||
| 		strings.Contains(rawURL, ":") && | 		strings.Contains(rawURL, ":") && | ||||||
| @@ -37,6 +39,7 @@ func (p *URLParser) Parse(rawURL string) (u *url.URL, err error) { | |||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // ParseURL parses URL string and return URL struct | ||||||
| func ParseURL(rawURL string) (u *url.URL, err error) { | func ParseURL(rawURL string) (u *url.URL, err error) { | ||||||
| 	p := &URLParser{} | 	p := &URLParser{} | ||||||
| 	return p.Parse(rawURL) | 	return p.Parse(rawURL) | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ | |||||||
|  |  | ||||||
| package setting | package setting | ||||||
|  |  | ||||||
|  | // App related variables | ||||||
| var ( | var ( | ||||||
| 	AppVer       string | 	AppVer       string | ||||||
| 	AppBuiltWith string | 	AppBuiltWith string | ||||||
|   | |||||||
							
								
								
									
										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 | ||||||
|  | } | ||||||
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