Remove golang vendored directory (#18277)
* rm go vendor * fix drone yaml * add to gitignore
This commit is contained in:
		
							parent
							
								
									2b16ca7c77
								
							
						
					
					
						commit
						84145e45c5
					
				
							
								
								
									
										48
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								.drone.yml
									
									
									
									
									
								
							| @ -88,16 +88,16 @@ steps: | ||||
|     image: golang:1.16 # this step is kept as the lowest version of golang that we support | ||||
|     environment: | ||||
|       GO111MODULE: on | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|     commands: | ||||
|       - go build -mod=vendor -o gitea_no_gcc # test if build succeeds without the sqlite tag | ||||
|       - go build -o gitea_no_gcc # test if build succeeds without the sqlite tag | ||||
|     depends_on: [checks-backend] | ||||
| 
 | ||||
|   - name: build-backend-arm64 | ||||
|     image: golang:1.17 | ||||
|     environment: | ||||
|       GO111MODULE: on | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|       GOOS: linux | ||||
|       GOARCH: arm64 | ||||
|       TAGS: bindata gogit | ||||
| @ -110,23 +110,23 @@ steps: | ||||
|     image: golang:1.17 | ||||
|     environment: | ||||
|       GO111MODULE: on | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|       GOOS: windows | ||||
|       GOARCH: amd64 | ||||
|       TAGS: bindata gogit | ||||
|     commands: | ||||
|       - go build -mod=vendor -o gitea_windows | ||||
|       - go build -o gitea_windows | ||||
|     depends_on: [checks-backend] | ||||
| 
 | ||||
|   - name: build-backend-386 | ||||
|     image: golang:1.17 | ||||
|     environment: | ||||
|       GO111MODULE: on | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|       GOOS: linux | ||||
|       GOARCH: 386 | ||||
|     commands: | ||||
|       - go build -mod=vendor -o gitea_linux_386 # test if compatible with 32 bit | ||||
|       - go build -o gitea_linux_386 # test if compatible with 32 bit | ||||
|     depends_on: [checks-backend] | ||||
| 
 | ||||
| --- | ||||
| @ -224,7 +224,7 @@ steps: | ||||
|     commands: | ||||
|       - make unit-test-coverage test-check | ||||
|     environment: | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|       TAGS: bindata sqlite sqlite_unlock_notify | ||||
|       RACE_ENABLED: true | ||||
|       GITHUB_READ_TOKEN: | ||||
| @ -237,7 +237,7 @@ steps: | ||||
|     commands: | ||||
|       - make unit-test-coverage test-check | ||||
|     environment: | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|       TAGS: bindata gogit sqlite sqlite_unlock_notify | ||||
|       RACE_ENABLED: true | ||||
|       GITHUB_READ_TOKEN: | ||||
| @ -249,7 +249,7 @@ steps: | ||||
|     commands: | ||||
|       - make test-mysql-migration integration-test-coverage | ||||
|     environment: | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|       TAGS: bindata | ||||
|       RACE_ENABLED: true | ||||
|       TEST_LDAP: 1 | ||||
| @ -264,7 +264,7 @@ steps: | ||||
|     commands: | ||||
|       - timeout -s ABRT 40m make test-mysql8-migration test-mysql8 | ||||
|     environment: | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|       TAGS: bindata | ||||
|       RACE_ENABLED: true | ||||
|       TEST_LDAP: 1 | ||||
| @ -278,7 +278,7 @@ steps: | ||||
|     commands: | ||||
|       - make test-mssql-migration test-mssql | ||||
|     environment: | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|       TAGS: bindata | ||||
|       RACE_ENABLED: true | ||||
|       TEST_LDAP: 1 | ||||
| @ -291,7 +291,7 @@ steps: | ||||
|     commands: | ||||
|       - make coverage | ||||
|     environment: | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|       TAGS: bindata | ||||
|     depends_on: | ||||
|       - unit-test | ||||
| @ -384,7 +384,7 @@ steps: | ||||
|     commands: | ||||
|       - timeout -s ABRT 40m make test-sqlite-migration test-sqlite | ||||
|     environment: | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|       TAGS: bindata gogit sqlite sqlite_unlock_notify | ||||
|       RACE_ENABLED: true | ||||
|       TEST_TAGS: gogit sqlite sqlite_unlock_notify | ||||
| @ -398,7 +398,7 @@ steps: | ||||
|     commands: | ||||
|       - timeout -s ABRT 40m make test-pgsql-migration test-pgsql | ||||
|     environment: | ||||
|       GOPROXY: off | ||||
|       GOPROXY: https://goproxy.cn | ||||
|       TAGS: bindata gogit | ||||
|       RACE_ENABLED: true | ||||
|       TEST_TAGS: gogit | ||||
| @ -760,7 +760,7 @@ steps: | ||||
|       auto_tag_suffix: linux-amd64 | ||||
|       repo: gitea/gitea | ||||
|       build_args: | ||||
|         - GOPROXY=off | ||||
|         - GOPROXY=https://goproxy.cn | ||||
|       password: | ||||
|         from_secret: docker_password | ||||
|       username: | ||||
| @ -778,7 +778,7 @@ steps: | ||||
|       auto_tag_suffix: linux-amd64-rootless | ||||
|       repo: gitea/gitea | ||||
|       build_args: | ||||
|         - GOPROXY=off | ||||
|         - GOPROXY=https://goproxy.cn | ||||
|       password: | ||||
|         from_secret: docker_password | ||||
|       username: | ||||
| @ -822,7 +822,7 @@ steps: | ||||
|       tags: dev-linux-amd64 | ||||
|       repo: gitea/gitea | ||||
|       build_args: | ||||
|         - GOPROXY=off | ||||
|         - GOPROXY=https://goproxy.cn | ||||
|       password: | ||||
|         from_secret: docker_password | ||||
|       username: | ||||
| @ -840,7 +840,7 @@ steps: | ||||
|       tags: dev-linux-amd64-rootless | ||||
|       repo: gitea/gitea | ||||
|       build_args: | ||||
|         - GOPROXY=off | ||||
|         - GOPROXY=https://goproxy.cn | ||||
|       password: | ||||
|         from_secret: docker_password | ||||
|       username: | ||||
| @ -875,7 +875,7 @@ steps: | ||||
|       repo: gitea/gitea | ||||
|       tags: linux-arm64 | ||||
|       build_args: | ||||
|         - GOPROXY=off | ||||
|         - GOPROXY=https://goproxy.cn | ||||
|     environment: | ||||
|       PLUGIN_MIRROR: | ||||
|         from_secret: plugin_mirror | ||||
| @ -917,7 +917,7 @@ steps: | ||||
|       auto_tag_suffix: linux-arm64 | ||||
|       repo: gitea/gitea | ||||
|       build_args: | ||||
|         - GOPROXY=off | ||||
|         - GOPROXY=https://goproxy.cn | ||||
|       password: | ||||
|         from_secret: docker_password | ||||
|       username: | ||||
| @ -935,7 +935,7 @@ steps: | ||||
|       auto_tag_suffix: linux-arm64-rootless | ||||
|       repo: gitea/gitea | ||||
|       build_args: | ||||
|         - GOPROXY=off | ||||
|         - GOPROXY=https://goproxy.cn | ||||
|       password: | ||||
|         from_secret: docker_password | ||||
|       username: | ||||
| @ -979,7 +979,7 @@ steps: | ||||
|       tags: dev-linux-arm64 | ||||
|       repo: gitea/gitea | ||||
|       build_args: | ||||
|         - GOPROXY=off | ||||
|         - GOPROXY=https://goproxy.cn | ||||
|       password: | ||||
|         from_secret: docker_password | ||||
|       username: | ||||
| @ -997,7 +997,7 @@ steps: | ||||
|       tags: dev-linux-arm64-rootless | ||||
|       repo: gitea/gitea | ||||
|       build_args: | ||||
|         - GOPROXY=off | ||||
|         - GOPROXY=https://goproxy.cn | ||||
|       password: | ||||
|         from_secret: docker_password | ||||
|       username: | ||||
|  | ||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -85,6 +85,7 @@ cpu.out | ||||
| /public/css | ||||
| /public/fonts | ||||
| /public/img/webpack | ||||
| /vendor | ||||
| /web_src/fomantic/node_modules | ||||
| /web_src/fomantic/build/* | ||||
| !/web_src/fomantic/build/semantic.js | ||||
|  | ||||
							
								
								
									
										36
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								Makefile
									
									
									
									
									
								
							| @ -92,7 +92,7 @@ LDFLAGS := $(LDFLAGS) -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(G | ||||
| 
 | ||||
| LINUX_ARCHS ?= linux/amd64,linux/386,linux/arm-5,linux/arm-6,linux/arm64 | ||||
| 
 | ||||
| GO_PACKAGES ?= $(filter-out code.gitea.io/gitea/models/migrations code.gitea.io/gitea/integrations/migration-test code.gitea.io/gitea/integrations,$(shell $(GO) list -mod=vendor ./... | grep -v /vendor/)) | ||||
| GO_PACKAGES ?= $(filter-out code.gitea.io/gitea/models/migrations code.gitea.io/gitea/integrations/migration-test code.gitea.io/gitea/integrations,$(shell $(GO) list ./... | grep -v /vendor/)) | ||||
| 
 | ||||
| FOMANTIC_WORK_DIR := web_src/fomantic | ||||
| 
 | ||||
| @ -116,7 +116,7 @@ TEST_TAGS ?= sqlite sqlite_unlock_notify | ||||
| 
 | ||||
| TAR_EXCLUDES := .git data indexers queues log node_modules $(EXECUTABLE) $(FOMANTIC_WORK_DIR)/node_modules $(DIST) $(MAKE_EVIDENCE_DIR) $(AIR_TMP_DIR) | ||||
| 
 | ||||
| GO_DIRS := cmd integrations models modules routers build services vendor tools | ||||
| GO_DIRS := cmd integrations models modules routers build services tools | ||||
| 
 | ||||
| GO_SOURCES := $(wildcard *.go) | ||||
| GO_SOURCES += $(shell find $(GO_DIRS) -type f -name "*.go" -not -path modules/options/bindata.go -not -path modules/public/bindata.go -not -path modules/templates/bindata.go) | ||||
| @ -126,7 +126,7 @@ ifeq ($(filter $(TAGS_SPLIT),bindata),bindata) | ||||
| endif | ||||
| 
 | ||||
| #To update swagger use: GO111MODULE=on go get -u github.com/go-swagger/go-swagger/cmd/swagger
 | ||||
| SWAGGER := $(GO) run -mod=vendor github.com/go-swagger/go-swagger/cmd/swagger | ||||
| SWAGGER := $(GO) run github.com/go-swagger/go-swagger/cmd/swagger | ||||
| SWAGGER_SPEC := templates/swagger/v1_json.tmpl | ||||
| SWAGGER_SPEC_S_TMPL := s|"basePath": *"/api/v1"|"basePath": "{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|g | ||||
| SWAGGER_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|"basePath": "/api/v1"|g | ||||
| @ -237,7 +237,7 @@ fmt: | ||||
| .PHONY: vet | ||||
| vet: | ||||
| 	@echo "Running go vet..." | ||||
| 	@GOOS= GOARCH= $(GO) build -mod=vendor code.gitea.io/gitea-vet | ||||
| 	@GOOS= GOARCH= $(GO) build code.gitea.io/gitea-vet | ||||
| 	@$(GO) vet -vettool=gitea-vet $(GO_PACKAGES) | ||||
| 
 | ||||
| .PHONY: $(TAGS_EVIDENCE) | ||||
| @ -295,7 +295,7 @@ checks: checks-frontend checks-backend | ||||
| checks-frontend: svg-check | ||||
| 
 | ||||
| .PHONY: checks-backend | ||||
| checks-backend: test-vendor swagger-check swagger-validate | ||||
| checks-backend: swagger-check swagger-validate | ||||
| 
 | ||||
| .PHONY: lint | ||||
| lint: lint-frontend lint-backend | ||||
| @ -331,7 +331,7 @@ test: test-frontend test-backend | ||||
| .PHONY: test-backend | ||||
| test-backend: | ||||
| 	@echo "Running go test with $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..." | ||||
| 	@$(GO) test $(GOTESTFLAGS) -mod=vendor -tags='$(TEST_TAGS)' $(GO_PACKAGES) | ||||
| 	@$(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_PACKAGES) | ||||
| 
 | ||||
| .PHONY: test-frontend | ||||
| test-frontend: node_modules | ||||
| @ -352,18 +352,18 @@ test-check: | ||||
| .PHONY: test\#%
 | ||||
| test\#%: | ||||
| 	@echo "Running go test with -tags '$(TEST_TAGS)'..." | ||||
| 	@$(GO) test -mod=vendor $(GOTESTFLAGS) -tags='$(TEST_TAGS)' -run $(subst .,/,$*) $(GO_PACKAGES) | ||||
| 	@$(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' -run $(subst .,/,$*) $(GO_PACKAGES) | ||||
| 
 | ||||
| .PHONY: coverage | ||||
| coverage: | ||||
| 	grep '^\(mode: .*\)\|\(.*:[0-9]\+\.[0-9]\+,[0-9]\+\.[0-9]\+ [0-9]\+ [0-9]\+\)$$' coverage.out > coverage-bodged.out | ||||
| 	grep '^\(mode: .*\)\|\(.*:[0-9]\+\.[0-9]\+,[0-9]\+\.[0-9]\+ [0-9]\+ [0-9]\+\)$$' integration.coverage.out > integration.coverage-bodged.out | ||||
| 	GO111MODULE=on $(GO) run -mod=vendor build/gocovmerge.go integration.coverage-bodged.out coverage-bodged.out > coverage.all || (echo "gocovmerge failed"; echo "integration.coverage.out"; cat integration.coverage.out; echo "coverage.out"; cat coverage.out; exit 1) | ||||
| 	GO111MODULE=on $(GO) run build/gocovmerge.go integration.coverage-bodged.out coverage-bodged.out > coverage.all || (echo "gocovmerge failed"; echo "integration.coverage.out"; cat integration.coverage.out; echo "coverage.out"; cat coverage.out; exit 1) | ||||
| 
 | ||||
| .PHONY: unit-test-coverage | ||||
| unit-test-coverage: | ||||
| 	@echo "Running unit-test-coverage $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..." | ||||
| 	@$(GO) test $(GOTESTFLAGS) -mod=vendor -timeout=20m -tags='$(TEST_TAGS)' -cover -coverprofile coverage.out $(GO_PACKAGES) && echo "\n==>\033[32m Ok\033[m\n" || exit 1 | ||||
| 	@$(GO) test $(GOTESTFLAGS) -timeout=20m -tags='$(TEST_TAGS)' -cover -coverprofile coverage.out $(GO_PACKAGES) && echo "\n==>\033[32m Ok\033[m\n" || exit 1 | ||||
| 
 | ||||
| .PHONY: vendor | ||||
| vendor: | ||||
| @ -501,22 +501,22 @@ integration-test-coverage: integrations.cover.test generate-ini-mysql | ||||
| 	GITEA_ROOT="$(CURDIR)" GITEA_CONF=integrations/mysql.ini ./integrations.cover.test -test.coverprofile=integration.coverage.out | ||||
| 
 | ||||
| integrations.mysql.test: git-check $(GO_SOURCES) | ||||
| 	$(GO) test $(GOTESTFLAGS) -mod=vendor -c code.gitea.io/gitea/integrations -o integrations.mysql.test | ||||
| 	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/integrations -o integrations.mysql.test | ||||
| 
 | ||||
| integrations.mysql8.test: git-check $(GO_SOURCES) | ||||
| 	$(GO) test $(GOTESTFLAGS) -mod=vendor -c code.gitea.io/gitea/integrations -o integrations.mysql8.test | ||||
| 	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/integrations -o integrations.mysql8.test | ||||
| 
 | ||||
| integrations.pgsql.test: git-check $(GO_SOURCES) | ||||
| 	$(GO) test $(GOTESTFLAGS) -mod=vendor -c code.gitea.io/gitea/integrations -o integrations.pgsql.test | ||||
| 	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/integrations -o integrations.pgsql.test | ||||
| 
 | ||||
| integrations.mssql.test: git-check $(GO_SOURCES) | ||||
| 	$(GO) test $(GOTESTFLAGS) -mod=vendor -c code.gitea.io/gitea/integrations -o integrations.mssql.test | ||||
| 	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/integrations -o integrations.mssql.test | ||||
| 
 | ||||
| integrations.sqlite.test: git-check $(GO_SOURCES) | ||||
| 	$(GO) test $(GOTESTFLAGS) -mod=vendor -c code.gitea.io/gitea/integrations -o integrations.sqlite.test -tags '$(TEST_TAGS)' | ||||
| 	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/integrations -o integrations.sqlite.test -tags '$(TEST_TAGS)' | ||||
| 
 | ||||
| integrations.cover.test: git-check $(GO_SOURCES) | ||||
| 	$(GO) test $(GOTESTFLAGS) -mod=vendor -c code.gitea.io/gitea/integrations -coverpkg $(shell echo $(GO_PACKAGES) | tr ' ' ',') -o integrations.cover.test | ||||
| 	$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/integrations -coverpkg $(shell echo $(GO_PACKAGES) | tr ' ' ',') -o integrations.cover.test | ||||
| 
 | ||||
| .PHONY: migrations.mysql.test | ||||
| migrations.mysql.test: $(GO_SOURCES) | ||||
| @ -577,13 +577,13 @@ backend: go-check generate $(EXECUTABLE) | ||||
| .PHONY: generate | ||||
| generate: $(TAGS_PREREQ) | ||||
| 	@echo "Running go generate..." | ||||
| 	@CC= GOOS= GOARCH= $(GO) generate -mod=vendor -tags '$(TAGS)' $(GO_PACKAGES) | ||||
| 	@CC= GOOS= GOARCH= $(GO) generate -tags '$(TAGS)' $(GO_PACKAGES) | ||||
| 
 | ||||
| $(EXECUTABLE): $(GO_SOURCES) $(TAGS_PREREQ) | ||||
| 	CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build -mod=vendor $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' -o $@ | ||||
| 	CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' -o $@ | ||||
| 
 | ||||
| .PHONY: release | ||||
| release: frontend generate release-windows release-linux release-darwin release-copy release-compress release-sources release-docs release-check | ||||
| release: frontend generate release-windows release-linux release-darwin release-copy release-compress vendor release-sources release-docs release-check | ||||
| 
 | ||||
| $(DIST_DIRS): | ||||
| 	mkdir -p $(DIST_DIRS) | ||||
|  | ||||
| @ -7,4 +7,4 @@ | ||||
| 
 | ||||
| package options | ||||
| 
 | ||||
| //go:generate go run -mod=vendor ../../build/generate-bindata.go ../../options options bindata.go
 | ||||
| //go:generate go run ../../build/generate-bindata.go ../../options options bindata.go
 | ||||
|  | ||||
| @ -7,4 +7,4 @@ | ||||
| 
 | ||||
| package public | ||||
| 
 | ||||
| //go:generate go run -mod=vendor  ../../build/generate-bindata.go ../../public public bindata.go true
 | ||||
| //go:generate go run ../../build/generate-bindata.go ../../public public bindata.go true
 | ||||
|  | ||||
| @ -7,4 +7,4 @@ | ||||
| 
 | ||||
| package templates | ||||
| 
 | ||||
| //go:generate go run -mod=vendor ../../build/generate-bindata.go ../../templates templates bindata.go true
 | ||||
| //go:generate go run ../../build/generate-bindata.go ../../templates templates bindata.go true
 | ||||
|  | ||||
							
								
								
									
										202
									
								
								vendor/cloud.google.com/go/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										202
									
								
								vendor/cloud.google.com/go/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,202 +0,0 @@ | ||||
| 
 | ||||
|                                  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. | ||||
							
								
								
									
										519
									
								
								vendor/cloud.google.com/go/compute/metadata/metadata.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										519
									
								
								vendor/cloud.google.com/go/compute/metadata/metadata.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,519 +0,0 @@ | ||||
| // Copyright 2014 Google LLC
 | ||||
| //
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // Package metadata provides access to Google Compute Engine (GCE)
 | ||||
| // metadata and API service accounts.
 | ||||
| //
 | ||||
| // This package is a wrapper around the GCE metadata service,
 | ||||
| // as documented at https://developers.google.com/compute/docs/metadata.
 | ||||
| package metadata // import "cloud.google.com/go/compute/metadata"
 | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"os" | ||||
| 	"runtime" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	// metadataIP is the documented metadata server IP address.
 | ||||
| 	metadataIP = "169.254.169.254" | ||||
| 
 | ||||
| 	// metadataHostEnv is the environment variable specifying the
 | ||||
| 	// GCE metadata hostname.  If empty, the default value of
 | ||||
| 	// metadataIP ("169.254.169.254") is used instead.
 | ||||
| 	// This is variable name is not defined by any spec, as far as
 | ||||
| 	// I know; it was made up for the Go package.
 | ||||
| 	metadataHostEnv = "GCE_METADATA_HOST" | ||||
| 
 | ||||
| 	userAgent = "gcloud-golang/0.1" | ||||
| ) | ||||
| 
 | ||||
| type cachedValue struct { | ||||
| 	k    string | ||||
| 	trim bool | ||||
| 	mu   sync.Mutex | ||||
| 	v    string | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	projID  = &cachedValue{k: "project/project-id", trim: true} | ||||
| 	projNum = &cachedValue{k: "project/numeric-project-id", trim: true} | ||||
| 	instID  = &cachedValue{k: "instance/id", trim: true} | ||||
| ) | ||||
| 
 | ||||
| var defaultClient = &Client{hc: &http.Client{ | ||||
| 	Transport: &http.Transport{ | ||||
| 		Dial: (&net.Dialer{ | ||||
| 			Timeout:   2 * time.Second, | ||||
| 			KeepAlive: 30 * time.Second, | ||||
| 		}).Dial, | ||||
| 	}, | ||||
| }} | ||||
| 
 | ||||
| // NotDefinedError is returned when requested metadata is not defined.
 | ||||
| //
 | ||||
| // The underlying string is the suffix after "/computeMetadata/v1/".
 | ||||
| //
 | ||||
| // This error is not returned if the value is defined to be the empty
 | ||||
| // string.
 | ||||
| type NotDefinedError string | ||||
| 
 | ||||
| func (suffix NotDefinedError) Error() string { | ||||
| 	return fmt.Sprintf("metadata: GCE metadata %q not defined", string(suffix)) | ||||
| } | ||||
| 
 | ||||
| func (c *cachedValue) get(cl *Client) (v string, err error) { | ||||
| 	defer c.mu.Unlock() | ||||
| 	c.mu.Lock() | ||||
| 	if c.v != "" { | ||||
| 		return c.v, nil | ||||
| 	} | ||||
| 	if c.trim { | ||||
| 		v, err = cl.getTrimmed(c.k) | ||||
| 	} else { | ||||
| 		v, err = cl.Get(c.k) | ||||
| 	} | ||||
| 	if err == nil { | ||||
| 		c.v = v | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	onGCEOnce sync.Once | ||||
| 	onGCE     bool | ||||
| ) | ||||
| 
 | ||||
| // OnGCE reports whether this process is running on Google Compute Engine.
 | ||||
| func OnGCE() bool { | ||||
| 	onGCEOnce.Do(initOnGCE) | ||||
| 	return onGCE | ||||
| } | ||||
| 
 | ||||
| func initOnGCE() { | ||||
| 	onGCE = testOnGCE() | ||||
| } | ||||
| 
 | ||||
| func testOnGCE() bool { | ||||
| 	// The user explicitly said they're on GCE, so trust them.
 | ||||
| 	if os.Getenv(metadataHostEnv) != "" { | ||||
| 		return true | ||||
| 	} | ||||
| 
 | ||||
| 	ctx, cancel := context.WithCancel(context.Background()) | ||||
| 	defer cancel() | ||||
| 
 | ||||
| 	resc := make(chan bool, 2) | ||||
| 
 | ||||
| 	// Try two strategies in parallel.
 | ||||
| 	// See https://github.com/googleapis/google-cloud-go/issues/194
 | ||||
| 	go func() { | ||||
| 		req, _ := http.NewRequest("GET", "http://"+metadataIP, nil) | ||||
| 		req.Header.Set("User-Agent", userAgent) | ||||
| 		res, err := defaultClient.hc.Do(req.WithContext(ctx)) | ||||
| 		if err != nil { | ||||
| 			resc <- false | ||||
| 			return | ||||
| 		} | ||||
| 		defer res.Body.Close() | ||||
| 		resc <- res.Header.Get("Metadata-Flavor") == "Google" | ||||
| 	}() | ||||
| 
 | ||||
| 	go func() { | ||||
| 		addrs, err := net.DefaultResolver.LookupHost(ctx, "metadata.google.internal") | ||||
| 		if err != nil || len(addrs) == 0 { | ||||
| 			resc <- false | ||||
| 			return | ||||
| 		} | ||||
| 		resc <- strsContains(addrs, metadataIP) | ||||
| 	}() | ||||
| 
 | ||||
| 	tryHarder := systemInfoSuggestsGCE() | ||||
| 	if tryHarder { | ||||
| 		res := <-resc | ||||
| 		if res { | ||||
| 			// The first strategy succeeded, so let's use it.
 | ||||
| 			return true | ||||
| 		} | ||||
| 		// Wait for either the DNS or metadata server probe to
 | ||||
| 		// contradict the other one and say we are running on
 | ||||
| 		// GCE. Give it a lot of time to do so, since the system
 | ||||
| 		// info already suggests we're running on a GCE BIOS.
 | ||||
| 		timer := time.NewTimer(5 * time.Second) | ||||
| 		defer timer.Stop() | ||||
| 		select { | ||||
| 		case res = <-resc: | ||||
| 			return res | ||||
| 		case <-timer.C: | ||||
| 			// Too slow. Who knows what this system is.
 | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// There's no hint from the system info that we're running on
 | ||||
| 	// GCE, so use the first probe's result as truth, whether it's
 | ||||
| 	// true or false. The goal here is to optimize for speed for
 | ||||
| 	// users who are NOT running on GCE. We can't assume that
 | ||||
| 	// either a DNS lookup or an HTTP request to a blackholed IP
 | ||||
| 	// address is fast. Worst case this should return when the
 | ||||
| 	// metaClient's Transport.ResponseHeaderTimeout or
 | ||||
| 	// Transport.Dial.Timeout fires (in two seconds).
 | ||||
| 	return <-resc | ||||
| } | ||||
| 
 | ||||
| // systemInfoSuggestsGCE reports whether the local system (without
 | ||||
| // doing network requests) suggests that we're running on GCE. If this
 | ||||
| // returns true, testOnGCE tries a bit harder to reach its metadata
 | ||||
| // server.
 | ||||
| func systemInfoSuggestsGCE() bool { | ||||
| 	if runtime.GOOS != "linux" { | ||||
| 		// We don't have any non-Linux clues available, at least yet.
 | ||||
| 		return false | ||||
| 	} | ||||
| 	slurp, _ := ioutil.ReadFile("/sys/class/dmi/id/product_name") | ||||
| 	name := strings.TrimSpace(string(slurp)) | ||||
| 	return name == "Google" || name == "Google Compute Engine" | ||||
| } | ||||
| 
 | ||||
| // Subscribe calls Client.Subscribe on the default client.
 | ||||
| func Subscribe(suffix string, fn func(v string, ok bool) error) error { | ||||
| 	return defaultClient.Subscribe(suffix, fn) | ||||
| } | ||||
| 
 | ||||
| // Get calls Client.Get on the default client.
 | ||||
| func Get(suffix string) (string, error) { return defaultClient.Get(suffix) } | ||||
| 
 | ||||
| // ProjectID returns the current instance's project ID string.
 | ||||
| func ProjectID() (string, error) { return defaultClient.ProjectID() } | ||||
| 
 | ||||
| // NumericProjectID returns the current instance's numeric project ID.
 | ||||
| func NumericProjectID() (string, error) { return defaultClient.NumericProjectID() } | ||||
| 
 | ||||
| // InternalIP returns the instance's primary internal IP address.
 | ||||
| func InternalIP() (string, error) { return defaultClient.InternalIP() } | ||||
| 
 | ||||
| // ExternalIP returns the instance's primary external (public) IP address.
 | ||||
| func ExternalIP() (string, error) { return defaultClient.ExternalIP() } | ||||
| 
 | ||||
| // Email calls Client.Email on the default client.
 | ||||
| func Email(serviceAccount string) (string, error) { return defaultClient.Email(serviceAccount) } | ||||
| 
 | ||||
| // Hostname returns the instance's hostname. This will be of the form
 | ||||
| // "<instanceID>.c.<projID>.internal".
 | ||||
| func Hostname() (string, error) { return defaultClient.Hostname() } | ||||
| 
 | ||||
| // InstanceTags returns the list of user-defined instance tags,
 | ||||
| // assigned when initially creating a GCE instance.
 | ||||
| func InstanceTags() ([]string, error) { return defaultClient.InstanceTags() } | ||||
| 
 | ||||
| // InstanceID returns the current VM's numeric instance ID.
 | ||||
| func InstanceID() (string, error) { return defaultClient.InstanceID() } | ||||
| 
 | ||||
| // InstanceName returns the current VM's instance ID string.
 | ||||
| func InstanceName() (string, error) { return defaultClient.InstanceName() } | ||||
| 
 | ||||
| // Zone returns the current VM's zone, such as "us-central1-b".
 | ||||
| func Zone() (string, error) { return defaultClient.Zone() } | ||||
| 
 | ||||
| // InstanceAttributes calls Client.InstanceAttributes on the default client.
 | ||||
| func InstanceAttributes() ([]string, error) { return defaultClient.InstanceAttributes() } | ||||
| 
 | ||||
| // ProjectAttributes calls Client.ProjectAttributes on the default client.
 | ||||
| func ProjectAttributes() ([]string, error) { return defaultClient.ProjectAttributes() } | ||||
| 
 | ||||
| // InstanceAttributeValue calls Client.InstanceAttributeValue on the default client.
 | ||||
| func InstanceAttributeValue(attr string) (string, error) { | ||||
| 	return defaultClient.InstanceAttributeValue(attr) | ||||
| } | ||||
| 
 | ||||
| // ProjectAttributeValue calls Client.ProjectAttributeValue on the default client.
 | ||||
| func ProjectAttributeValue(attr string) (string, error) { | ||||
| 	return defaultClient.ProjectAttributeValue(attr) | ||||
| } | ||||
| 
 | ||||
| // Scopes calls Client.Scopes on the default client.
 | ||||
| func Scopes(serviceAccount string) ([]string, error) { return defaultClient.Scopes(serviceAccount) } | ||||
| 
 | ||||
| func strsContains(ss []string, s string) bool { | ||||
| 	for _, v := range ss { | ||||
| 		if v == s { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // A Client provides metadata.
 | ||||
| type Client struct { | ||||
| 	hc *http.Client | ||||
| } | ||||
| 
 | ||||
| // NewClient returns a Client that can be used to fetch metadata.
 | ||||
| // Returns the client that uses the specified http.Client for HTTP requests.
 | ||||
| // If nil is specified, returns the default client.
 | ||||
| func NewClient(c *http.Client) *Client { | ||||
| 	if c == nil { | ||||
| 		return defaultClient | ||||
| 	} | ||||
| 
 | ||||
| 	return &Client{hc: c} | ||||
| } | ||||
| 
 | ||||
| // getETag returns a value from the metadata service as well as the associated ETag.
 | ||||
| // This func is otherwise equivalent to Get.
 | ||||
| func (c *Client) getETag(suffix string) (value, etag string, err error) { | ||||
| 	// Using a fixed IP makes it very difficult to spoof the metadata service in
 | ||||
| 	// a container, which is an important use-case for local testing of cloud
 | ||||
| 	// deployments. To enable spoofing of the metadata service, the environment
 | ||||
| 	// variable GCE_METADATA_HOST is first inspected to decide where metadata
 | ||||
| 	// requests shall go.
 | ||||
| 	host := os.Getenv(metadataHostEnv) | ||||
| 	if host == "" { | ||||
| 		// Using 169.254.169.254 instead of "metadata" here because Go
 | ||||
| 		// binaries built with the "netgo" tag and without cgo won't
 | ||||
| 		// know the search suffix for "metadata" is
 | ||||
| 		// ".google.internal", and this IP address is documented as
 | ||||
| 		// being stable anyway.
 | ||||
| 		host = metadataIP | ||||
| 	} | ||||
| 	suffix = strings.TrimLeft(suffix, "/") | ||||
| 	u := "http://" + host + "/computeMetadata/v1/" + suffix | ||||
| 	req, err := http.NewRequest("GET", u, nil) | ||||
| 	if err != nil { | ||||
| 		return "", "", err | ||||
| 	} | ||||
| 	req.Header.Set("Metadata-Flavor", "Google") | ||||
| 	req.Header.Set("User-Agent", userAgent) | ||||
| 	res, err := c.hc.Do(req) | ||||
| 	if err != nil { | ||||
| 		return "", "", err | ||||
| 	} | ||||
| 	defer res.Body.Close() | ||||
| 	if res.StatusCode == http.StatusNotFound { | ||||
| 		return "", "", NotDefinedError(suffix) | ||||
| 	} | ||||
| 	all, err := ioutil.ReadAll(res.Body) | ||||
| 	if err != nil { | ||||
| 		return "", "", err | ||||
| 	} | ||||
| 	if res.StatusCode != 200 { | ||||
| 		return "", "", &Error{Code: res.StatusCode, Message: string(all)} | ||||
| 	} | ||||
| 	return string(all), res.Header.Get("Etag"), nil | ||||
| } | ||||
| 
 | ||||
| // Get returns a value from the metadata service.
 | ||||
| // The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/".
 | ||||
| //
 | ||||
| // If the GCE_METADATA_HOST environment variable is not defined, a default of
 | ||||
| // 169.254.169.254 will be used instead.
 | ||||
| //
 | ||||
| // If the requested metadata is not defined, the returned error will
 | ||||
| // be of type NotDefinedError.
 | ||||
| func (c *Client) Get(suffix string) (string, error) { | ||||
| 	val, _, err := c.getETag(suffix) | ||||
| 	return val, err | ||||
| } | ||||
| 
 | ||||
| func (c *Client) getTrimmed(suffix string) (s string, err error) { | ||||
| 	s, err = c.Get(suffix) | ||||
| 	s = strings.TrimSpace(s) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func (c *Client) lines(suffix string) ([]string, error) { | ||||
| 	j, err := c.Get(suffix) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	s := strings.Split(strings.TrimSpace(j), "\n") | ||||
| 	for i := range s { | ||||
| 		s[i] = strings.TrimSpace(s[i]) | ||||
| 	} | ||||
| 	return s, nil | ||||
| } | ||||
| 
 | ||||
| // ProjectID returns the current instance's project ID string.
 | ||||
| func (c *Client) ProjectID() (string, error) { return projID.get(c) } | ||||
| 
 | ||||
| // NumericProjectID returns the current instance's numeric project ID.
 | ||||
| func (c *Client) NumericProjectID() (string, error) { return projNum.get(c) } | ||||
| 
 | ||||
| // InstanceID returns the current VM's numeric instance ID.
 | ||||
| func (c *Client) InstanceID() (string, error) { return instID.get(c) } | ||||
| 
 | ||||
| // InternalIP returns the instance's primary internal IP address.
 | ||||
| func (c *Client) InternalIP() (string, error) { | ||||
| 	return c.getTrimmed("instance/network-interfaces/0/ip") | ||||
| } | ||||
| 
 | ||||
| // Email returns the email address associated with the service account.
 | ||||
| // The account may be empty or the string "default" to use the instance's
 | ||||
| // main account.
 | ||||
| func (c *Client) Email(serviceAccount string) (string, error) { | ||||
| 	if serviceAccount == "" { | ||||
| 		serviceAccount = "default" | ||||
| 	} | ||||
| 	return c.getTrimmed("instance/service-accounts/" + serviceAccount + "/email") | ||||
| } | ||||
| 
 | ||||
| // ExternalIP returns the instance's primary external (public) IP address.
 | ||||
| func (c *Client) ExternalIP() (string, error) { | ||||
| 	return c.getTrimmed("instance/network-interfaces/0/access-configs/0/external-ip") | ||||
| } | ||||
| 
 | ||||
| // Hostname returns the instance's hostname. This will be of the form
 | ||||
| // "<instanceID>.c.<projID>.internal".
 | ||||
| func (c *Client) Hostname() (string, error) { | ||||
| 	return c.getTrimmed("instance/hostname") | ||||
| } | ||||
| 
 | ||||
| // InstanceTags returns the list of user-defined instance tags,
 | ||||
| // assigned when initially creating a GCE instance.
 | ||||
| func (c *Client) InstanceTags() ([]string, error) { | ||||
| 	var s []string | ||||
| 	j, err := c.Get("instance/tags") | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := json.NewDecoder(strings.NewReader(j)).Decode(&s); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return s, nil | ||||
| } | ||||
| 
 | ||||
| // InstanceName returns the current VM's instance ID string.
 | ||||
| func (c *Client) InstanceName() (string, error) { | ||||
| 	return c.getTrimmed("instance/name") | ||||
| } | ||||
| 
 | ||||
| // Zone returns the current VM's zone, such as "us-central1-b".
 | ||||
| func (c *Client) Zone() (string, error) { | ||||
| 	zone, err := c.getTrimmed("instance/zone") | ||||
| 	// zone is of the form "projects/<projNum>/zones/<zoneName>".
 | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	return zone[strings.LastIndex(zone, "/")+1:], nil | ||||
| } | ||||
| 
 | ||||
| // InstanceAttributes returns the list of user-defined attributes,
 | ||||
| // assigned when initially creating a GCE VM instance. The value of an
 | ||||
| // attribute can be obtained with InstanceAttributeValue.
 | ||||
| func (c *Client) InstanceAttributes() ([]string, error) { return c.lines("instance/attributes/") } | ||||
| 
 | ||||
| // ProjectAttributes returns the list of user-defined attributes
 | ||||
| // applying to the project as a whole, not just this VM.  The value of
 | ||||
| // an attribute can be obtained with ProjectAttributeValue.
 | ||||
| func (c *Client) ProjectAttributes() ([]string, error) { return c.lines("project/attributes/") } | ||||
| 
 | ||||
| // InstanceAttributeValue returns the value of the provided VM
 | ||||
| // instance attribute.
 | ||||
| //
 | ||||
| // If the requested attribute is not defined, the returned error will
 | ||||
| // be of type NotDefinedError.
 | ||||
| //
 | ||||
| // InstanceAttributeValue may return ("", nil) if the attribute was
 | ||||
| // defined to be the empty string.
 | ||||
| func (c *Client) InstanceAttributeValue(attr string) (string, error) { | ||||
| 	return c.Get("instance/attributes/" + attr) | ||||
| } | ||||
| 
 | ||||
| // ProjectAttributeValue returns the value of the provided
 | ||||
| // project attribute.
 | ||||
| //
 | ||||
| // If the requested attribute is not defined, the returned error will
 | ||||
| // be of type NotDefinedError.
 | ||||
| //
 | ||||
| // ProjectAttributeValue may return ("", nil) if the attribute was
 | ||||
| // defined to be the empty string.
 | ||||
| func (c *Client) ProjectAttributeValue(attr string) (string, error) { | ||||
| 	return c.Get("project/attributes/" + attr) | ||||
| } | ||||
| 
 | ||||
| // Scopes returns the service account scopes for the given account.
 | ||||
| // The account may be empty or the string "default" to use the instance's
 | ||||
| // main account.
 | ||||
| func (c *Client) Scopes(serviceAccount string) ([]string, error) { | ||||
| 	if serviceAccount == "" { | ||||
| 		serviceAccount = "default" | ||||
| 	} | ||||
| 	return c.lines("instance/service-accounts/" + serviceAccount + "/scopes") | ||||
| } | ||||
| 
 | ||||
| // Subscribe subscribes to a value from the metadata service.
 | ||||
| // The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/".
 | ||||
| // The suffix may contain query parameters.
 | ||||
| //
 | ||||
| // Subscribe calls fn with the latest metadata value indicated by the provided
 | ||||
| // suffix. If the metadata value is deleted, fn is called with the empty string
 | ||||
| // and ok false. Subscribe blocks until fn returns a non-nil error or the value
 | ||||
| // is deleted. Subscribe returns the error value returned from the last call to
 | ||||
| // fn, which may be nil when ok == false.
 | ||||
| func (c *Client) Subscribe(suffix string, fn func(v string, ok bool) error) error { | ||||
| 	const failedSubscribeSleep = time.Second * 5 | ||||
| 
 | ||||
| 	// First check to see if the metadata value exists at all.
 | ||||
| 	val, lastETag, err := c.getETag(suffix) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if err := fn(val, true); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	ok := true | ||||
| 	if strings.ContainsRune(suffix, '?') { | ||||
| 		suffix += "&wait_for_change=true&last_etag=" | ||||
| 	} else { | ||||
| 		suffix += "?wait_for_change=true&last_etag=" | ||||
| 	} | ||||
| 	for { | ||||
| 		val, etag, err := c.getETag(suffix + url.QueryEscape(lastETag)) | ||||
| 		if err != nil { | ||||
| 			if _, deleted := err.(NotDefinedError); !deleted { | ||||
| 				time.Sleep(failedSubscribeSleep) | ||||
| 				continue // Retry on other errors.
 | ||||
| 			} | ||||
| 			ok = false | ||||
| 		} | ||||
| 		lastETag = etag | ||||
| 
 | ||||
| 		if err := fn(val, ok); err != nil || !ok { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Error contains an error response from the server.
 | ||||
| type Error struct { | ||||
| 	// Code is the HTTP response status code.
 | ||||
| 	Code int | ||||
| 	// Message is the server response message.
 | ||||
| 	Message string | ||||
| } | ||||
| 
 | ||||
| func (e *Error) Error() string { | ||||
| 	return fmt.Sprintf("compute: Received %d `%s`", e.Code, e.Message) | ||||
| } | ||||
							
								
								
									
										30
									
								
								vendor/code.gitea.io/gitea-vet/.changelog.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								vendor/code.gitea.io/gitea-vet/.changelog.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,30 +0,0 @@ | ||||
| # The full repository name | ||||
| repo: gitea/gitea-vet | ||||
| 
 | ||||
| # Service type (gitea or github) | ||||
| service: gitea | ||||
| 
 | ||||
| # Base URL for Gitea instance if using gitea service type (optional) | ||||
| base-url: https://gitea.com | ||||
| 
 | ||||
| # Changelog groups and which labeled PRs to add to each group | ||||
| groups: | ||||
|   - | ||||
|     name: BREAKING | ||||
|     labels: | ||||
|       - breaking | ||||
|   - | ||||
|     name: FEATURES | ||||
|     labels: | ||||
|       - feature | ||||
|   - | ||||
|     name: BUGFIXES | ||||
|     labels: | ||||
|       - bug | ||||
|   - | ||||
|     name: ENHANCEMENTS | ||||
|     labels: | ||||
|       - enhancement | ||||
| 
 | ||||
| # regex indicating which labels to skip for the changelog | ||||
| skip-labels: skip-changelog|backport\/.+ | ||||
							
								
								
									
										45
									
								
								vendor/code.gitea.io/gitea-vet/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								vendor/code.gitea.io/gitea-vet/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,45 +0,0 @@ | ||||
| --- | ||||
| kind: pipeline | ||||
| name: compliance | ||||
| 
 | ||||
| platform: | ||||
|   os: linux | ||||
|   arch: arm64 | ||||
| 
 | ||||
| trigger: | ||||
|   event: | ||||
|     - pull_request | ||||
| 
 | ||||
| steps: | ||||
|   - name: check | ||||
|     pull: always | ||||
|     image: golang:1.14 | ||||
|     environment: | ||||
|       GOPROXY: https://goproxy.cn | ||||
|     commands: | ||||
|       - make build | ||||
|       - make lint | ||||
|       - make vet | ||||
| 
 | ||||
| --- | ||||
| kind: pipeline | ||||
| name: build-master | ||||
| 
 | ||||
| platform: | ||||
|   os: linux | ||||
|   arch: amd64 | ||||
| 
 | ||||
| trigger: | ||||
|   branch: | ||||
|     - master | ||||
|   event: | ||||
|     - push | ||||
| 
 | ||||
| steps: | ||||
|   - name: build | ||||
|     pull: always | ||||
|     image: techknowlogick/xgo:latest | ||||
|     environment: | ||||
|       GOPROXY: https://goproxy.cn | ||||
|     commands: | ||||
|       - make build | ||||
							
								
								
									
										5
									
								
								vendor/code.gitea.io/gitea-vet/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/code.gitea.io/gitea-vet/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,5 +0,0 @@ | ||||
| # GoLand | ||||
| .idea/ | ||||
| 
 | ||||
| # Binaries | ||||
| /gitea-vet* | ||||
							
								
								
									
										23
									
								
								vendor/code.gitea.io/gitea-vet/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/code.gitea.io/gitea-vet/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,23 +0,0 @@ | ||||
| linters: | ||||
|   enable: | ||||
|     - deadcode | ||||
|     - dogsled | ||||
|     - dupl | ||||
|     - errcheck | ||||
|     - gocognit | ||||
|     - goconst | ||||
|     - gocritic | ||||
|     - gocyclo | ||||
|     - gofmt | ||||
|     - golint | ||||
|     - gosimple | ||||
|     - govet | ||||
|     - maligned | ||||
|     - misspell | ||||
|     - prealloc | ||||
|     - staticcheck | ||||
|     - structcheck | ||||
|     - typecheck | ||||
|     - unparam | ||||
|     - unused | ||||
|     - varcheck | ||||
							
								
								
									
										11
									
								
								vendor/code.gitea.io/gitea-vet/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/code.gitea.io/gitea-vet/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,11 +0,0 @@ | ||||
| ## [v0.2.1](https://gitea.com/gitea/gitea-vet/releases/tag/v0.2.1) - 2020-08-15 | ||||
| 
 | ||||
| * BUGFIXES | ||||
|   * Split migration check to Deps and Imports (#9) | ||||
| 
 | ||||
| ## [0.2.0](https://gitea.com/gitea/gitea-vet/pulls?q=&type=all&state=closed&milestone=1272) - 2020-07-20 | ||||
| 
 | ||||
| * FEATURES | ||||
|   * Add migrations check (#5) | ||||
| * BUGFIXES | ||||
|   * Correct Import Paths (#6) | ||||
							
								
								
									
										19
									
								
								vendor/code.gitea.io/gitea-vet/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/code.gitea.io/gitea-vet/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,19 +0,0 @@ | ||||
| Copyright (c) 2020 The Gitea 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/gitea-vet/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/code.gitea.io/gitea-vet/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,22 +0,0 @@ | ||||
| GO ?= go | ||||
| 
 | ||||
| .PHONY: build | ||||
| build: | ||||
| 	$(GO) build | ||||
| 
 | ||||
| .PHONY: fmt | ||||
| fmt: | ||||
| 	$(GO) fmt ./... | ||||
| 
 | ||||
| .PHONY: vet | ||||
| vet: build | ||||
| 	$(GO) vet ./... | ||||
| 	$(GO) vet -vettool=gitea-vet ./... | ||||
| 
 | ||||
| .PHONY: lint | ||||
| lint: | ||||
| 	@hash golangci-lint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
 | ||||
| 		export BINARY="golangci-lint"; \
 | ||||
| 		curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(shell $(GO) env GOPATH)/bin v1.24.0; \
 | ||||
| 	fi | ||||
| 	golangci-lint run --timeout 5m | ||||
							
								
								
									
										11
									
								
								vendor/code.gitea.io/gitea-vet/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/code.gitea.io/gitea-vet/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,11 +0,0 @@ | ||||
| # gitea-vet | ||||
| 
 | ||||
| [](https://drone.gitea.com/gitea/gitea-vet) | ||||
| 
 | ||||
| `go vet` tool for Gitea | ||||
| 
 | ||||
| | Analyzer   | Description                                                                 | | ||||
| |------------|-----------------------------------------------------------------------------| | ||||
| | Imports    | Checks for import sorting. stdlib->code.gitea.io->other                     | | ||||
| | License    | Checks file headers for some form of `Copyright...YYYY...Gitea/Gogs`        | | ||||
| | Migrations | Checks for black-listed packages in `code.gitea.io/gitea/models/migrations` | | ||||
							
								
								
									
										46
									
								
								vendor/code.gitea.io/gitea-vet/checks/imports.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/code.gitea.io/gitea-vet/checks/imports.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,46 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package checks | ||||
| 
 | ||||
| import ( | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"golang.org/x/tools/go/analysis" | ||||
| ) | ||||
| 
 | ||||
| var Imports = &analysis.Analyzer{ | ||||
| 	Name: "imports", | ||||
| 	Doc:  "check for import order", | ||||
| 	Run:  runImports, | ||||
| } | ||||
| 
 | ||||
| func runImports(pass *analysis.Pass) (interface{}, error) { | ||||
| 	for _, file := range pass.Files { | ||||
| 		level := 0 | ||||
| 		for _, im := range file.Imports { | ||||
| 			var lvl int | ||||
| 			val := im.Path.Value | ||||
| 			switch { | ||||
| 			case importHasPrefix(val, "code.gitea.io"): | ||||
| 				lvl = 2 | ||||
| 			case strings.Contains(val, "."): | ||||
| 				lvl = 3 | ||||
| 			default: | ||||
| 				lvl = 1 | ||||
| 			} | ||||
| 
 | ||||
| 			if lvl < level { | ||||
| 				pass.Reportf(file.Pos(), "Imports are sorted wrong") | ||||
| 				break | ||||
| 			} | ||||
| 			level = lvl | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, nil | ||||
| } | ||||
| 
 | ||||
| func importHasPrefix(s, p string) bool { | ||||
| 	return strings.HasPrefix(s, "\""+p) | ||||
| } | ||||
							
								
								
									
										73
									
								
								vendor/code.gitea.io/gitea-vet/checks/license.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										73
									
								
								vendor/code.gitea.io/gitea-vet/checks/license.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,73 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package checks | ||||
| 
 | ||||
| import ( | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"golang.org/x/tools/go/analysis" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	header     = regexp.MustCompile(`.*Copyright.*\d{4}.*(Gitea|Gogs)`) | ||||
| 	goGenerate = "//go:generate" | ||||
| 	buildTag   = "// +build" | ||||
| ) | ||||
| 
 | ||||
| var License = &analysis.Analyzer{ | ||||
| 	Name: "license", | ||||
| 	Doc:  "check for a copyright header", | ||||
| 	Run:  runLicense, | ||||
| } | ||||
| 
 | ||||
| func runLicense(pass *analysis.Pass) (interface{}, error) { | ||||
| 	for _, file := range pass.Files { | ||||
| 		if len(file.Comments) == 0 { | ||||
| 			pass.Reportf(file.Pos(), "Copyright not found") | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		if len(file.Comments[0].List) == 0 { | ||||
| 			pass.Reportf(file.Pos(), "Copyright not found or wrong") | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		commentGroup := 0 | ||||
| 		if strings.HasPrefix(file.Comments[0].List[0].Text, goGenerate) { | ||||
| 			if len(file.Comments[0].List) > 1 { | ||||
| 				pass.Reportf(file.Pos(), "Must be an empty line between the go:generate and the Copyright") | ||||
| 				continue | ||||
| 			} | ||||
| 			commentGroup++ | ||||
| 		} | ||||
| 
 | ||||
| 		if strings.HasPrefix(file.Comments[0].List[0].Text, buildTag) { | ||||
| 			commentGroup++ | ||||
| 		} | ||||
| 
 | ||||
| 		if len(file.Comments) < commentGroup+1 { | ||||
| 			pass.Reportf(file.Pos(), "Copyright not found") | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		if len(file.Comments[commentGroup].List) < 1 { | ||||
| 			pass.Reportf(file.Pos(), "Copyright not found or wrong") | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		var check bool | ||||
| 		for _, comment := range file.Comments[commentGroup].List { | ||||
| 			if header.MatchString(comment.Text) { | ||||
| 				check = true | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if !check { | ||||
| 			pass.Reportf(file.Pos(), "Copyright did not match check") | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, nil | ||||
| } | ||||
							
								
								
									
										77
									
								
								vendor/code.gitea.io/gitea-vet/checks/migrations.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										77
									
								
								vendor/code.gitea.io/gitea-vet/checks/migrations.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,77 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package checks | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"os/exec" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"golang.org/x/tools/go/analysis" | ||||
| ) | ||||
| 
 | ||||
| var Migrations = &analysis.Analyzer{ | ||||
| 	Name: "migrations", | ||||
| 	Doc:  "check migrations for black-listed packages.", | ||||
| 	Run:  checkMigrations, | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	migrationDepBlockList = []string{ | ||||
| 		"code.gitea.io/gitea/models", | ||||
| 	} | ||||
| 	migrationImpBlockList = []string{ | ||||
| 		"code.gitea.io/gitea/modules/structs", | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| func checkMigrations(pass *analysis.Pass) (interface{}, error) { | ||||
| 	if !strings.EqualFold(pass.Pkg.Path(), "code.gitea.io/gitea/models/migrations") { | ||||
| 		return nil, nil | ||||
| 	} | ||||
| 
 | ||||
| 	if _, err := exec.LookPath("go"); err != nil { | ||||
| 		return nil, errors.New("go was not found in the PATH") | ||||
| 	} | ||||
| 
 | ||||
| 	depsCmd := exec.Command("go", "list", "-f", `{{join .Deps "\n"}}`, "code.gitea.io/gitea/models/migrations") | ||||
| 	depsOut, err := depsCmd.Output() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	deps := strings.Split(string(depsOut), "\n") | ||||
| 	for _, dep := range deps { | ||||
| 		if stringInSlice(dep, migrationDepBlockList) { | ||||
| 			pass.Reportf(0, "code.gitea.io/gitea/models/migrations cannot depend on the following packages: %s", migrationDepBlockList) | ||||
| 			return nil, nil | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	impsCmd := exec.Command("go", "list", "-f", `{{join .Imports "\n"}}`, "code.gitea.io/gitea/models/migrations") | ||||
| 	impsOut, err := impsCmd.Output() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	imps := strings.Split(string(impsOut), "\n") | ||||
| 	for _, imp := range imps { | ||||
| 		if stringInSlice(imp, migrationImpBlockList) { | ||||
| 			pass.Reportf(0, "code.gitea.io/gitea/models/migrations cannot import the following packages: %s", migrationImpBlockList) | ||||
| 			return nil, nil | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return nil, nil | ||||
| } | ||||
| 
 | ||||
| func stringInSlice(needle string, haystack []string) bool { | ||||
| 	for _, h := range haystack { | ||||
| 		if strings.EqualFold(needle, h) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
							
								
								
									
										5
									
								
								vendor/code.gitea.io/gitea-vet/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/code.gitea.io/gitea-vet/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,5 +0,0 @@ | ||||
| module code.gitea.io/gitea-vet | ||||
| 
 | ||||
| go 1.14 | ||||
| 
 | ||||
| require golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224 | ||||
							
								
								
									
										20
									
								
								vendor/code.gitea.io/gitea-vet/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/code.gitea.io/gitea-vet/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,20 +0,0 @@ | ||||
| github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= | ||||
| golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224 h1:azwY/v0y0K4mFHVsg5+UrTgchqALYWpqVo6vL5OmkmI= | ||||
| golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
							
								
								
									
										19
									
								
								vendor/code.gitea.io/gitea-vet/main.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/code.gitea.io/gitea-vet/main.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,19 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"code.gitea.io/gitea-vet/checks" | ||||
| 
 | ||||
| 	"golang.org/x/tools/go/analysis/unitchecker" | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	unitchecker.Main( | ||||
| 		checks.Imports, | ||||
| 		checks.License, | ||||
| 		checks.Migrations, | ||||
| 	) | ||||
| } | ||||
							
								
								
									
										20
									
								
								vendor/code.gitea.io/sdk/gitea/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/code.gitea.io/sdk/gitea/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,20 +0,0 @@ | ||||
| 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. | ||||
							
								
								
									
										47
									
								
								vendor/code.gitea.io/sdk/gitea/admin_cron.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										47
									
								
								vendor/code.gitea.io/sdk/gitea/admin_cron.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,47 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // CronTask represents a Cron task
 | ||||
| type CronTask struct { | ||||
| 	Name      string    `json:"name"` | ||||
| 	Schedule  string    `json:"schedule"` | ||||
| 	Next      time.Time `json:"next"` | ||||
| 	Prev      time.Time `json:"prev"` | ||||
| 	ExecTimes int64     `json:"exec_times"` | ||||
| } | ||||
| 
 | ||||
| // ListCronTaskOptions list options for ListCronTasks
 | ||||
| type ListCronTaskOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListCronTasks list available cron tasks
 | ||||
| func (c *Client) ListCronTasks(opt ListCronTaskOptions) ([]*CronTask, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	ct := make([]*CronTask, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/admin/cron?%s", opt.getURLQuery().Encode()), jsonHeader, nil, &ct) | ||||
| 	return ct, resp, err | ||||
| } | ||||
| 
 | ||||
| // RunCronTasks run a cron task
 | ||||
| func (c *Client) RunCronTasks(task string) (*Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&task); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("POST", fmt.Sprintf("/admin/cron/%s", task), jsonHeader, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										39
									
								
								vendor/code.gitea.io/sdk/gitea/admin_org.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								vendor/code.gitea.io/sdk/gitea/admin_org.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,39 +0,0 @@ | ||||
| // 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" | ||||
| ) | ||||
| 
 | ||||
| // AdminListOrgsOptions options for listing admin's organizations
 | ||||
| type AdminListOrgsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // AdminListOrgs lists all orgs
 | ||||
| func (c *Client) AdminListOrgs(opt AdminListOrgsOptions) ([]*Organization, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	orgs := make([]*Organization, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/admin/orgs?%s", opt.getURLQuery().Encode()), nil, nil, &orgs) | ||||
| 	return orgs, resp, err | ||||
| } | ||||
| 
 | ||||
| // AdminCreateOrg create an organization
 | ||||
| func (c *Client) AdminCreateOrg(user string, opt CreateOrgOption) (*Organization, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	org := new(Organization) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/admin/users/%s/orgs", user), jsonHeader, bytes.NewReader(body), org) | ||||
| 	return org, resp, err | ||||
| } | ||||
							
								
								
									
										25
									
								
								vendor/code.gitea.io/sdk/gitea/admin_repo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/code.gitea.io/sdk/gitea/admin_repo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,25 +0,0 @@ | ||||
| // 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, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	repo := new(Repository) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/admin/users/%s/repos", user), jsonHeader, bytes.NewReader(body), repo) | ||||
| 	return repo, resp, err | ||||
| } | ||||
							
								
								
									
										130
									
								
								vendor/code.gitea.io/sdk/gitea/admin_user.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										130
									
								
								vendor/code.gitea.io/sdk/gitea/admin_user.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,130 +0,0 @@ | ||||
| // 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" | ||||
| ) | ||||
| 
 | ||||
| // AdminListUsersOptions options for listing admin users
 | ||||
| type AdminListUsersOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // AdminListUsers lists all users
 | ||||
| func (c *Client) AdminListUsers(opt AdminListUsersOptions) ([]*User, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	users := make([]*User, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/admin/users?%s", opt.getURLQuery().Encode()), nil, nil, &users) | ||||
| 	return users, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateUserOption create user options
 | ||||
| type CreateUserOption struct { | ||||
| 	SourceID           int64        `json:"source_id"` | ||||
| 	LoginName          string       `json:"login_name"` | ||||
| 	Username           string       `json:"username"` | ||||
| 	FullName           string       `json:"full_name"` | ||||
| 	Email              string       `json:"email"` | ||||
| 	Password           string       `json:"password"` | ||||
| 	MustChangePassword *bool        `json:"must_change_password"` | ||||
| 	SendNotify         bool         `json:"send_notify"` | ||||
| 	Visibility         *VisibleType `json:"visibility"` | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateUserOption struct
 | ||||
| func (opt CreateUserOption) Validate() error { | ||||
| 	if len(opt.Email) == 0 { | ||||
| 		return fmt.Errorf("email is empty") | ||||
| 	} | ||||
| 	if len(opt.Username) == 0 { | ||||
| 		return fmt.Errorf("username is empty") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // AdminCreateUser create a user
 | ||||
| func (c *Client) AdminCreateUser(opt CreateUserOption) (*User, *Response, error) { | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	user := new(User) | ||||
| 	resp, err := c.getParsedResponse("POST", "/admin/users", jsonHeader, bytes.NewReader(body), user) | ||||
| 	return user, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditUserOption edit user options
 | ||||
| type EditUserOption struct { | ||||
| 	SourceID                int64        `json:"source_id"` | ||||
| 	LoginName               string       `json:"login_name"` | ||||
| 	Email                   *string      `json:"email"` | ||||
| 	FullName                *string      `json:"full_name"` | ||||
| 	Password                string       `json:"password"` | ||||
| 	Description             *string      `json:"description"` | ||||
| 	MustChangePassword      *bool        `json:"must_change_password"` | ||||
| 	Website                 *string      `json:"website"` | ||||
| 	Location                *string      `json:"location"` | ||||
| 	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"` | ||||
| 	Restricted              *bool        `json:"restricted"` | ||||
| 	Visibility              *VisibleType `json:"visibility"` | ||||
| } | ||||
| 
 | ||||
| // AdminEditUser modify user informations
 | ||||
| func (c *Client) AdminEditUser(user string, opt EditUserOption) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PATCH", fmt.Sprintf("/admin/users/%s", user), jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // AdminDeleteUser delete one user according name
 | ||||
| func (c *Client) AdminDeleteUser(user string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/admin/users/%s", user), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // AdminCreateUserPublicKey adds a public key for the user
 | ||||
| func (c *Client) AdminCreateUserPublicKey(user string, opt CreateKeyOption) (*PublicKey, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	key := new(PublicKey) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/admin/users/%s/keys", user), jsonHeader, bytes.NewReader(body), key) | ||||
| 	return key, resp, err | ||||
| } | ||||
| 
 | ||||
| // AdminDeleteUserPublicKey deletes a user's public key
 | ||||
| func (c *Client) AdminDeleteUserPublicKey(user string, keyID int) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/admin/users/%s/keys/%d", user, keyID), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										111
									
								
								vendor/code.gitea.io/sdk/gitea/attachment.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										111
									
								
								vendor/code.gitea.io/sdk/gitea/attachment.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,111 +0,0 @@ | ||||
| // 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
 | ||||
| type Attachment struct { | ||||
| 	ID            int64     `json:"id"` | ||||
| 	Name          string    `json:"name"` | ||||
| 	Size          int64     `json:"size"` | ||||
| 	DownloadCount int64     `json:"download_count"` | ||||
| 	Created       time.Time `json:"created_at"` | ||||
| 	UUID          string    `json:"uuid"` | ||||
| 	DownloadURL   string    `json:"browser_download_url"` | ||||
| } | ||||
| 
 | ||||
| // ListReleaseAttachmentsOptions options for listing release's attachments
 | ||||
| type ListReleaseAttachmentsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListReleaseAttachments list release's attachments
 | ||||
| func (c *Client) ListReleaseAttachments(user, repo string, release int64, opt ListReleaseAttachmentsOptions) ([]*Attachment, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	attachments := make([]*Attachment, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/%d/assets?%s", user, repo, release, opt.getURLQuery().Encode()), | ||||
| 		nil, nil, &attachments) | ||||
| 	return attachments, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetReleaseAttachment returns the requested attachment
 | ||||
| func (c *Client) GetReleaseAttachment(user, repo string, release int64, id int64) (*Attachment, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	a := new(Attachment) | ||||
| 	resp, err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/%d/assets/%d", user, repo, release, id), | ||||
| 		nil, nil, &a) | ||||
| 	return a, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateReleaseAttachment creates an attachment for the given release
 | ||||
| func (c *Client) CreateReleaseAttachment(user, repo string, release int64, file io.Reader, filename string) (*Attachment, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	// Write file to body
 | ||||
| 	body := new(bytes.Buffer) | ||||
| 	writer := multipart.NewWriter(body) | ||||
| 	part, err := writer.CreateFormFile("attachment", filename) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	if _, err = io.Copy(part, file); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err = writer.Close(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	// Send request
 | ||||
| 	attachment := new(Attachment) | ||||
| 	resp, 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, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditAttachmentOptions options for editing attachments
 | ||||
| type EditAttachmentOptions struct { | ||||
| 	Name string `json:"name"` | ||||
| } | ||||
| 
 | ||||
| // EditReleaseAttachment updates the given attachment with the given options
 | ||||
| func (c *Client) EditReleaseAttachment(user, repo string, release int64, attachment int64, form EditAttachmentOptions) (*Attachment, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&form) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	attach := new(Attachment) | ||||
| 	resp, err := c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/releases/%d/assets/%d", user, repo, release, attachment), jsonHeader, bytes.NewReader(body), attach) | ||||
| 	return attach, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteReleaseAttachment deletes the given attachment including the uploaded file
 | ||||
| func (c *Client) DeleteReleaseAttachment(user, repo string, release int64, id int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/releases/%d/assets/%d", user, repo, release, id), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										347
									
								
								vendor/code.gitea.io/sdk/gitea/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										347
									
								
								vendor/code.gitea.io/sdk/gitea/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,347 +0,0 @@ | ||||
| // Copyright 2014 The Gogs Authors. All rights reserved.
 | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"github.com/hashicorp/go-version" | ||||
| ) | ||||
| 
 | ||||
| var jsonHeader = http.Header{"content-type": []string{"application/json"}} | ||||
| 
 | ||||
| // Version return the library version
 | ||||
| func Version() string { | ||||
| 	return "0.15.1" | ||||
| } | ||||
| 
 | ||||
| // Client represents a thread-safe Gitea API client.
 | ||||
| type Client struct { | ||||
| 	url         string | ||||
| 	accessToken string | ||||
| 	username    string | ||||
| 	password    string | ||||
| 	otp         string | ||||
| 	sudo        string | ||||
| 	debug       bool | ||||
| 	client      *http.Client | ||||
| 	ctx         context.Context | ||||
| 	mutex       sync.RWMutex | ||||
| 
 | ||||
| 	serverVersion  *version.Version | ||||
| 	getVersionOnce sync.Once | ||||
| 	ignoreVersion  bool // only set by SetGiteaVersion so don't need a mutex lock
 | ||||
| } | ||||
| 
 | ||||
| // Response represents the gitea response
 | ||||
| type Response struct { | ||||
| 	*http.Response | ||||
| } | ||||
| 
 | ||||
| // ClientOption are functions used to init a new client
 | ||||
| type ClientOption func(*Client) error | ||||
| 
 | ||||
| // NewClient initializes and returns a API client.
 | ||||
| // Usage of all gitea.Client methods is concurrency-safe.
 | ||||
| func NewClient(url string, options ...ClientOption) (*Client, error) { | ||||
| 	client := &Client{ | ||||
| 		url:    strings.TrimSuffix(url, "/"), | ||||
| 		client: &http.Client{}, | ||||
| 		ctx:    context.Background(), | ||||
| 	} | ||||
| 	for _, opt := range options { | ||||
| 		if err := opt(client); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
| 	if err := client.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return client, nil | ||||
| } | ||||
| 
 | ||||
| // NewClientWithHTTP creates an API client with a custom http client
 | ||||
| // Deprecated use SetHTTPClient option
 | ||||
| func NewClientWithHTTP(url string, httpClient *http.Client) *Client { | ||||
| 	client, _ := NewClient(url, SetHTTPClient(httpClient)) | ||||
| 	return client | ||||
| } | ||||
| 
 | ||||
| // SetHTTPClient is an option for NewClient to set custom http client
 | ||||
| func SetHTTPClient(httpClient *http.Client) ClientOption { | ||||
| 	return func(client *Client) error { | ||||
| 		client.SetHTTPClient(httpClient) | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // SetHTTPClient replaces default http.Client with user given one.
 | ||||
| func (c *Client) SetHTTPClient(client *http.Client) { | ||||
| 	c.mutex.Lock() | ||||
| 	c.client = client | ||||
| 	c.mutex.Unlock() | ||||
| } | ||||
| 
 | ||||
| // SetToken is an option for NewClient to set token
 | ||||
| func SetToken(token string) ClientOption { | ||||
| 	return func(client *Client) error { | ||||
| 		client.mutex.Lock() | ||||
| 		client.accessToken = token | ||||
| 		client.mutex.Unlock() | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // SetBasicAuth is an option for NewClient to set username and password
 | ||||
| func SetBasicAuth(username, password string) ClientOption { | ||||
| 	return func(client *Client) error { | ||||
| 		client.SetBasicAuth(username, password) | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // SetBasicAuth sets username and password
 | ||||
| func (c *Client) SetBasicAuth(username, password string) { | ||||
| 	c.mutex.Lock() | ||||
| 	c.username, c.password = username, password | ||||
| 	c.mutex.Unlock() | ||||
| } | ||||
| 
 | ||||
| // SetOTP is an option for NewClient to set OTP for 2FA
 | ||||
| func SetOTP(otp string) ClientOption { | ||||
| 	return func(client *Client) error { | ||||
| 		client.SetOTP(otp) | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // SetOTP sets OTP for 2FA
 | ||||
| func (c *Client) SetOTP(otp string) { | ||||
| 	c.mutex.Lock() | ||||
| 	c.otp = otp | ||||
| 	c.mutex.Unlock() | ||||
| } | ||||
| 
 | ||||
| // SetContext is an option for NewClient to set the default context
 | ||||
| func SetContext(ctx context.Context) ClientOption { | ||||
| 	return func(client *Client) error { | ||||
| 		client.SetContext(ctx) | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // SetContext set default context witch is used for http requests
 | ||||
| func (c *Client) SetContext(ctx context.Context) { | ||||
| 	c.mutex.Lock() | ||||
| 	c.ctx = ctx | ||||
| 	c.mutex.Unlock() | ||||
| } | ||||
| 
 | ||||
| // SetSudo is an option for NewClient to set sudo header
 | ||||
| func SetSudo(sudo string) ClientOption { | ||||
| 	return func(client *Client) error { | ||||
| 		client.SetSudo(sudo) | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // SetSudo sets username to impersonate.
 | ||||
| func (c *Client) SetSudo(sudo string) { | ||||
| 	c.mutex.Lock() | ||||
| 	c.sudo = sudo | ||||
| 	c.mutex.Unlock() | ||||
| } | ||||
| 
 | ||||
| // SetDebugMode is an option for NewClient to enable debug mode
 | ||||
| func SetDebugMode() ClientOption { | ||||
| 	return func(client *Client) error { | ||||
| 		client.mutex.Lock() | ||||
| 		client.debug = true | ||||
| 		client.mutex.Unlock() | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (c *Client) getWebResponse(method, path string, body io.Reader) ([]byte, *Response, error) { | ||||
| 	c.mutex.RLock() | ||||
| 	debug := c.debug | ||||
| 	if debug { | ||||
| 		fmt.Printf("%s: %s\nBody: %v\n", method, c.url+path, body) | ||||
| 	} | ||||
| 	req, err := http.NewRequestWithContext(c.ctx, method, c.url+path, body) | ||||
| 
 | ||||
| 	client := c.client // client ref can change from this point on so safe it
 | ||||
| 	c.mutex.RUnlock() | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	resp, err := client.Do(req) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	defer resp.Body.Close() | ||||
| 	data, err := ioutil.ReadAll(resp.Body) | ||||
| 	if debug { | ||||
| 		fmt.Printf("Response: %v\n\n", resp) | ||||
| 	} | ||||
| 	return data, &Response{resp}, nil | ||||
| } | ||||
| 
 | ||||
| func (c *Client) doRequest(method, path string, header http.Header, body io.Reader) (*Response, error) { | ||||
| 	c.mutex.RLock() | ||||
| 	debug := c.debug | ||||
| 	if debug { | ||||
| 		fmt.Printf("%s: %s\nHeader: %v\nBody: %s\n", method, c.url+"/api/v1"+path, header, body) | ||||
| 	} | ||||
| 	req, err := http.NewRequestWithContext(c.ctx, method, c.url+"/api/v1"+path, body) | ||||
| 	if err != nil { | ||||
| 		c.mutex.RUnlock() | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if len(c.accessToken) != 0 { | ||||
| 		req.Header.Set("Authorization", "token "+c.accessToken) | ||||
| 	} | ||||
| 	if len(c.otp) != 0 { | ||||
| 		req.Header.Set("X-GITEA-OTP", c.otp) | ||||
| 	} | ||||
| 	if len(c.username) != 0 { | ||||
| 		req.SetBasicAuth(c.username, c.password) | ||||
| 	} | ||||
| 	if len(c.sudo) != 0 { | ||||
| 		req.Header.Set("Sudo", c.sudo) | ||||
| 	} | ||||
| 
 | ||||
| 	client := c.client // client ref can change from this point on so safe it
 | ||||
| 	c.mutex.RUnlock() | ||||
| 
 | ||||
| 	for k, v := range header { | ||||
| 		req.Header[k] = v | ||||
| 	} | ||||
| 
 | ||||
| 	resp, err := client.Do(req) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if debug { | ||||
| 		fmt.Printf("Response: %v\n\n", resp) | ||||
| 	} | ||||
| 	return &Response{resp}, nil | ||||
| } | ||||
| 
 | ||||
| // Converts a response for a HTTP status code indicating an error condition
 | ||||
| // (non-2XX) to a well-known error value and response body. For non-problematic
 | ||||
| // (2XX) status codes nil will be returned. Note that on a non-2XX response, the
 | ||||
| // response body stream will have been read and, hence, is closed on return.
 | ||||
| func statusCodeToErr(resp *Response) (body []byte, err error) { | ||||
| 	// no error
 | ||||
| 	if resp.StatusCode/100 == 2 { | ||||
| 		return nil, nil | ||||
| 	} | ||||
| 
 | ||||
| 	//
 | ||||
| 	// error: body will be read for details
 | ||||
| 	//
 | ||||
| 	defer resp.Body.Close() | ||||
| 	data, err := ioutil.ReadAll(resp.Body) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("body read on HTTP error %d: %v", resp.StatusCode, err) | ||||
| 	} | ||||
| 
 | ||||
| 	switch resp.StatusCode { | ||||
| 	case 403: | ||||
| 		return data, errors.New("403 Forbidden") | ||||
| 	case 404: | ||||
| 		return data, errors.New("404 Not Found") | ||||
| 	case 409: | ||||
| 		return data, errors.New("409 Conflict") | ||||
| 	case 422: | ||||
| 		return data, fmt.Errorf("422 Unprocessable Entity: %s", string(data)) | ||||
| 	} | ||||
| 
 | ||||
| 	path := resp.Request.URL.Path | ||||
| 	method := resp.Request.Method | ||||
| 	header := resp.Request.Header | ||||
| 	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 data, fmt.Errorf("Unknown API Error: %d\nRequest: '%s' with '%s' method '%s' header and '%s' body", resp.StatusCode, path, method, header, string(data)) | ||||
| 	} | ||||
| 	return data, errors.New(errMap["message"].(string)) | ||||
| } | ||||
| 
 | ||||
| func (c *Client) getResponse(method, path string, header http.Header, body io.Reader) ([]byte, *Response, error) { | ||||
| 	resp, err := c.doRequest(method, path, header, body) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	defer resp.Body.Close() | ||||
| 
 | ||||
| 	// check for errors
 | ||||
| 	data, err := statusCodeToErr(resp) | ||||
| 	if err != nil { | ||||
| 		return data, resp, err | ||||
| 	} | ||||
| 
 | ||||
| 	// success (2XX), read body
 | ||||
| 	data, err = ioutil.ReadAll(resp.Body) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 
 | ||||
| 	return data, resp, nil | ||||
| } | ||||
| 
 | ||||
| func (c *Client) getParsedResponse(method, path string, header http.Header, body io.Reader, obj interface{}) (*Response, error) { | ||||
| 	data, resp, err := c.getResponse(method, path, header, body) | ||||
| 	if err != nil { | ||||
| 		return resp, err | ||||
| 	} | ||||
| 	return resp, json.Unmarshal(data, obj) | ||||
| } | ||||
| 
 | ||||
| func (c *Client) getStatusCode(method, path string, header http.Header, body io.Reader) (int, *Response, error) { | ||||
| 	resp, err := c.doRequest(method, path, header, body) | ||||
| 	if err != nil { | ||||
| 		return -1, resp, err | ||||
| 	} | ||||
| 	defer resp.Body.Close() | ||||
| 
 | ||||
| 	return resp.StatusCode, resp, nil | ||||
| } | ||||
| 
 | ||||
| // pathEscapeSegments escapes segments of a path while not escaping forward slash
 | ||||
| func pathEscapeSegments(path string) string { | ||||
| 	slice := strings.Split(path, "/") | ||||
| 	for index := range slice { | ||||
| 		slice[index] = url.PathEscape(slice[index]) | ||||
| 	} | ||||
| 	escapedPath := strings.Join(slice, "/") | ||||
| 	return escapedPath | ||||
| } | ||||
| 
 | ||||
| // escapeValidatePathSegments is a help function to validate and encode url path segments
 | ||||
| func escapeValidatePathSegments(seg ...*string) error { | ||||
| 	for i := range seg { | ||||
| 		if seg[i] == nil || len(*seg[i]) == 0 { | ||||
| 			return fmt.Errorf("path segment [%d] is empty", i) | ||||
| 		} | ||||
| 		*seg[i] = url.PathEscape(*seg[i]) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										5
									
								
								vendor/code.gitea.io/sdk/gitea/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/code.gitea.io/sdk/gitea/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,5 +0,0 @@ | ||||
| // 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"
 | ||||
							
								
								
									
										49
									
								
								vendor/code.gitea.io/sdk/gitea/fork.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										49
									
								
								vendor/code.gitea.io/sdk/gitea/fork.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,49 +0,0 @@ | ||||
| // 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" | ||||
| ) | ||||
| 
 | ||||
| // ListForksOptions options for listing repository's forks
 | ||||
| type ListForksOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListForks list a repository's forks
 | ||||
| func (c *Client) ListForks(user string, repo string, opt ListForksOptions) ([]*Repository, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	forks := make([]*Repository, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/forks?%s", user, repo, opt.getURLQuery().Encode()), | ||||
| 		nil, nil, &forks) | ||||
| 	return forks, resp, 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, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(form) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	fork := new(Repository) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/forks", user, repo), jsonHeader, bytes.NewReader(body), &fork) | ||||
| 	return fork, resp, err | ||||
| } | ||||
							
								
								
									
										28
									
								
								vendor/code.gitea.io/sdk/gitea/git_blob.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/code.gitea.io/sdk/gitea/git_blob.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,28 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| ) | ||||
| 
 | ||||
| // 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"` | ||||
| } | ||||
| 
 | ||||
| // GetBlob get the blob of a repository file
 | ||||
| func (c *Client) GetBlob(user, repo, sha string) (*GitBlobResponse, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &sha); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	blob := new(GitBlobResponse) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/git/blobs/%s", user, repo, sha), nil, nil, blob) | ||||
| 	return blob, resp, err | ||||
| } | ||||
							
								
								
									
										71
									
								
								vendor/code.gitea.io/sdk/gitea/git_hook.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										71
									
								
								vendor/code.gitea.io/sdk/gitea/git_hook.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,71 +0,0 @@ | ||||
| // 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"` | ||||
| } | ||||
| 
 | ||||
| // ListRepoGitHooksOptions options for listing repository's githooks
 | ||||
| type ListRepoGitHooksOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListRepoGitHooks list all the Git hooks of one repository
 | ||||
| func (c *Client) ListRepoGitHooks(user, repo string, opt ListRepoGitHooksOptions) ([]*GitHook, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	hooks := make([]*GitHook, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/hooks/git?%s", user, repo, opt.getURLQuery().Encode()), nil, nil, &hooks) | ||||
| 	return hooks, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetRepoGitHook get a Git hook of a repository
 | ||||
| func (c *Client) GetRepoGitHook(user, repo, id string) (*GitHook, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &id); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	h := new(GitHook) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/hooks/git/%s", user, repo, id), nil, nil, h) | ||||
| 	return h, resp, err | ||||
| } | ||||
| 
 | ||||
| // 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) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &id); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PATCH", fmt.Sprintf("/repos/%s/%s/hooks/git/%s", user, repo, id), jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteRepoGitHook delete one Git hook from a repository
 | ||||
| func (c *Client) DeleteRepoGitHook(user, repo, id string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &id); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/hooks/git/%s", user, repo, id), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										9
									
								
								vendor/code.gitea.io/sdk/gitea/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/code.gitea.io/sdk/gitea/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,9 +0,0 @@ | ||||
| module code.gitea.io/sdk/gitea | ||||
| 
 | ||||
| go 1.13 | ||||
| 
 | ||||
| require ( | ||||
| 	code.gitea.io/gitea-vet v0.2.1 // indirect | ||||
| 	github.com/hashicorp/go-version v1.2.1 | ||||
| 	github.com/stretchr/testify v1.4.0 | ||||
| ) | ||||
							
								
								
									
										33
									
								
								vendor/code.gitea.io/sdk/gitea/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/code.gitea.io/sdk/gitea/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,33 +0,0 @@ | ||||
| code.gitea.io/gitea-vet v0.2.1 h1:b30by7+3SkmiftK0RjuXqFvZg2q4p68uoPGuxhzBN0s= | ||||
| code.gitea.io/gitea-vet v0.2.1/go.mod h1:zcNbT/aJEmivCAhfmkHOlT645KNOf9W2KnkLgFjGGfE= | ||||
| github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= | ||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= | ||||
| github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= | ||||
| 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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= | ||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||
| github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224 h1:azwY/v0y0K4mFHVsg5+UrTgchqALYWpqVo6vL5OmkmI= | ||||
| golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= | ||||
| gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
							
								
								
									
										20
									
								
								vendor/code.gitea.io/sdk/gitea/helper.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/code.gitea.io/sdk/gitea/helper.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,20 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| // OptionalBool convert a bool to a bool reference
 | ||||
| func OptionalBool(v bool) *bool { | ||||
| 	return &v | ||||
| } | ||||
| 
 | ||||
| // OptionalString convert a string to a string reference
 | ||||
| func OptionalString(v string) *string { | ||||
| 	return &v | ||||
| } | ||||
| 
 | ||||
| // OptionalInt64 convert a int64 to a int64 reference
 | ||||
| func OptionalInt64(v int64) *int64 { | ||||
| 	return &v | ||||
| } | ||||
							
								
								
									
										194
									
								
								vendor/code.gitea.io/sdk/gitea/hook.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										194
									
								
								vendor/code.gitea.io/sdk/gitea/hook.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,194 +0,0 @@ | ||||
| // 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" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // 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"` | ||||
| 	Updated time.Time         `json:"updated_at"` | ||||
| 	Created time.Time         `json:"created_at"` | ||||
| } | ||||
| 
 | ||||
| // HookType represent all webhook types gitea currently offer
 | ||||
| type HookType string | ||||
| 
 | ||||
| const ( | ||||
| 	// HookTypeDingtalk webhook that dingtalk understand
 | ||||
| 	HookTypeDingtalk HookType = "dingtalk" | ||||
| 	// HookTypeDiscord webhook that discord understand
 | ||||
| 	HookTypeDiscord HookType = "discord" | ||||
| 	// HookTypeGitea webhook that gitea understand
 | ||||
| 	HookTypeGitea HookType = "gitea" | ||||
| 	// HookTypeGogs webhook that gogs understand
 | ||||
| 	HookTypeGogs HookType = "gogs" | ||||
| 	// HookTypeMsteams webhook that msteams understand
 | ||||
| 	HookTypeMsteams HookType = "msteams" | ||||
| 	// HookTypeSlack webhook that slack understand
 | ||||
| 	HookTypeSlack HookType = "slack" | ||||
| 	// HookTypeTelegram webhook that telegram understand
 | ||||
| 	HookTypeTelegram HookType = "telegram" | ||||
| 	// HookTypeFeishu webhook that feishu understand
 | ||||
| 	HookTypeFeishu HookType = "feishu" | ||||
| ) | ||||
| 
 | ||||
| // ListHooksOptions options for listing hooks
 | ||||
| type ListHooksOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListOrgHooks list all the hooks of one organization
 | ||||
| func (c *Client) ListOrgHooks(org string, opt ListHooksOptions) ([]*Hook, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	hooks := make([]*Hook, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/orgs/%s/hooks?%s", org, opt.getURLQuery().Encode()), nil, nil, &hooks) | ||||
| 	return hooks, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListRepoHooks list all the hooks of one repository
 | ||||
| func (c *Client) ListRepoHooks(user, repo string, opt ListHooksOptions) ([]*Hook, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	hooks := make([]*Hook, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/hooks?%s", user, repo, opt.getURLQuery().Encode()), nil, nil, &hooks) | ||||
| 	return hooks, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetOrgHook get a hook of an organization
 | ||||
| func (c *Client) GetOrgHook(org string, id int64) (*Hook, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	h := new(Hook) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/orgs/%s/hooks/%d", org, id), nil, nil, h) | ||||
| 	return h, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetRepoHook get a hook of a repository
 | ||||
| func (c *Client) GetRepoHook(user, repo string, id int64) (*Hook, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	h := new(Hook) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/hooks/%d", user, repo, id), nil, nil, h) | ||||
| 	return h, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateHookOption options when create a hook
 | ||||
| type CreateHookOption struct { | ||||
| 	Type         HookType          `json:"type"` | ||||
| 	Config       map[string]string `json:"config"` | ||||
| 	Events       []string          `json:"events"` | ||||
| 	BranchFilter string            `json:"branch_filter"` | ||||
| 	Active       bool              `json:"active"` | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateHookOption struct
 | ||||
| func (opt CreateHookOption) Validate() error { | ||||
| 	if len(opt.Type) == 0 { | ||||
| 		return fmt.Errorf("hook type needed") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateOrgHook create one hook for an organization, with options
 | ||||
| func (c *Client) CreateOrgHook(org string, opt CreateHookOption) (*Hook, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	h := new(Hook) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/orgs/%s/hooks", org), jsonHeader, bytes.NewReader(body), h) | ||||
| 	return h, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateRepoHook create one hook for a repository, with options
 | ||||
| func (c *Client) CreateRepoHook(user, repo string, opt CreateHookOption) (*Hook, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	h := new(Hook) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/hooks", user, repo), jsonHeader, bytes.NewReader(body), h) | ||||
| 	return h, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditHookOption options when modify one hook
 | ||||
| type EditHookOption struct { | ||||
| 	Config       map[string]string `json:"config"` | ||||
| 	Events       []string          `json:"events"` | ||||
| 	BranchFilter string            `json:"branch_filter"` | ||||
| 	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) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PATCH", fmt.Sprintf("/orgs/%s/hooks/%d", org, id), jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // EditRepoHook modify one hook of a repository, with hook id and options
 | ||||
| func (c *Client) EditRepoHook(user, repo string, id int64, opt EditHookOption) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PATCH", fmt.Sprintf("/repos/%s/%s/hooks/%d", user, repo, id), jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteOrgHook delete one hook from an organization, with hook id
 | ||||
| func (c *Client) DeleteOrgHook(org string, id int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/orgs/%s/hooks/%d", org, id), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteRepoHook delete one hook from a repository, with hook id
 | ||||
| func (c *Client) DeleteRepoHook(user, repo string, id int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/hooks/%d", user, repo, id), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										288
									
								
								vendor/code.gitea.io/sdk/gitea/issue.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										288
									
								
								vendor/code.gitea.io/sdk/gitea/issue.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,288 +0,0 @@ | ||||
| // Copyright 2016 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" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // PullRequestMeta PR info if an issue is a PR
 | ||||
| type PullRequestMeta struct { | ||||
| 	HasMerged bool       `json:"merged"` | ||||
| 	Merged    *time.Time `json:"merged_at"` | ||||
| } | ||||
| 
 | ||||
| // RepositoryMeta basic repository information
 | ||||
| type RepositoryMeta struct { | ||||
| 	ID       int64  `json:"id"` | ||||
| 	Name     string `json:"name"` | ||||
| 	Owner    string `json:"owner"` | ||||
| 	FullName string `json:"full_name"` | ||||
| } | ||||
| 
 | ||||
| // Issue represents an issue in a repository
 | ||||
| type Issue struct { | ||||
| 	ID               int64      `json:"id"` | ||||
| 	URL              string     `json:"url"` | ||||
| 	HTMLURL          string     `json:"html_url"` | ||||
| 	Index            int64      `json:"number"` | ||||
| 	Poster           *User      `json:"user"` | ||||
| 	OriginalAuthor   string     `json:"original_author"` | ||||
| 	OriginalAuthorID int64      `json:"original_author_id"` | ||||
| 	Title            string     `json:"title"` | ||||
| 	Body             string     `json:"body"` | ||||
| 	Ref              string     `json:"ref"` | ||||
| 	Labels           []*Label   `json:"labels"` | ||||
| 	Milestone        *Milestone `json:"milestone"` | ||||
| 	Assignees        []*User    `json:"assignees"` | ||||
| 	// Whether the issue is open or closed
 | ||||
| 	State       StateType        `json:"state"` | ||||
| 	IsLocked    bool             `json:"is_locked"` | ||||
| 	Comments    int              `json:"comments"` | ||||
| 	Created     time.Time        `json:"created_at"` | ||||
| 	Updated     time.Time        `json:"updated_at"` | ||||
| 	Closed      *time.Time       `json:"closed_at"` | ||||
| 	Deadline    *time.Time       `json:"due_date"` | ||||
| 	PullRequest *PullRequestMeta `json:"pull_request"` | ||||
| 	Repository  *RepositoryMeta  `json:"repository"` | ||||
| } | ||||
| 
 | ||||
| // ListIssueOption list issue options
 | ||||
| type ListIssueOption struct { | ||||
| 	ListOptions | ||||
| 	State      StateType | ||||
| 	Type       IssueType | ||||
| 	Labels     []string | ||||
| 	Milestones []string | ||||
| 	KeyWord    string | ||||
| 	Since      time.Time | ||||
| 	Before     time.Time | ||||
| 	// filter by created by username
 | ||||
| 	CreatedBy string | ||||
| 	// filter by assigned to username
 | ||||
| 	AssignedBy string | ||||
| 	// filter by username mentioned
 | ||||
| 	MentionedBy string | ||||
| } | ||||
| 
 | ||||
| // StateType issue state type
 | ||||
| type StateType string | ||||
| 
 | ||||
| const ( | ||||
| 	// StateOpen pr/issue is opend
 | ||||
| 	StateOpen StateType = "open" | ||||
| 	// StateClosed pr/issue is closed
 | ||||
| 	StateClosed StateType = "closed" | ||||
| 	// StateAll is all
 | ||||
| 	StateAll StateType = "all" | ||||
| ) | ||||
| 
 | ||||
| // IssueType is issue a pull or only an issue
 | ||||
| type IssueType string | ||||
| 
 | ||||
| const ( | ||||
| 	// IssueTypeAll pr and issue
 | ||||
| 	IssueTypeAll IssueType = "" | ||||
| 	// IssueTypeIssue only issues
 | ||||
| 	IssueTypeIssue IssueType = "issues" | ||||
| 	// IssueTypePull only pulls
 | ||||
| 	IssueTypePull IssueType = "pulls" | ||||
| ) | ||||
| 
 | ||||
| // QueryEncode turns options into querystring argument
 | ||||
| func (opt *ListIssueOption) QueryEncode() string { | ||||
| 	query := opt.getURLQuery() | ||||
| 
 | ||||
| 	if len(opt.State) > 0 { | ||||
| 		query.Add("state", string(opt.State)) | ||||
| 	} | ||||
| 
 | ||||
| 	if len(opt.Labels) > 0 { | ||||
| 		query.Add("labels", strings.Join(opt.Labels, ",")) | ||||
| 	} | ||||
| 
 | ||||
| 	if len(opt.KeyWord) > 0 { | ||||
| 		query.Add("q", opt.KeyWord) | ||||
| 	} | ||||
| 
 | ||||
| 	query.Add("type", string(opt.Type)) | ||||
| 
 | ||||
| 	if len(opt.Milestones) > 0 { | ||||
| 		query.Add("milestones", strings.Join(opt.Milestones, ",")) | ||||
| 	} | ||||
| 
 | ||||
| 	if !opt.Since.IsZero() { | ||||
| 		query.Add("since", opt.Since.Format(time.RFC3339)) | ||||
| 	} | ||||
| 	if !opt.Before.IsZero() { | ||||
| 		query.Add("before", opt.Before.Format(time.RFC3339)) | ||||
| 	} | ||||
| 
 | ||||
| 	if len(opt.CreatedBy) > 0 { | ||||
| 		query.Add("created_by", opt.CreatedBy) | ||||
| 	} | ||||
| 	if len(opt.AssignedBy) > 0 { | ||||
| 		query.Add("assigned_by", opt.AssignedBy) | ||||
| 	} | ||||
| 	if len(opt.MentionedBy) > 0 { | ||||
| 		query.Add("mentioned_by", opt.MentionedBy) | ||||
| 	} | ||||
| 
 | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| // ListIssues returns all issues assigned the authenticated user
 | ||||
| func (c *Client) ListIssues(opt ListIssueOption) ([]*Issue, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	issues := make([]*Issue, 0, opt.PageSize) | ||||
| 
 | ||||
| 	link, _ := url.Parse("/repos/issues/search") | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, &issues) | ||||
| 	if e := c.checkServerVersionGreaterThanOrEqual(version1_12_0); e != nil { | ||||
| 		for i := 0; i < len(issues); i++ { | ||||
| 			if issues[i].Repository != nil { | ||||
| 				issues[i].Repository.Owner = strings.Split(issues[i].Repository.FullName, "/")[0] | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	for i := range issues { | ||||
| 		c.issueBackwardsCompatibility(issues[i]) | ||||
| 	} | ||||
| 	return issues, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListRepoIssues returns all issues for a given repository
 | ||||
| func (c *Client) ListRepoIssues(owner, repo string, opt ListIssueOption) ([]*Issue, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	issues := make([]*Issue, 0, opt.PageSize) | ||||
| 
 | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/issues", owner, repo)) | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, &issues) | ||||
| 	if e := c.checkServerVersionGreaterThanOrEqual(version1_12_0); e != nil { | ||||
| 		for i := 0; i < len(issues); i++ { | ||||
| 			if issues[i].Repository != nil { | ||||
| 				issues[i].Repository.Owner = strings.Split(issues[i].Repository.FullName, "/")[0] | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	for i := range issues { | ||||
| 		c.issueBackwardsCompatibility(issues[i]) | ||||
| 	} | ||||
| 	return issues, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetIssue returns a single issue for a given repository
 | ||||
| func (c *Client) GetIssue(owner, repo string, index int64) (*Issue, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	issue := new(Issue) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/%d", owner, repo, index), nil, nil, issue) | ||||
| 	if e := c.checkServerVersionGreaterThanOrEqual(version1_12_0); e != nil && issue.Repository != nil { | ||||
| 		issue.Repository.Owner = strings.Split(issue.Repository.FullName, "/")[0] | ||||
| 	} | ||||
| 	c.issueBackwardsCompatibility(issue) | ||||
| 	return issue, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateIssueOption options to create one issue
 | ||||
| type CreateIssueOption struct { | ||||
| 	Title     string     `json:"title"` | ||||
| 	Body      string     `json:"body"` | ||||
| 	Ref       string     `json:"ref"` | ||||
| 	Assignees []string   `json:"assignees"` | ||||
| 	Deadline  *time.Time `json:"due_date"` | ||||
| 	// milestone id
 | ||||
| 	Milestone int64 `json:"milestone"` | ||||
| 	// list of label ids
 | ||||
| 	Labels []int64 `json:"labels"` | ||||
| 	Closed bool    `json:"closed"` | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateIssueOption struct
 | ||||
| func (opt CreateIssueOption) Validate() error { | ||||
| 	if len(strings.TrimSpace(opt.Title)) == 0 { | ||||
| 		return fmt.Errorf("title is empty") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateIssue create a new issue for a given repository
 | ||||
| func (c *Client) CreateIssue(owner, repo string, opt CreateIssueOption) (*Issue, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	issue := new(Issue) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/issues", owner, repo), | ||||
| 		jsonHeader, bytes.NewReader(body), issue) | ||||
| 	c.issueBackwardsCompatibility(issue) | ||||
| 	return issue, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditIssueOption options for editing an issue
 | ||||
| type EditIssueOption struct { | ||||
| 	Title          string     `json:"title"` | ||||
| 	Body           *string    `json:"body"` | ||||
| 	Ref            *string    `json:"ref"` | ||||
| 	Assignees      []string   `json:"assignees"` | ||||
| 	Milestone      *int64     `json:"milestone"` | ||||
| 	State          *StateType `json:"state"` | ||||
| 	Deadline       *time.Time `json:"due_date"` | ||||
| 	RemoveDeadline *bool      `json:"unset_due_date"` | ||||
| } | ||||
| 
 | ||||
| // Validate the EditIssueOption struct
 | ||||
| func (opt EditIssueOption) Validate() error { | ||||
| 	if len(opt.Title) != 0 && len(strings.TrimSpace(opt.Title)) == 0 { | ||||
| 		return fmt.Errorf("title is empty") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // EditIssue modify an existing issue for a given repository
 | ||||
| func (c *Client) EditIssue(owner, repo string, index int64, opt EditIssueOption) (*Issue, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	issue := new(Issue) | ||||
| 	resp, err := c.getParsedResponse("PATCH", | ||||
| 		fmt.Sprintf("/repos/%s/%s/issues/%d", owner, repo, index), | ||||
| 		jsonHeader, bytes.NewReader(body), issue) | ||||
| 	c.issueBackwardsCompatibility(issue) | ||||
| 	return issue, resp, err | ||||
| } | ||||
| 
 | ||||
| func (c *Client) issueBackwardsCompatibility(issue *Issue) { | ||||
| 	if c.checkServerVersionGreaterThanOrEqual(version1_12_0) != nil { | ||||
| 		c.mutex.RLock() | ||||
| 		issue.HTMLURL = fmt.Sprintf("%s/%s/issues/%d", c.url, issue.Repository.FullName, issue.Index) | ||||
| 		c.mutex.RUnlock() | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										154
									
								
								vendor/code.gitea.io/sdk/gitea/issue_comment.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										154
									
								
								vendor/code.gitea.io/sdk/gitea/issue_comment.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,154 +0,0 @@ | ||||
| // 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" | ||||
| 	"net/url" | ||||
| 	"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"` | ||||
| 	OriginalAuthor   string    `json:"original_author"` | ||||
| 	OriginalAuthorID int64     `json:"original_author_id"` | ||||
| 	Body             string    `json:"body"` | ||||
| 	Created          time.Time `json:"created_at"` | ||||
| 	Updated          time.Time `json:"updated_at"` | ||||
| } | ||||
| 
 | ||||
| // ListIssueCommentOptions list comment options
 | ||||
| type ListIssueCommentOptions struct { | ||||
| 	ListOptions | ||||
| 	Since  time.Time | ||||
| 	Before time.Time | ||||
| } | ||||
| 
 | ||||
| // QueryEncode turns options into querystring argument
 | ||||
| func (opt *ListIssueCommentOptions) QueryEncode() string { | ||||
| 	query := opt.getURLQuery() | ||||
| 	if !opt.Since.IsZero() { | ||||
| 		query.Add("since", opt.Since.Format(time.RFC3339)) | ||||
| 	} | ||||
| 	if !opt.Before.IsZero() { | ||||
| 		query.Add("before", opt.Before.Format(time.RFC3339)) | ||||
| 	} | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| // ListIssueComments list comments on an issue.
 | ||||
| func (c *Client) ListIssueComments(owner, repo string, index int64, opt ListIssueCommentOptions) ([]*Comment, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/issues/%d/comments", owner, repo, index)) | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	comments := make([]*Comment, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), nil, nil, &comments) | ||||
| 	return comments, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListRepoIssueComments list comments for a given repo.
 | ||||
| func (c *Client) ListRepoIssueComments(owner, repo string, opt ListIssueCommentOptions) ([]*Comment, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/issues/comments", owner, repo)) | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	comments := make([]*Comment, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), nil, nil, &comments) | ||||
| 	return comments, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetIssueComment get a comment for a given repo by id.
 | ||||
| func (c *Client) GetIssueComment(owner, repo string, id int64) (*Comment, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	comment := new(Comment) | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return comment, nil, err | ||||
| 	} | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/comments/%d", owner, repo, id), nil, nil, &comment) | ||||
| 	return comment, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateIssueCommentOption options for creating a comment on an issue
 | ||||
| type CreateIssueCommentOption struct { | ||||
| 	Body string `json:"body"` | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateIssueCommentOption struct
 | ||||
| func (opt CreateIssueCommentOption) Validate() error { | ||||
| 	if len(opt.Body) == 0 { | ||||
| 		return fmt.Errorf("body is empty") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateIssueComment create comment on an issue.
 | ||||
| func (c *Client) CreateIssueComment(owner, repo string, index int64, opt CreateIssueCommentOption) (*Comment, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	comment := new(Comment) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/issues/%d/comments", owner, repo, index), jsonHeader, bytes.NewReader(body), comment) | ||||
| 	return comment, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditIssueCommentOption options for editing a comment
 | ||||
| type EditIssueCommentOption struct { | ||||
| 	Body string `json:"body"` | ||||
| } | ||||
| 
 | ||||
| // Validate the EditIssueCommentOption struct
 | ||||
| func (opt EditIssueCommentOption) Validate() error { | ||||
| 	if len(opt.Body) == 0 { | ||||
| 		return fmt.Errorf("body is empty") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // EditIssueComment edits an issue comment.
 | ||||
| func (c *Client) EditIssueComment(owner, repo string, commentID int64, opt EditIssueCommentOption) (*Comment, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	comment := new(Comment) | ||||
| 	resp, err := c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/issues/comments/%d", owner, repo, commentID), jsonHeader, bytes.NewReader(body), comment) | ||||
| 	return comment, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteIssueComment deletes an issue comment.
 | ||||
| func (c *Client) DeleteIssueComment(owner, repo string, commentID int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/comments/%d", owner, repo, commentID), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										211
									
								
								vendor/code.gitea.io/sdk/gitea/issue_label.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										211
									
								
								vendor/code.gitea.io/sdk/gitea/issue_label.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,211 +0,0 @@ | ||||
| // 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" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // Label a label to an issue or a pr
 | ||||
| type Label struct { | ||||
| 	ID   int64  `json:"id"` | ||||
| 	Name string `json:"name"` | ||||
| 	// example: 00aabb
 | ||||
| 	Color       string `json:"color"` | ||||
| 	Description string `json:"description"` | ||||
| 	URL         string `json:"url"` | ||||
| } | ||||
| 
 | ||||
| // ListLabelsOptions options for listing repository's labels
 | ||||
| type ListLabelsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListRepoLabels list labels of one repository
 | ||||
| func (c *Client) ListRepoLabels(owner, repo string, opt ListLabelsOptions) ([]*Label, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	labels := make([]*Label, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/labels?%s", owner, repo, opt.getURLQuery().Encode()), nil, nil, &labels) | ||||
| 	return labels, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetRepoLabel get one label of repository by repo it
 | ||||
| func (c *Client) GetRepoLabel(owner, repo string, id int64) (*Label, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	label := new(Label) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/labels/%d", owner, repo, id), nil, nil, label) | ||||
| 	return label, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateLabelOption options for creating a label
 | ||||
| type CreateLabelOption struct { | ||||
| 	Name string `json:"name"` | ||||
| 	// example: #00aabb
 | ||||
| 	Color       string `json:"color"` | ||||
| 	Description string `json:"description"` | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateLabelOption struct
 | ||||
| func (opt CreateLabelOption) Validate() error { | ||||
| 	aw, err := regexp.MatchString("^#?[0-9,a-f,A-F]{6}$", opt.Color) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if !aw { | ||||
| 		return fmt.Errorf("invalid color format") | ||||
| 	} | ||||
| 	if len(strings.TrimSpace(opt.Name)) == 0 { | ||||
| 		return fmt.Errorf("empty name not allowed") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateLabel create one label of repository
 | ||||
| func (c *Client) CreateLabel(owner, repo string, opt CreateLabelOption) (*Label, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if len(opt.Color) == 6 { | ||||
| 		if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 			opt.Color = "#" + opt.Color | ||||
| 		} | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	label := new(Label) | ||||
| 	resp, err := c.getParsedResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/labels", owner, repo), | ||||
| 		jsonHeader, bytes.NewReader(body), label) | ||||
| 	return label, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditLabelOption options for editing a label
 | ||||
| type EditLabelOption struct { | ||||
| 	Name        *string `json:"name"` | ||||
| 	Color       *string `json:"color"` | ||||
| 	Description *string `json:"description"` | ||||
| } | ||||
| 
 | ||||
| // Validate the EditLabelOption struct
 | ||||
| func (opt EditLabelOption) Validate() error { | ||||
| 	if opt.Color != nil { | ||||
| 		aw, err := regexp.MatchString("^#?[0-9,a-f,A-F]{6}$", *opt.Color) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if !aw { | ||||
| 			return fmt.Errorf("invalid color format") | ||||
| 		} | ||||
| 	} | ||||
| 	if opt.Name != nil { | ||||
| 		if len(strings.TrimSpace(*opt.Name)) == 0 { | ||||
| 			return fmt.Errorf("empty name not allowed") | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // EditLabel modify one label with options
 | ||||
| func (c *Client) EditLabel(owner, repo string, id int64, opt EditLabelOption) (*Label, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	label := new(Label) | ||||
| 	resp, err := c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/labels/%d", owner, repo, id), jsonHeader, bytes.NewReader(body), label) | ||||
| 	return label, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteLabel delete one label of repository by id
 | ||||
| func (c *Client) DeleteLabel(owner, repo string, id int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/labels/%d", owner, repo, id), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // GetIssueLabels get labels of one issue via issue id
 | ||||
| func (c *Client) GetIssueLabels(owner, repo string, index int64, opts ListLabelsOptions) ([]*Label, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	labels := make([]*Label, 0, 5) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/%d/labels?%s", owner, repo, index, opts.getURLQuery().Encode()), nil, nil, &labels) | ||||
| 	return labels, resp, err | ||||
| } | ||||
| 
 | ||||
| // IssueLabelsOption a collection of labels
 | ||||
| type IssueLabelsOption struct { | ||||
| 	// list of label IDs
 | ||||
| 	Labels []int64 `json:"labels"` | ||||
| } | ||||
| 
 | ||||
| // AddIssueLabels add one or more labels to one issue
 | ||||
| func (c *Client) AddIssueLabels(owner, repo string, index int64, opt IssueLabelsOption) ([]*Label, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	var labels []*Label | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/issues/%d/labels", owner, repo, index), jsonHeader, bytes.NewReader(body), &labels) | ||||
| 	return labels, resp, err | ||||
| } | ||||
| 
 | ||||
| // ReplaceIssueLabels replace old labels of issue with new labels
 | ||||
| func (c *Client) ReplaceIssueLabels(owner, repo string, index int64, opt IssueLabelsOption) ([]*Label, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	var labels []*Label | ||||
| 	resp, err := c.getParsedResponse("PUT", fmt.Sprintf("/repos/%s/%s/issues/%d/labels", owner, repo, index), jsonHeader, bytes.NewReader(body), &labels) | ||||
| 	return labels, resp, err | ||||
| } | ||||
| 
 | ||||
| // 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) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/labels/%d", owner, repo, index, label), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // ClearIssueLabels delete all the labels of one issue.
 | ||||
| func (c *Client) ClearIssueLabels(owner, repo string, index int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/labels", owner, repo, index), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										237
									
								
								vendor/code.gitea.io/sdk/gitea/issue_milestone.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										237
									
								
								vendor/code.gitea.io/sdk/gitea/issue_milestone.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,237 +0,0 @@ | ||||
| // 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" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| 	"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"` | ||||
| 	Created      time.Time  `json:"created_at"` | ||||
| 	Updated      *time.Time `json:"updated_at"` | ||||
| 	Closed       *time.Time `json:"closed_at"` | ||||
| 	Deadline     *time.Time `json:"due_on"` | ||||
| } | ||||
| 
 | ||||
| // ListMilestoneOption list milestone options
 | ||||
| type ListMilestoneOption struct { | ||||
| 	ListOptions | ||||
| 	// open, closed, all
 | ||||
| 	State StateType | ||||
| 	Name  string | ||||
| } | ||||
| 
 | ||||
| // QueryEncode turns options into querystring argument
 | ||||
| func (opt *ListMilestoneOption) QueryEncode() string { | ||||
| 	query := opt.getURLQuery() | ||||
| 	if opt.State != "" { | ||||
| 		query.Add("state", string(opt.State)) | ||||
| 	} | ||||
| 	if len(opt.Name) != 0 { | ||||
| 		query.Add("name", opt.Name) | ||||
| 	} | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| // ListRepoMilestones list all the milestones of one repository
 | ||||
| func (c *Client) ListRepoMilestones(owner, repo string, opt ListMilestoneOption) ([]*Milestone, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	milestones := make([]*Milestone, 0, opt.PageSize) | ||||
| 
 | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/milestones", owner, repo)) | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), nil, nil, &milestones) | ||||
| 	return milestones, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetMilestone get one milestone by repo name and milestone id
 | ||||
| func (c *Client) GetMilestone(owner, repo string, id int64) (*Milestone, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	milestone := new(Milestone) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/milestones/%d", owner, repo, id), nil, nil, milestone) | ||||
| 	return milestone, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetMilestoneByName get one milestone by repo and milestone name
 | ||||
| func (c *Client) GetMilestoneByName(owner, repo string, name string) (*Milestone, *Response, error) { | ||||
| 	if c.checkServerVersionGreaterThanOrEqual(version1_13_0) != nil { | ||||
| 		// backwards compatibility mode
 | ||||
| 		m, resp, err := c.resolveMilestoneByName(owner, repo, name) | ||||
| 		return m, resp, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &name); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	milestone := new(Milestone) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/milestones/%s", owner, repo, name), nil, nil, milestone) | ||||
| 	return milestone, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateMilestoneOption options for creating a milestone
 | ||||
| type CreateMilestoneOption struct { | ||||
| 	Title       string     `json:"title"` | ||||
| 	Description string     `json:"description"` | ||||
| 	State       StateType  `json:"state"` | ||||
| 	Deadline    *time.Time `json:"due_on"` | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateMilestoneOption struct
 | ||||
| func (opt CreateMilestoneOption) Validate() error { | ||||
| 	if len(strings.TrimSpace(opt.Title)) == 0 { | ||||
| 		return fmt.Errorf("title is empty") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateMilestone create one milestone with options
 | ||||
| func (c *Client) CreateMilestone(owner, repo string, opt CreateMilestoneOption) (*Milestone, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	milestone := new(Milestone) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/milestones", owner, repo), jsonHeader, bytes.NewReader(body), milestone) | ||||
| 
 | ||||
| 	// make creating closed milestones need gitea >= v1.13.0
 | ||||
| 	// this make it backwards compatible
 | ||||
| 	if err == nil && opt.State == StateClosed && milestone.State != StateClosed { | ||||
| 		closed := StateClosed | ||||
| 		return c.EditMilestone(owner, repo, milestone.ID, EditMilestoneOption{ | ||||
| 			State: &closed, | ||||
| 		}) | ||||
| 	} | ||||
| 
 | ||||
| 	return milestone, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditMilestoneOption options for editing a milestone
 | ||||
| type EditMilestoneOption struct { | ||||
| 	Title       string     `json:"title"` | ||||
| 	Description *string    `json:"description"` | ||||
| 	State       *StateType `json:"state"` | ||||
| 	Deadline    *time.Time `json:"due_on"` | ||||
| } | ||||
| 
 | ||||
| // Validate the EditMilestoneOption struct
 | ||||
| func (opt EditMilestoneOption) Validate() error { | ||||
| 	if len(opt.Title) != 0 && len(strings.TrimSpace(opt.Title)) == 0 { | ||||
| 		return fmt.Errorf("title is empty") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // EditMilestone modify milestone with options
 | ||||
| func (c *Client) EditMilestone(owner, repo string, id int64, opt EditMilestoneOption) (*Milestone, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	milestone := new(Milestone) | ||||
| 	resp, err := c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/milestones/%d", owner, repo, id), jsonHeader, bytes.NewReader(body), milestone) | ||||
| 	return milestone, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditMilestoneByName modify milestone with options
 | ||||
| func (c *Client) EditMilestoneByName(owner, repo string, name string, opt EditMilestoneOption) (*Milestone, *Response, error) { | ||||
| 	if c.checkServerVersionGreaterThanOrEqual(version1_13_0) != nil { | ||||
| 		// backwards compatibility mode
 | ||||
| 		m, _, err := c.resolveMilestoneByName(owner, repo, name) | ||||
| 		if err != nil { | ||||
| 			return nil, nil, err | ||||
| 		} | ||||
| 		return c.EditMilestone(owner, repo, m.ID, opt) | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &name); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	milestone := new(Milestone) | ||||
| 	resp, err := c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/milestones/%s", owner, repo, name), jsonHeader, bytes.NewReader(body), milestone) | ||||
| 	return milestone, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteMilestone delete one milestone by id
 | ||||
| func (c *Client) DeleteMilestone(owner, repo string, id int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/milestones/%d", owner, repo, id), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteMilestoneByName delete one milestone by name
 | ||||
| func (c *Client) DeleteMilestoneByName(owner, repo string, name string) (*Response, error) { | ||||
| 	if c.checkServerVersionGreaterThanOrEqual(version1_13_0) != nil { | ||||
| 		// backwards compatibility mode
 | ||||
| 		m, _, err := c.resolveMilestoneByName(owner, repo, name) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		return c.DeleteMilestone(owner, repo, m.ID) | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &name); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/milestones/%s", owner, repo, name), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // resolveMilestoneByName is a fallback method to find milestone id by name
 | ||||
| func (c *Client) resolveMilestoneByName(owner, repo, name string) (*Milestone, *Response, error) { | ||||
| 	for i := 1; ; i++ { | ||||
| 		miles, resp, err := c.ListRepoMilestones(owner, repo, ListMilestoneOption{ | ||||
| 			ListOptions: ListOptions{ | ||||
| 				Page: i, | ||||
| 			}, | ||||
| 			State: "all", | ||||
| 		}) | ||||
| 		if err != nil { | ||||
| 			return nil, nil, err | ||||
| 		} | ||||
| 		if len(miles) == 0 { | ||||
| 			return nil, nil, fmt.Errorf("milestone '%s' do not exist", name) | ||||
| 		} | ||||
| 		for _, m := range miles { | ||||
| 			if strings.ToLower(strings.TrimSpace(m.Title)) == strings.ToLower(strings.TrimSpace(name)) { | ||||
| 				return m, resp, nil | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										104
									
								
								vendor/code.gitea.io/sdk/gitea/issue_reaction.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										104
									
								
								vendor/code.gitea.io/sdk/gitea/issue_reaction.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,104 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // Reaction contain one reaction
 | ||||
| type Reaction struct { | ||||
| 	User     *User     `json:"user"` | ||||
| 	Reaction string    `json:"content"` | ||||
| 	Created  time.Time `json:"created_at"` | ||||
| } | ||||
| 
 | ||||
| // GetIssueReactions get a list reactions of an issue
 | ||||
| func (c *Client) GetIssueReactions(owner, repo string, index int64) ([]*Reaction, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	reactions := make([]*Reaction, 0, 10) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/%d/reactions", owner, repo, index), nil, nil, &reactions) | ||||
| 	return reactions, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetIssueCommentReactions get a list of reactions from a comment of an issue
 | ||||
| func (c *Client) GetIssueCommentReactions(owner, repo string, commentID int64) ([]*Reaction, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	reactions := make([]*Reaction, 0, 10) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/comments/%d/reactions", owner, repo, commentID), nil, nil, &reactions) | ||||
| 	return reactions, resp, err | ||||
| } | ||||
| 
 | ||||
| // editReactionOption contain the reaction type
 | ||||
| type editReactionOption struct { | ||||
| 	Reaction string `json:"content"` | ||||
| } | ||||
| 
 | ||||
| // PostIssueReaction add a reaction to an issue
 | ||||
| func (c *Client) PostIssueReaction(owner, repo string, index int64, reaction string) (*Reaction, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	reactionResponse := new(Reaction) | ||||
| 	body, err := json.Marshal(&editReactionOption{Reaction: reaction}) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	resp, err := c.getParsedResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/issues/%d/reactions", owner, repo, index), | ||||
| 		jsonHeader, bytes.NewReader(body), reactionResponse) | ||||
| 	return reactionResponse, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteIssueReaction remove a reaction from an issue
 | ||||
| func (c *Client) DeleteIssueReaction(owner, repo string, index int64, reaction string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&editReactionOption{Reaction: reaction}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/reactions", owner, repo, index), jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // PostIssueCommentReaction add a reaction to a comment of an issue
 | ||||
| func (c *Client) PostIssueCommentReaction(owner, repo string, commentID int64, reaction string) (*Reaction, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	reactionResponse := new(Reaction) | ||||
| 	body, err := json.Marshal(&editReactionOption{Reaction: reaction}) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	resp, err := c.getParsedResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/issues/comments/%d/reactions", owner, repo, commentID), | ||||
| 		jsonHeader, bytes.NewReader(body), reactionResponse) | ||||
| 	return reactionResponse, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteIssueCommentReaction remove a reaction from a comment of an issue
 | ||||
| func (c *Client) DeleteIssueCommentReaction(owner, repo string, commentID int64, reaction string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&editReactionOption{Reaction: reaction}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", | ||||
| 		fmt.Sprintf("/repos/%s/%s/issues/comments/%d/reactions", owner, repo, commentID), | ||||
| 		jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										57
									
								
								vendor/code.gitea.io/sdk/gitea/issue_stopwatch.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										57
									
								
								vendor/code.gitea.io/sdk/gitea/issue_stopwatch.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,57 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // StopWatch represents a running stopwatch of an issue / pr
 | ||||
| type StopWatch struct { | ||||
| 	Created       time.Time `json:"created"` | ||||
| 	Seconds       int64     `json:"seconds"` | ||||
| 	Duration      string    `json:"duration"` | ||||
| 	IssueIndex    int64     `json:"issue_index"` | ||||
| 	IssueTitle    string    `json:"issue_title"` | ||||
| 	RepoOwnerName string    `json:"repo_owner_name"` | ||||
| 	RepoName      string    `json:"repo_name"` | ||||
| } | ||||
| 
 | ||||
| // GetMyStopwatches list all stopwatches
 | ||||
| func (c *Client) GetMyStopwatches() ([]*StopWatch, *Response, error) { | ||||
| 	stopwatches := make([]*StopWatch, 0, 1) | ||||
| 	resp, err := c.getParsedResponse("GET", "/user/stopwatches", nil, nil, &stopwatches) | ||||
| 	return stopwatches, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteIssueStopwatch delete / cancel a specific stopwatch
 | ||||
| func (c *Client) DeleteIssueStopwatch(owner, repo string, index int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/stopwatch/delete", owner, repo, index), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // StartIssueStopWatch starts a stopwatch for an existing issue for a given
 | ||||
| // repository
 | ||||
| func (c *Client) StartIssueStopWatch(owner, repo string, index int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("POST", fmt.Sprintf("/repos/%s/%s/issues/%d/stopwatch/start", owner, repo, index), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // StopIssueStopWatch stops an existing stopwatch for an issue in a given
 | ||||
| // repository
 | ||||
| func (c *Client) StopIssueStopWatch(owner, repo string, index int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("POST", fmt.Sprintf("/repos/%s/%s/issues/%d/stopwatch/stop", owner, repo, index), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										87
									
								
								vendor/code.gitea.io/sdk/gitea/issue_subscription.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										87
									
								
								vendor/code.gitea.io/sdk/gitea/issue_subscription.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,87 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| ) | ||||
| 
 | ||||
| // GetIssueSubscribers get list of users who subscribed on an issue
 | ||||
| func (c *Client) GetIssueSubscribers(owner, repo string, index int64) ([]*User, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	subscribers := make([]*User, 0, 10) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/%d/subscriptions", owner, repo, index), nil, nil, &subscribers) | ||||
| 	return subscribers, resp, err | ||||
| } | ||||
| 
 | ||||
| // AddIssueSubscription Subscribe user to issue
 | ||||
| func (c *Client) AddIssueSubscription(owner, repo string, index int64, user string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &user); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("PUT", fmt.Sprintf("/repos/%s/%s/issues/%d/subscriptions/%s", owner, repo, index, user), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return resp, err | ||||
| 	} | ||||
| 	if status == http.StatusCreated { | ||||
| 		return resp, nil | ||||
| 	} | ||||
| 	if status == http.StatusOK { | ||||
| 		return resp, fmt.Errorf("already subscribed") | ||||
| 	} | ||||
| 	return resp, fmt.Errorf("unexpected Status: %d", status) | ||||
| } | ||||
| 
 | ||||
| // DeleteIssueSubscription unsubscribe user from issue
 | ||||
| func (c *Client) DeleteIssueSubscription(owner, repo string, index int64, user string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &user); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/subscriptions/%s", owner, repo, index, user), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return resp, err | ||||
| 	} | ||||
| 	if status == http.StatusCreated { | ||||
| 		return resp, nil | ||||
| 	} | ||||
| 	if status == http.StatusOK { | ||||
| 		return resp, fmt.Errorf("already unsubscribed") | ||||
| 	} | ||||
| 	return resp, fmt.Errorf("unexpected Status: %d", status) | ||||
| } | ||||
| 
 | ||||
| // CheckIssueSubscription check if current user is subscribed to an issue
 | ||||
| func (c *Client) CheckIssueSubscription(owner, repo string, index int64) (*WatchInfo, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	wi := new(WatchInfo) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/%d/subscriptions/check", owner, repo, index), nil, nil, wi) | ||||
| 	return wi, resp, err | ||||
| } | ||||
| 
 | ||||
| // IssueSubscribe subscribe current user to an issue
 | ||||
| func (c *Client) IssueSubscribe(owner, repo string, index int64) (*Response, error) { | ||||
| 	u, _, err := c.GetMyUserInfo() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return c.AddIssueSubscription(owner, repo, index, u.UserName) | ||||
| } | ||||
| 
 | ||||
| // IssueUnSubscribe unsubscribe current user from an issue
 | ||||
| func (c *Client) IssueUnSubscribe(owner, repo string, index int64) (*Response, error) { | ||||
| 	u, _, err := c.GetMyUserInfo() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return c.DeleteIssueSubscription(owner, repo, index, u.UserName) | ||||
| } | ||||
							
								
								
									
										142
									
								
								vendor/code.gitea.io/sdk/gitea/issue_tracked_time.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										142
									
								
								vendor/code.gitea.io/sdk/gitea/issue_tracked_time.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,142 +0,0 @@ | ||||
| // 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" | ||||
| 	"net/url" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // TrackedTime worked time for an issue / pr
 | ||||
| type TrackedTime struct { | ||||
| 	ID      int64     `json:"id"` | ||||
| 	Created time.Time `json:"created"` | ||||
| 	// Time in seconds
 | ||||
| 	Time int64 `json:"time"` | ||||
| 	// deprecated (only for backwards compatibility)
 | ||||
| 	UserID   int64  `json:"user_id"` | ||||
| 	UserName string `json:"user_name"` | ||||
| 	// deprecated (only for backwards compatibility)
 | ||||
| 	IssueID int64  `json:"issue_id"` | ||||
| 	Issue   *Issue `json:"issue"` | ||||
| } | ||||
| 
 | ||||
| // ListTrackedTimesOptions options for listing repository's tracked times
 | ||||
| type ListTrackedTimesOptions struct { | ||||
| 	ListOptions | ||||
| 	Since  time.Time | ||||
| 	Before time.Time | ||||
| 	// User filter is only used by ListRepoTrackedTimes !!!
 | ||||
| 	User string | ||||
| } | ||||
| 
 | ||||
| // QueryEncode turns options into querystring argument
 | ||||
| func (opt *ListTrackedTimesOptions) QueryEncode() string { | ||||
| 	query := opt.getURLQuery() | ||||
| 
 | ||||
| 	if !opt.Since.IsZero() { | ||||
| 		query.Add("since", opt.Since.Format(time.RFC3339)) | ||||
| 	} | ||||
| 	if !opt.Before.IsZero() { | ||||
| 		query.Add("before", opt.Before.Format(time.RFC3339)) | ||||
| 	} | ||||
| 
 | ||||
| 	if len(opt.User) != 0 { | ||||
| 		query.Add("user", opt.User) | ||||
| 	} | ||||
| 
 | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| // ListRepoTrackedTimes list tracked times of a repository
 | ||||
| func (c *Client) ListRepoTrackedTimes(owner, repo string, opt ListTrackedTimesOptions) ([]*TrackedTime, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/times", owner, repo)) | ||||
| 	opt.setDefaults() | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	times := make([]*TrackedTime, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, ×) | ||||
| 	return times, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetMyTrackedTimes list tracked times of the current user
 | ||||
| func (c *Client) GetMyTrackedTimes() ([]*TrackedTime, *Response, error) { | ||||
| 	times := make([]*TrackedTime, 0, 10) | ||||
| 	resp, err := c.getParsedResponse("GET", "/user/times", jsonHeader, nil, ×) | ||||
| 	return times, resp, err | ||||
| } | ||||
| 
 | ||||
| // AddTimeOption options for adding time to an issue
 | ||||
| type AddTimeOption struct { | ||||
| 	// time in seconds
 | ||||
| 	Time int64 `json:"time"` | ||||
| 	// optional
 | ||||
| 	Created time.Time `json:"created"` | ||||
| 	// optional
 | ||||
| 	User string `json:"user_name"` | ||||
| } | ||||
| 
 | ||||
| // Validate the AddTimeOption struct
 | ||||
| func (opt AddTimeOption) Validate() error { | ||||
| 	if opt.Time == 0 { | ||||
| 		return fmt.Errorf("no time to add") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // AddTime adds time to issue with the given index
 | ||||
| func (c *Client) AddTime(owner, repo string, index int64, opt AddTimeOption) (*TrackedTime, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	t := new(TrackedTime) | ||||
| 	resp, err := c.getParsedResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/issues/%d/times", owner, repo, index), | ||||
| 		jsonHeader, bytes.NewReader(body), t) | ||||
| 	return t, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListIssueTrackedTimes list tracked times of a single issue for a given repository
 | ||||
| func (c *Client) ListIssueTrackedTimes(owner, repo string, index int64, opt ListTrackedTimesOptions) ([]*TrackedTime, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/issues/%d/times", owner, repo, index)) | ||||
| 	opt.setDefaults() | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	times := make([]*TrackedTime, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, ×) | ||||
| 	return times, resp, err | ||||
| } | ||||
| 
 | ||||
| // ResetIssueTime reset tracked time of a single issue for a given repository
 | ||||
| func (c *Client) ResetIssueTime(owner, repo string, index int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/times", owner, repo, index), jsonHeader, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteTime delete a specific tracked time by id of a single issue for a given repository
 | ||||
| func (c *Client) DeleteTime(owner, repo string, index, timeID int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/times/%d", owner, repo, index, timeID), jsonHeader, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										42
									
								
								vendor/code.gitea.io/sdk/gitea/list_options.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/code.gitea.io/sdk/gitea/list_options.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,42 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| ) | ||||
| 
 | ||||
| const defaultPageSize = 10 | ||||
| const maxPageSize = 50 | ||||
| 
 | ||||
| // ListOptions options for using Gitea's API pagination
 | ||||
| type ListOptions struct { | ||||
| 	Page     int | ||||
| 	PageSize int | ||||
| } | ||||
| 
 | ||||
| func (o ListOptions) getURLQuery() url.Values { | ||||
| 	query := make(url.Values) | ||||
| 	query.Add("page", fmt.Sprintf("%d", o.Page)) | ||||
| 	query.Add("limit", fmt.Sprintf("%d", o.PageSize)) | ||||
| 
 | ||||
| 	return query | ||||
| } | ||||
| 
 | ||||
| // setDefaults set default pagination options if none or wrong are set
 | ||||
| // if you set -1 as page it will set all to 0
 | ||||
| func (o *ListOptions) setDefaults() { | ||||
| 	if o.Page < 0 { | ||||
| 		o.Page, o.PageSize = 0, 0 | ||||
| 		return | ||||
| 	} else if o.Page == 0 { | ||||
| 		o.Page = 1 | ||||
| 	} | ||||
| 
 | ||||
| 	if o.PageSize < 0 || o.PageSize > maxPageSize { | ||||
| 		o.PageSize = defaultPageSize | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										241
									
								
								vendor/code.gitea.io/sdk/gitea/notifications.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										241
									
								
								vendor/code.gitea.io/sdk/gitea/notifications.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,241 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/hashicorp/go-version" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	version1_12_3, _ = version.NewVersion("1.12.3") | ||||
| ) | ||||
| 
 | ||||
| // NotificationThread expose Notification on API
 | ||||
| type NotificationThread struct { | ||||
| 	ID         int64                `json:"id"` | ||||
| 	Repository *Repository          `json:"repository"` | ||||
| 	Subject    *NotificationSubject `json:"subject"` | ||||
| 	Unread     bool                 `json:"unread"` | ||||
| 	Pinned     bool                 `json:"pinned"` | ||||
| 	UpdatedAt  time.Time            `json:"updated_at"` | ||||
| 	URL        string               `json:"url"` | ||||
| } | ||||
| 
 | ||||
| // NotificationSubject contains the notification subject (Issue/Pull/Commit)
 | ||||
| type NotificationSubject struct { | ||||
| 	Title            string             `json:"title"` | ||||
| 	URL              string             `json:"url"` | ||||
| 	LatestCommentURL string             `json:"latest_comment_url"` | ||||
| 	Type             NotifySubjectType  `json:"type"` | ||||
| 	State            NotifySubjectState `json:"state"` | ||||
| } | ||||
| 
 | ||||
| // NotifyStatus notification status type
 | ||||
| type NotifyStatus string | ||||
| 
 | ||||
| const ( | ||||
| 	// NotifyStatusUnread was not read
 | ||||
| 	NotifyStatusUnread NotifyStatus = "unread" | ||||
| 	// NotifyStatusRead was already read by user
 | ||||
| 	NotifyStatusRead NotifyStatus = "read" | ||||
| 	// NotifyStatusPinned notification is pinned by user
 | ||||
| 	NotifyStatusPinned NotifyStatus = "pinned" | ||||
| ) | ||||
| 
 | ||||
| // NotifySubjectType represent type of notification subject
 | ||||
| type NotifySubjectType string | ||||
| 
 | ||||
| const ( | ||||
| 	// NotifySubjectIssue an issue is subject of an notification
 | ||||
| 	NotifySubjectIssue NotifySubjectType = "Issue" | ||||
| 	// NotifySubjectPull an pull is subject of an notification
 | ||||
| 	NotifySubjectPull NotifySubjectType = "Pull" | ||||
| 	// NotifySubjectCommit an commit is subject of an notification
 | ||||
| 	NotifySubjectCommit NotifySubjectType = "Commit" | ||||
| 	// NotifySubjectRepository an repository is subject of an notification
 | ||||
| 	NotifySubjectRepository NotifySubjectType = "Repository" | ||||
| ) | ||||
| 
 | ||||
| // NotifySubjectState reflect state of notification subject
 | ||||
| type NotifySubjectState string | ||||
| 
 | ||||
| const ( | ||||
| 	// NotifySubjectOpen if subject is a pull/issue and is open at the moment
 | ||||
| 	NotifySubjectOpen NotifySubjectState = "open" | ||||
| 	// NotifySubjectClosed if subject is a pull/issue and is closed at the moment
 | ||||
| 	NotifySubjectClosed NotifySubjectState = "closed" | ||||
| 	// NotifySubjectMerged if subject is a pull and got merged
 | ||||
| 	NotifySubjectMerged NotifySubjectState = "merged" | ||||
| ) | ||||
| 
 | ||||
| // ListNotificationOptions represents the filter options
 | ||||
| type ListNotificationOptions struct { | ||||
| 	ListOptions | ||||
| 	Since        time.Time | ||||
| 	Before       time.Time | ||||
| 	Status       []NotifyStatus | ||||
| 	SubjectTypes []NotifySubjectType | ||||
| } | ||||
| 
 | ||||
| // MarkNotificationOptions represents the filter & modify options
 | ||||
| type MarkNotificationOptions struct { | ||||
| 	LastReadAt time.Time | ||||
| 	Status     []NotifyStatus | ||||
| 	ToStatus   NotifyStatus | ||||
| } | ||||
| 
 | ||||
| // QueryEncode encode options to url query
 | ||||
| func (opt *ListNotificationOptions) QueryEncode() string { | ||||
| 	query := opt.getURLQuery() | ||||
| 	if !opt.Since.IsZero() { | ||||
| 		query.Add("since", opt.Since.Format(time.RFC3339)) | ||||
| 	} | ||||
| 	if !opt.Before.IsZero() { | ||||
| 		query.Add("before", opt.Before.Format(time.RFC3339)) | ||||
| 	} | ||||
| 	for _, s := range opt.Status { | ||||
| 		query.Add("status-types", string(s)) | ||||
| 	} | ||||
| 	for _, s := range opt.SubjectTypes { | ||||
| 		query.Add("subject-type", string(s)) | ||||
| 	} | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateUserOption struct
 | ||||
| func (opt ListNotificationOptions) Validate(c *Client) error { | ||||
| 	if len(opt.Status) != 0 { | ||||
| 		return c.checkServerVersionGreaterThanOrEqual(version1_12_3) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // QueryEncode encode options to url query
 | ||||
| func (opt *MarkNotificationOptions) QueryEncode() string { | ||||
| 	query := make(url.Values) | ||||
| 	if !opt.LastReadAt.IsZero() { | ||||
| 		query.Add("last_read_at", opt.LastReadAt.Format(time.RFC3339)) | ||||
| 	} | ||||
| 	for _, s := range opt.Status { | ||||
| 		query.Add("status-types", string(s)) | ||||
| 	} | ||||
| 	if len(opt.ToStatus) != 0 { | ||||
| 		query.Add("to-status", string(opt.ToStatus)) | ||||
| 	} | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateUserOption struct
 | ||||
| func (opt MarkNotificationOptions) Validate(c *Client) error { | ||||
| 	if len(opt.Status) != 0 || len(opt.ToStatus) != 0 { | ||||
| 		return c.checkServerVersionGreaterThanOrEqual(version1_12_3) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CheckNotifications list users's notification threads
 | ||||
| func (c *Client) CheckNotifications() (int64, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return 0, nil, err | ||||
| 	} | ||||
| 	new := struct { | ||||
| 		New int64 `json:"new"` | ||||
| 	}{} | ||||
| 
 | ||||
| 	resp, err := c.getParsedResponse("GET", "/notifications/new", jsonHeader, nil, &new) | ||||
| 	return new.New, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetNotification get notification thread by ID
 | ||||
| func (c *Client) GetNotification(id int64) (*NotificationThread, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	thread := new(NotificationThread) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/notifications/threads/%d", id), nil, nil, thread) | ||||
| 	return thread, resp, err | ||||
| } | ||||
| 
 | ||||
| // ReadNotification mark notification thread as read by ID
 | ||||
| // It optionally takes a second argument if status has to be set other than 'read'
 | ||||
| func (c *Client) ReadNotification(id int64, status ...NotifyStatus) (*Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	link := fmt.Sprintf("/notifications/threads/%d", id) | ||||
| 	if len(status) != 0 { | ||||
| 		link += fmt.Sprintf("?to-status=%s", status[0]) | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PATCH", link, nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // ListNotifications list users's notification threads
 | ||||
| func (c *Client) ListNotifications(opt ListNotificationOptions) ([]*NotificationThread, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(c); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	link, _ := url.Parse("/notifications") | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	threads := make([]*NotificationThread, 0, 10) | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), nil, nil, &threads) | ||||
| 	return threads, resp, err | ||||
| } | ||||
| 
 | ||||
| // ReadNotifications mark notification threads as read
 | ||||
| func (c *Client) ReadNotifications(opt MarkNotificationOptions) (*Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(c); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	link, _ := url.Parse("/notifications") | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	_, resp, err := c.getResponse("PUT", link.String(), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // ListRepoNotifications list users's notification threads on a specific repo
 | ||||
| func (c *Client) ListRepoNotifications(owner, repo string, opt ListNotificationOptions) ([]*NotificationThread, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(c); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/notifications", owner, repo)) | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	threads := make([]*NotificationThread, 0, 10) | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), nil, nil, &threads) | ||||
| 	return threads, resp, err | ||||
| } | ||||
| 
 | ||||
| // ReadRepoNotifications mark notification threads as read on a specific repo
 | ||||
| func (c *Client) ReadRepoNotifications(owner, repo string, opt MarkNotificationOptions) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(c); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/notifications", owner, repo)) | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	_, resp, err := c.getResponse("PUT", link.String(), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										91
									
								
								vendor/code.gitea.io/sdk/gitea/oauth2.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										91
									
								
								vendor/code.gitea.io/sdk/gitea/oauth2.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,91 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // Oauth2 represents an Oauth2 Application
 | ||||
| type Oauth2 struct { | ||||
| 	ID           int64     `json:"id"` | ||||
| 	Name         string    `json:"name"` | ||||
| 	ClientID     string    `json:"client_id"` | ||||
| 	ClientSecret string    `json:"client_secret"` | ||||
| 	RedirectURIs []string  `json:"redirect_uris"` | ||||
| 	Created      time.Time `json:"created"` | ||||
| } | ||||
| 
 | ||||
| // ListOauth2Option for listing Oauth2 Applications
 | ||||
| type ListOauth2Option struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // CreateOauth2Option required options for creating an Application
 | ||||
| type CreateOauth2Option struct { | ||||
| 	Name         string   `json:"name"` | ||||
| 	RedirectURIs []string `json:"redirect_uris"` | ||||
| } | ||||
| 
 | ||||
| // CreateOauth2 create an Oauth2 Application and returns a completed Oauth2 object.
 | ||||
| func (c *Client) CreateOauth2(opt CreateOauth2Option) (*Oauth2, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	oauth := new(Oauth2) | ||||
| 	resp, err := c.getParsedResponse("POST", "/user/applications/oauth2", jsonHeader, bytes.NewReader(body), oauth) | ||||
| 	return oauth, resp, err | ||||
| } | ||||
| 
 | ||||
| // UpdateOauth2 a specific Oauth2 Application by ID and return a completed Oauth2 object.
 | ||||
| func (c *Client) UpdateOauth2(oauth2id int64, opt CreateOauth2Option) (*Oauth2, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	oauth := new(Oauth2) | ||||
| 	resp, err := c.getParsedResponse("PATCH", fmt.Sprintf("/user/applications/oauth2/%d", oauth2id), jsonHeader, bytes.NewReader(body), oauth) | ||||
| 	return oauth, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetOauth2 a specific Oauth2 Application by ID.
 | ||||
| func (c *Client) GetOauth2(oauth2id int64) (*Oauth2, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	oauth2s := &Oauth2{} | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/applications/oauth2/%d", oauth2id), nil, nil, &oauth2s) | ||||
| 	return oauth2s, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListOauth2 all of your Oauth2 Applications.
 | ||||
| func (c *Client) ListOauth2(opt ListOauth2Option) ([]*Oauth2, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	oauth2s := make([]*Oauth2, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/applications/oauth2?%s", opt.getURLQuery().Encode()), nil, nil, &oauth2s) | ||||
| 	return oauth2s, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteOauth2 delete an Oauth2 application by ID
 | ||||
| func (c *Client) DeleteOauth2(oauth2id int64) (*Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/user/applications/oauth2/%d", oauth2id), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										155
									
								
								vendor/code.gitea.io/sdk/gitea/org.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										155
									
								
								vendor/code.gitea.io/sdk/gitea/org.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,155 +0,0 @@ | ||||
| // 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" | ||||
| ) | ||||
| 
 | ||||
| // 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  string `json:"visibility"` | ||||
| } | ||||
| 
 | ||||
| // VisibleType defines the visibility
 | ||||
| type VisibleType string | ||||
| 
 | ||||
| const ( | ||||
| 	// VisibleTypePublic Visible for everyone
 | ||||
| 	VisibleTypePublic VisibleType = "public" | ||||
| 
 | ||||
| 	// VisibleTypeLimited Visible for every connected user
 | ||||
| 	VisibleTypeLimited VisibleType = "limited" | ||||
| 
 | ||||
| 	// VisibleTypePrivate Visible only for organization's members
 | ||||
| 	VisibleTypePrivate VisibleType = "private" | ||||
| ) | ||||
| 
 | ||||
| // ListOrgsOptions options for listing organizations
 | ||||
| type ListOrgsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListMyOrgs list all of current user's organizations
 | ||||
| func (c *Client) ListMyOrgs(opt ListOrgsOptions) ([]*Organization, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	orgs := make([]*Organization, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/orgs?%s", opt.getURLQuery().Encode()), nil, nil, &orgs) | ||||
| 	return orgs, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListUserOrgs list all of some user's organizations
 | ||||
| func (c *Client) ListUserOrgs(user string, opt ListOrgsOptions) ([]*Organization, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	orgs := make([]*Organization, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/users/%s/orgs?%s", user, opt.getURLQuery().Encode()), nil, nil, &orgs) | ||||
| 	return orgs, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetOrg get one organization by name
 | ||||
| func (c *Client) GetOrg(orgname string) (*Organization, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&orgname); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	org := new(Organization) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/orgs/%s", orgname), nil, nil, org) | ||||
| 	return org, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateOrgOption options for creating an organization
 | ||||
| type CreateOrgOption struct { | ||||
| 	Name                      string      `json:"username"` | ||||
| 	FullName                  string      `json:"full_name"` | ||||
| 	Description               string      `json:"description"` | ||||
| 	Website                   string      `json:"website"` | ||||
| 	Location                  string      `json:"location"` | ||||
| 	Visibility                VisibleType `json:"visibility"` | ||||
| 	RepoAdminChangeTeamAccess bool        `json:"repo_admin_change_team_access"` | ||||
| } | ||||
| 
 | ||||
| // checkVisibilityOpt check if mode exist
 | ||||
| func checkVisibilityOpt(v VisibleType) bool { | ||||
| 	return v == VisibleTypePublic || v == VisibleTypeLimited || v == VisibleTypePrivate | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateOrgOption struct
 | ||||
| func (opt CreateOrgOption) Validate() error { | ||||
| 	if len(opt.Name) == 0 { | ||||
| 		return fmt.Errorf("empty org name") | ||||
| 	} | ||||
| 	if len(opt.Visibility) != 0 && !checkVisibilityOpt(opt.Visibility) { | ||||
| 		return fmt.Errorf("infalid bisibility option") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateOrg creates an organization
 | ||||
| func (c *Client) CreateOrg(opt CreateOrgOption) (*Organization, *Response, error) { | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	org := new(Organization) | ||||
| 	resp, err := c.getParsedResponse("POST", "/orgs", jsonHeader, bytes.NewReader(body), org) | ||||
| 	return org, resp, err | ||||
| } | ||||
| 
 | ||||
| // 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"` | ||||
| 	Visibility  VisibleType `json:"visibility"` | ||||
| } | ||||
| 
 | ||||
| // Validate the EditOrgOption struct
 | ||||
| func (opt EditOrgOption) Validate() error { | ||||
| 	if len(opt.Visibility) != 0 && !checkVisibilityOpt(opt.Visibility) { | ||||
| 		return fmt.Errorf("infalid bisibility option") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // EditOrg modify one organization via options
 | ||||
| func (c *Client) EditOrg(orgname string, opt EditOrgOption) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&orgname); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PATCH", fmt.Sprintf("/orgs/%s", orgname), jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteOrg deletes an organization
 | ||||
| func (c *Client) DeleteOrg(orgname string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&orgname); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/orgs/%s", orgname), jsonHeader, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										119
									
								
								vendor/code.gitea.io/sdk/gitea/org_member.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										119
									
								
								vendor/code.gitea.io/sdk/gitea/org_member.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,119 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| ) | ||||
| 
 | ||||
| // DeleteOrgMembership remove a member from an organization
 | ||||
| func (c *Client) DeleteOrgMembership(org, user string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org, &user); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/orgs/%s/members/%s", org, user), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // ListOrgMembershipOption list OrgMembership options
 | ||||
| type ListOrgMembershipOption struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListOrgMembership list an organization's members
 | ||||
| func (c *Client) ListOrgMembership(org string, opt ListOrgMembershipOption) ([]*User, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	users := make([]*User, 0, opt.PageSize) | ||||
| 
 | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/orgs/%s/members", org)) | ||||
| 	link.RawQuery = opt.getURLQuery().Encode() | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, &users) | ||||
| 	return users, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListPublicOrgMembership list an organization's members
 | ||||
| func (c *Client) ListPublicOrgMembership(org string, opt ListOrgMembershipOption) ([]*User, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	users := make([]*User, 0, opt.PageSize) | ||||
| 
 | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/orgs/%s/public_members", org)) | ||||
| 	link.RawQuery = opt.getURLQuery().Encode() | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, &users) | ||||
| 	return users, resp, err | ||||
| } | ||||
| 
 | ||||
| // CheckOrgMembership Check if a user is a member of an organization
 | ||||
| func (c *Client) CheckOrgMembership(org, user string) (bool, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org, &user); err != nil { | ||||
| 		return false, nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("GET", fmt.Sprintf("/orgs/%s/members/%s", org, user), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return false, resp, err | ||||
| 	} | ||||
| 	switch status { | ||||
| 	case http.StatusNoContent: | ||||
| 		return true, resp, nil | ||||
| 	case http.StatusNotFound: | ||||
| 		return false, resp, nil | ||||
| 	default: | ||||
| 		return false, resp, fmt.Errorf("unexpected Status: %d", status) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // CheckPublicOrgMembership Check if a user is a member of an organization
 | ||||
| func (c *Client) CheckPublicOrgMembership(org, user string) (bool, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org, &user); err != nil { | ||||
| 		return false, nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("GET", fmt.Sprintf("/orgs/%s/public_members/%s", org, user), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return false, resp, err | ||||
| 	} | ||||
| 	switch status { | ||||
| 	case http.StatusNoContent: | ||||
| 		return true, resp, nil | ||||
| 	case http.StatusNotFound: | ||||
| 		return false, resp, nil | ||||
| 	default: | ||||
| 		return false, resp, fmt.Errorf("unexpected Status: %d", status) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // SetPublicOrgMembership publicize/conceal a user's membership
 | ||||
| func (c *Client) SetPublicOrgMembership(org, user string, visible bool) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org, &user); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	var ( | ||||
| 		status int | ||||
| 		err    error | ||||
| 		resp   *Response | ||||
| 	) | ||||
| 	if visible { | ||||
| 		status, resp, err = c.getStatusCode("PUT", fmt.Sprintf("/orgs/%s/public_members/%s", org, user), nil, nil) | ||||
| 	} else { | ||||
| 		status, resp, err = c.getStatusCode("DELETE", fmt.Sprintf("/orgs/%s/public_members/%s", org, user), nil, nil) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		return resp, err | ||||
| 	} | ||||
| 	switch status { | ||||
| 	case http.StatusNoContent: | ||||
| 		return resp, nil | ||||
| 	case http.StatusNotFound: | ||||
| 		return resp, fmt.Errorf("forbidden") | ||||
| 	default: | ||||
| 		return resp, fmt.Errorf("unexpected Status: %d", status) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										242
									
								
								vendor/code.gitea.io/sdk/gitea/org_team.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										242
									
								
								vendor/code.gitea.io/sdk/gitea/org_team.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,242 +0,0 @@ | ||||
| // 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" | ||||
| ) | ||||
| 
 | ||||
| // 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"` | ||||
| 	Permission              AccessMode     `json:"permission"` | ||||
| 	CanCreateOrgRepo        bool           `json:"can_create_org_repo"` | ||||
| 	IncludesAllRepositories bool           `json:"includes_all_repositories"` | ||||
| 	Units                   []RepoUnitType `json:"units"` | ||||
| } | ||||
| 
 | ||||
| // RepoUnitType represent all unit types of a repo gitea currently offer
 | ||||
| type RepoUnitType string | ||||
| 
 | ||||
| const ( | ||||
| 	// RepoUnitCode represent file view of a repository
 | ||||
| 	RepoUnitCode RepoUnitType = "repo.code" | ||||
| 	// RepoUnitIssues represent issues of a repository
 | ||||
| 	RepoUnitIssues RepoUnitType = "repo.issues" | ||||
| 	// RepoUnitPulls represent pulls of a repository
 | ||||
| 	RepoUnitPulls RepoUnitType = "repo.pulls" | ||||
| 	// RepoUnitExtIssues represent external issues of a repository
 | ||||
| 	RepoUnitExtIssues RepoUnitType = "repo.ext_issues" | ||||
| 	// RepoUnitWiki represent wiki of a repository
 | ||||
| 	RepoUnitWiki RepoUnitType = "repo.wiki" | ||||
| 	// RepoUnitExtWiki represent external wiki of a repository
 | ||||
| 	RepoUnitExtWiki RepoUnitType = "repo.ext_wiki" | ||||
| 	// RepoUnitReleases represent releases of a repository
 | ||||
| 	RepoUnitReleases RepoUnitType = "repo.releases" | ||||
| 	// RepoUnitProjects represent projects of a repository
 | ||||
| 	RepoUnitProjects RepoUnitType = "repo.projects" | ||||
| ) | ||||
| 
 | ||||
| // ListTeamsOptions options for listing teams
 | ||||
| type ListTeamsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListOrgTeams lists all teams of an organization
 | ||||
| func (c *Client) ListOrgTeams(org string, opt ListTeamsOptions) ([]*Team, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	teams := make([]*Team, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/orgs/%s/teams?%s", org, opt.getURLQuery().Encode()), nil, nil, &teams) | ||||
| 	return teams, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListMyTeams lists all the teams of the current user
 | ||||
| func (c *Client) ListMyTeams(opt *ListTeamsOptions) ([]*Team, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	teams := make([]*Team, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/teams?%s", opt.getURLQuery().Encode()), nil, nil, &teams) | ||||
| 	return teams, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetTeam gets a team by ID
 | ||||
| func (c *Client) GetTeam(id int64) (*Team, *Response, error) { | ||||
| 	t := new(Team) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/teams/%d", id), nil, nil, t) | ||||
| 	return t, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateTeamOption options for creating a team
 | ||||
| type CreateTeamOption struct { | ||||
| 	Name                    string         `json:"name"` | ||||
| 	Description             string         `json:"description"` | ||||
| 	Permission              AccessMode     `json:"permission"` | ||||
| 	CanCreateOrgRepo        bool           `json:"can_create_org_repo"` | ||||
| 	IncludesAllRepositories bool           `json:"includes_all_repositories"` | ||||
| 	Units                   []RepoUnitType `json:"units"` | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateTeamOption struct
 | ||||
| func (opt CreateTeamOption) Validate() error { | ||||
| 	if opt.Permission == AccessModeOwner { | ||||
| 		opt.Permission = AccessModeAdmin | ||||
| 	} else if opt.Permission != AccessModeRead && opt.Permission != AccessModeWrite && opt.Permission != AccessModeAdmin { | ||||
| 		return fmt.Errorf("permission mode invalid") | ||||
| 	} | ||||
| 	if len(opt.Name) == 0 { | ||||
| 		return fmt.Errorf("name required") | ||||
| 	} | ||||
| 	if len(opt.Name) > 30 { | ||||
| 		return fmt.Errorf("name to long") | ||||
| 	} | ||||
| 	if len(opt.Description) > 255 { | ||||
| 		return fmt.Errorf("description to long") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateTeam creates a team for an organization
 | ||||
| func (c *Client) CreateTeam(org string, opt CreateTeamOption) (*Team, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	t := new(Team) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/orgs/%s/teams", org), jsonHeader, bytes.NewReader(body), t) | ||||
| 	return t, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditTeamOption options for editing a team
 | ||||
| type EditTeamOption struct { | ||||
| 	Name                    string         `json:"name"` | ||||
| 	Description             *string        `json:"description"` | ||||
| 	Permission              AccessMode     `json:"permission"` | ||||
| 	CanCreateOrgRepo        *bool          `json:"can_create_org_repo"` | ||||
| 	IncludesAllRepositories *bool          `json:"includes_all_repositories"` | ||||
| 	Units                   []RepoUnitType `json:"units"` | ||||
| } | ||||
| 
 | ||||
| // Validate the EditTeamOption struct
 | ||||
| func (opt EditTeamOption) Validate() error { | ||||
| 	if opt.Permission == AccessModeOwner { | ||||
| 		opt.Permission = AccessModeAdmin | ||||
| 	} else if opt.Permission != AccessModeRead && opt.Permission != AccessModeWrite && opt.Permission != AccessModeAdmin { | ||||
| 		return fmt.Errorf("permission mode invalid") | ||||
| 	} | ||||
| 	if len(opt.Name) == 0 { | ||||
| 		return fmt.Errorf("name required") | ||||
| 	} | ||||
| 	if len(opt.Name) > 30 { | ||||
| 		return fmt.Errorf("name to long") | ||||
| 	} | ||||
| 	if opt.Description != nil && len(*opt.Description) > 255 { | ||||
| 		return fmt.Errorf("description to long") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // EditTeam edits a team of an organization
 | ||||
| func (c *Client) EditTeam(id int64, opt EditTeamOption) (*Response, error) { | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PATCH", fmt.Sprintf("/teams/%d", id), jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteTeam deletes a team of an organization
 | ||||
| func (c *Client) DeleteTeam(id int64) (*Response, error) { | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/teams/%d", id), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // ListTeamMembersOptions options for listing team's members
 | ||||
| type ListTeamMembersOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListTeamMembers lists all members of a team
 | ||||
| func (c *Client) ListTeamMembers(id int64, opt ListTeamMembersOptions) ([]*User, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	members := make([]*User, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/teams/%d/members?%s", id, opt.getURLQuery().Encode()), nil, nil, &members) | ||||
| 	return members, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetTeamMember gets a member of a team
 | ||||
| func (c *Client) GetTeamMember(id int64, user string) (*User, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	m := new(User) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/teams/%d/members/%s", id, user), nil, nil, m) | ||||
| 	return m, resp, err | ||||
| } | ||||
| 
 | ||||
| // AddTeamMember adds a member to a team
 | ||||
| func (c *Client) AddTeamMember(id int64, user string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PUT", fmt.Sprintf("/teams/%d/members/%s", id, user), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // RemoveTeamMember removes a member from a team
 | ||||
| func (c *Client) RemoveTeamMember(id int64, user string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/teams/%d/members/%s", id, user), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // ListTeamRepositoriesOptions options for listing team's repositories
 | ||||
| type ListTeamRepositoriesOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListTeamRepositories lists all repositories of a team
 | ||||
| func (c *Client) ListTeamRepositories(id int64, opt ListTeamRepositoriesOptions) ([]*Repository, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	repos := make([]*Repository, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/teams/%d/repos?%s", id, opt.getURLQuery().Encode()), nil, nil, &repos) | ||||
| 	return repos, resp, err | ||||
| } | ||||
| 
 | ||||
| // AddTeamRepository adds a repository to a team
 | ||||
| func (c *Client) AddTeamRepository(id int64, org, repo string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PUT", fmt.Sprintf("/teams/%d/repos/%s/%s", id, org, repo), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // RemoveTeamRepository removes a repository from a team
 | ||||
| func (c *Client) RemoveTeamRepository(id int64, org, repo string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/teams/%d/repos/%s/%s", id, org, repo), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										328
									
								
								vendor/code.gitea.io/sdk/gitea/pull.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										328
									
								
								vendor/code.gitea.io/sdk/gitea/pull.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,328 +0,0 @@ | ||||
| // Copyright 2016 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" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/hashicorp/go-version" | ||||
| ) | ||||
| 
 | ||||
| // 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"` | ||||
| } | ||||
| 
 | ||||
| // 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"` | ||||
| 	IsLocked  bool       `json:"is_locked"` | ||||
| 	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"` | ||||
| 	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"` | ||||
| 
 | ||||
| 	Deadline *time.Time `json:"due_date"` | ||||
| 	Created  *time.Time `json:"created_at"` | ||||
| 	Updated  *time.Time `json:"updated_at"` | ||||
| 	Closed   *time.Time `json:"closed_at"` | ||||
| } | ||||
| 
 | ||||
| // ListPullRequestsOptions options for listing pull requests
 | ||||
| type ListPullRequestsOptions struct { | ||||
| 	ListOptions | ||||
| 	State StateType `json:"state"` | ||||
| 	// oldest, recentupdate, leastupdate, mostcomment, leastcomment, priority
 | ||||
| 	Sort      string | ||||
| 	Milestone int64 | ||||
| } | ||||
| 
 | ||||
| // MergeStyle is used specify how a pull is merged
 | ||||
| type MergeStyle string | ||||
| 
 | ||||
| const ( | ||||
| 	// MergeStyleMerge merge pull as usual
 | ||||
| 	MergeStyleMerge MergeStyle = "merge" | ||||
| 	// MergeStyleRebase rebase pull
 | ||||
| 	MergeStyleRebase MergeStyle = "rebase" | ||||
| 	// MergeStyleRebaseMerge rebase and merge pull
 | ||||
| 	MergeStyleRebaseMerge MergeStyle = "rebase-merge" | ||||
| 	// MergeStyleSquash squash and merge pull
 | ||||
| 	MergeStyleSquash MergeStyle = "squash" | ||||
| ) | ||||
| 
 | ||||
| // QueryEncode turns options into querystring argument
 | ||||
| func (opt *ListPullRequestsOptions) QueryEncode() string { | ||||
| 	query := opt.getURLQuery() | ||||
| 	if len(opt.State) > 0 { | ||||
| 		query.Add("state", string(opt.State)) | ||||
| 	} | ||||
| 	if len(opt.Sort) > 0 { | ||||
| 		query.Add("sort", opt.Sort) | ||||
| 	} | ||||
| 	if opt.Milestone > 0 { | ||||
| 		query.Add("milestone", fmt.Sprintf("%d", opt.Milestone)) | ||||
| 	} | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| // ListRepoPullRequests list PRs of one repository
 | ||||
| func (c *Client) ListRepoPullRequests(owner, repo string, opt ListPullRequestsOptions) ([]*PullRequest, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	prs := make([]*PullRequest, 0, opt.PageSize) | ||||
| 
 | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/pulls", owner, repo)) | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, &prs) | ||||
| 	if c.checkServerVersionGreaterThanOrEqual(version1_14_0) != nil { | ||||
| 		for i := range prs { | ||||
| 			if err := fixPullHeadSha(c, prs[i]); err != nil { | ||||
| 				return prs, resp, err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return prs, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetPullRequest get information of one PR
 | ||||
| func (c *Client) GetPullRequest(owner, repo string, index int64) (*PullRequest, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	pr := new(PullRequest) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/pulls/%d", owner, repo, index), nil, nil, pr) | ||||
| 	if c.checkServerVersionGreaterThanOrEqual(version1_14_0) != nil { | ||||
| 		if err := fixPullHeadSha(c, pr); err != nil { | ||||
| 			return pr, resp, err | ||||
| 		} | ||||
| 	} | ||||
| 	return pr, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreatePullRequestOption options when creating a pull request
 | ||||
| type CreatePullRequestOption struct { | ||||
| 	Head      string     `json:"head"` | ||||
| 	Base      string     `json:"base"` | ||||
| 	Title     string     `json:"title"` | ||||
| 	Body      string     `json:"body"` | ||||
| 	Assignee  string     `json:"assignee"` | ||||
| 	Assignees []string   `json:"assignees"` | ||||
| 	Milestone int64      `json:"milestone"` | ||||
| 	Labels    []int64    `json:"labels"` | ||||
| 	Deadline  *time.Time `json:"due_date"` | ||||
| } | ||||
| 
 | ||||
| // CreatePullRequest create pull request with options
 | ||||
| func (c *Client) CreatePullRequest(owner, repo string, opt CreatePullRequestOption) (*PullRequest, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	pr := new(PullRequest) | ||||
| 	resp, err := c.getParsedResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/pulls", owner, repo), | ||||
| 		jsonHeader, bytes.NewReader(body), pr) | ||||
| 	return pr, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditPullRequestOption options when modify pull request
 | ||||
| type EditPullRequestOption struct { | ||||
| 	Title     string     `json:"title"` | ||||
| 	Body      string     `json:"body"` | ||||
| 	Base      string     `json:"base"` | ||||
| 	Assignee  string     `json:"assignee"` | ||||
| 	Assignees []string   `json:"assignees"` | ||||
| 	Milestone int64      `json:"milestone"` | ||||
| 	Labels    []int64    `json:"labels"` | ||||
| 	State     *StateType `json:"state"` | ||||
| 	Deadline  *time.Time `json:"due_date"` | ||||
| } | ||||
| 
 | ||||
| // Validate the EditPullRequestOption struct
 | ||||
| func (opt EditPullRequestOption) Validate(c *Client) error { | ||||
| 	if len(opt.Title) != 0 && len(strings.TrimSpace(opt.Title)) == 0 { | ||||
| 		return fmt.Errorf("title is empty") | ||||
| 	} | ||||
| 	if len(opt.Base) != 0 { | ||||
| 		if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 			return fmt.Errorf("can not change base gitea to old") | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // EditPullRequest modify pull request with PR id and options
 | ||||
| func (c *Client) EditPullRequest(owner, repo string, index int64, opt EditPullRequestOption) (*PullRequest, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(c); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	pr := new(PullRequest) | ||||
| 	resp, err := c.getParsedResponse("PATCH", | ||||
| 		fmt.Sprintf("/repos/%s/%s/pulls/%d", owner, repo, index), | ||||
| 		jsonHeader, bytes.NewReader(body), pr) | ||||
| 	return pr, resp, err | ||||
| } | ||||
| 
 | ||||
| // MergePullRequestOption options when merging a pull request
 | ||||
| type MergePullRequestOption struct { | ||||
| 	Style   MergeStyle `json:"Do"` | ||||
| 	Title   string     `json:"MergeTitleField"` | ||||
| 	Message string     `json:"MergeMessageField"` | ||||
| } | ||||
| 
 | ||||
| var version1_11_5, _ = version.NewVersion("1.11.5") | ||||
| 
 | ||||
| // Validate the MergePullRequestOption struct
 | ||||
| func (opt MergePullRequestOption) Validate(c *Client) error { | ||||
| 	if opt.Style == MergeStyleSquash { | ||||
| 		if err := c.checkServerVersionGreaterThanOrEqual(version1_11_5); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // MergePullRequest merge a PR to repository by PR id
 | ||||
| func (c *Client) MergePullRequest(owner, repo string, index int64, opt MergePullRequestOption) (bool, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return false, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(c); err != nil { | ||||
| 		return false, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return false, nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("POST", fmt.Sprintf("/repos/%s/%s/pulls/%d/merge", owner, repo, index), jsonHeader, bytes.NewReader(body)) | ||||
| 	if err != nil { | ||||
| 		return false, resp, err | ||||
| 	} | ||||
| 	return status == 200, resp, nil | ||||
| } | ||||
| 
 | ||||
| // IsPullRequestMerged test if one PR is merged to one repository
 | ||||
| func (c *Client) IsPullRequestMerged(owner, repo string, index int64) (bool, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return false, nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("GET", fmt.Sprintf("/repos/%s/%s/pulls/%d/merge", owner, repo, index), nil, nil) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		return false, resp, err | ||||
| 	} | ||||
| 
 | ||||
| 	return status == 204, resp, nil | ||||
| } | ||||
| 
 | ||||
| // getPullRequestDiffOrPatch gets the patch or diff file as bytes for a PR
 | ||||
| func (c *Client) getPullRequestDiffOrPatch(owner, repo, kind string, index int64) ([]byte, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &kind); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | ||||
| 		r, _, err2 := c.GetRepo(owner, repo) | ||||
| 		if err2 != nil { | ||||
| 			return nil, nil, err | ||||
| 		} | ||||
| 		if r.Private { | ||||
| 			return nil, nil, err | ||||
| 		} | ||||
| 		return c.getWebResponse("GET", fmt.Sprintf("/%s/%s/pulls/%d.%s", owner, repo, index, kind), nil) | ||||
| 	} | ||||
| 	return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/pulls/%d.%s", owner, repo, index, kind), nil, nil) | ||||
| } | ||||
| 
 | ||||
| // GetPullRequestPatch gets the .patch file as bytes for a PR
 | ||||
| func (c *Client) GetPullRequestPatch(owner, repo string, index int64) ([]byte, *Response, error) { | ||||
| 	return c.getPullRequestDiffOrPatch(owner, repo, "patch", index) | ||||
| } | ||||
| 
 | ||||
| // GetPullRequestDiff gets the .diff file as bytes for a PR
 | ||||
| func (c *Client) GetPullRequestDiff(owner, repo string, index int64) ([]byte, *Response, error) { | ||||
| 	return c.getPullRequestDiffOrPatch(owner, repo, "diff", index) | ||||
| } | ||||
| 
 | ||||
| // ListPullRequestCommitsOptions options for listing pull requests
 | ||||
| type ListPullRequestCommitsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListPullRequestCommits list commits for a pull request
 | ||||
| func (c *Client) ListPullRequestCommits(owner, repo string, index int64, opt ListPullRequestCommitsOptions) ([]*Commit, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/pulls/%d/commits", owner, repo, index)) | ||||
| 	opt.setDefaults() | ||||
| 	commits := make([]*Commit, 0, opt.PageSize) | ||||
| 	link.RawQuery = opt.getURLQuery().Encode() | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), nil, nil, &commits) | ||||
| 	return commits, resp, err | ||||
| } | ||||
| 
 | ||||
| // fixPullHeadSha is a workaround for https://github.com/go-gitea/gitea/issues/12675
 | ||||
| // When no head sha is available, this is because the branch got deleted in the base repo.
 | ||||
| // pr.Head.Ref points in this case not to the head repo branch name, but the base repo ref,
 | ||||
| // which stays available to resolve the commit sha. This is fixed for gitea >= 1.14.0
 | ||||
| func fixPullHeadSha(client *Client, pr *PullRequest) error { | ||||
| 	if pr.Base != nil && pr.Base.Repository != nil && pr.Base.Repository.Owner != nil && | ||||
| 		pr.Head != nil && pr.Head.Ref != "" && pr.Head.Sha == "" { | ||||
| 		owner := pr.Base.Repository.Owner.UserName | ||||
| 		repo := pr.Base.Repository.Name | ||||
| 		refs, _, err := client.GetRepoRefs(owner, repo, pr.Head.Ref) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} else if len(refs) == 0 { | ||||
| 			return fmt.Errorf("unable to resolve PR ref '%s'", pr.Head.Ref) | ||||
| 		} | ||||
| 		pr.Head.Sha = refs[0].Object.SHA | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										325
									
								
								vendor/code.gitea.io/sdk/gitea/pull_review.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										325
									
								
								vendor/code.gitea.io/sdk/gitea/pull_review.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,325 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // ReviewStateType review state type
 | ||||
| type ReviewStateType string | ||||
| 
 | ||||
| const ( | ||||
| 	// ReviewStateApproved pr is approved
 | ||||
| 	ReviewStateApproved ReviewStateType = "APPROVED" | ||||
| 	// ReviewStatePending pr state is pending
 | ||||
| 	ReviewStatePending ReviewStateType = "PENDING" | ||||
| 	// ReviewStateComment is a comment review
 | ||||
| 	ReviewStateComment ReviewStateType = "COMMENT" | ||||
| 	// ReviewStateRequestChanges changes for pr are requested
 | ||||
| 	ReviewStateRequestChanges ReviewStateType = "REQUEST_CHANGES" | ||||
| 	// ReviewStateRequestReview review is requested from user
 | ||||
| 	ReviewStateRequestReview ReviewStateType = "REQUEST_REVIEW" | ||||
| 	// ReviewStateUnknown state of pr is unknown
 | ||||
| 	ReviewStateUnknown ReviewStateType = "" | ||||
| ) | ||||
| 
 | ||||
| // PullReview represents a pull request review
 | ||||
| type PullReview struct { | ||||
| 	ID           int64           `json:"id"` | ||||
| 	Reviewer     *User           `json:"user"` | ||||
| 	ReviewerTeam *Team           `json:"team"` | ||||
| 	State        ReviewStateType `json:"state"` | ||||
| 	Body         string          `json:"body"` | ||||
| 	CommitID     string          `json:"commit_id"` | ||||
| 	// Stale indicates if the pull has changed since the review
 | ||||
| 	Stale bool `json:"stale"` | ||||
| 	// Official indicates if the review counts towards the required approval limit, if PR base is a protected branch
 | ||||
| 	Official          bool      `json:"official"` | ||||
| 	Dismissed         bool      `json:"dismissed"` | ||||
| 	CodeCommentsCount int       `json:"comments_count"` | ||||
| 	Submitted         time.Time `json:"submitted_at"` | ||||
| 
 | ||||
| 	HTMLURL     string `json:"html_url"` | ||||
| 	HTMLPullURL string `json:"pull_request_url"` | ||||
| } | ||||
| 
 | ||||
| // PullReviewComment represents a comment on a pull request review
 | ||||
| type PullReviewComment struct { | ||||
| 	ID       int64  `json:"id"` | ||||
| 	Body     string `json:"body"` | ||||
| 	Reviewer *User  `json:"user"` | ||||
| 	ReviewID int64  `json:"pull_request_review_id"` | ||||
| 	Resolver *User  `json:"resolver"` | ||||
| 
 | ||||
| 	Created time.Time `json:"created_at"` | ||||
| 	Updated time.Time `json:"updated_at"` | ||||
| 
 | ||||
| 	Path         string `json:"path"` | ||||
| 	CommitID     string `json:"commit_id"` | ||||
| 	OrigCommitID string `json:"original_commit_id"` | ||||
| 	DiffHunk     string `json:"diff_hunk"` | ||||
| 	LineNum      uint64 `json:"position"` | ||||
| 	OldLineNum   uint64 `json:"original_position"` | ||||
| 
 | ||||
| 	HTMLURL     string `json:"html_url"` | ||||
| 	HTMLPullURL string `json:"pull_request_url"` | ||||
| } | ||||
| 
 | ||||
| // CreatePullReviewOptions are options to create a pull review
 | ||||
| type CreatePullReviewOptions struct { | ||||
| 	State    ReviewStateType           `json:"event"` | ||||
| 	Body     string                    `json:"body"` | ||||
| 	CommitID string                    `json:"commit_id"` | ||||
| 	Comments []CreatePullReviewComment `json:"comments"` | ||||
| } | ||||
| 
 | ||||
| // CreatePullReviewComment represent a review comment for creation api
 | ||||
| type CreatePullReviewComment struct { | ||||
| 	// the tree path
 | ||||
| 	Path string `json:"path"` | ||||
| 	Body string `json:"body"` | ||||
| 	// if comment to old file line or 0
 | ||||
| 	OldLineNum int64 `json:"old_position"` | ||||
| 	// if comment to new file line or 0
 | ||||
| 	NewLineNum int64 `json:"new_position"` | ||||
| } | ||||
| 
 | ||||
| // SubmitPullReviewOptions are options to submit a pending pull review
 | ||||
| type SubmitPullReviewOptions struct { | ||||
| 	State ReviewStateType `json:"event"` | ||||
| 	Body  string          `json:"body"` | ||||
| } | ||||
| 
 | ||||
| // DismissPullReviewOptions are options to dismiss a pull review
 | ||||
| type DismissPullReviewOptions struct { | ||||
| 	Message string `json:"message"` | ||||
| } | ||||
| 
 | ||||
| // PullReviewRequestOptions are options to add or remove pull review requests
 | ||||
| type PullReviewRequestOptions struct { | ||||
| 	Reviewers     []string `json:"reviewers"` | ||||
| 	TeamReviewers []string `json:"team_reviewers"` | ||||
| } | ||||
| 
 | ||||
| // ListPullReviewsOptions options for listing PullReviews
 | ||||
| type ListPullReviewsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // Validate the CreatePullReviewOptions struct
 | ||||
| func (opt CreatePullReviewOptions) Validate() error { | ||||
| 	if opt.State != ReviewStateApproved && len(strings.TrimSpace(opt.Body)) == 0 { | ||||
| 		return fmt.Errorf("body is empty") | ||||
| 	} | ||||
| 	for i := range opt.Comments { | ||||
| 		if err := opt.Comments[i].Validate(); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // Validate the SubmitPullReviewOptions struct
 | ||||
| func (opt SubmitPullReviewOptions) Validate() error { | ||||
| 	if opt.State != ReviewStateApproved && len(strings.TrimSpace(opt.Body)) == 0 { | ||||
| 		return fmt.Errorf("body is empty") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // Validate the CreatePullReviewComment struct
 | ||||
| func (opt CreatePullReviewComment) Validate() error { | ||||
| 	if len(strings.TrimSpace(opt.Body)) == 0 { | ||||
| 		return fmt.Errorf("body is empty") | ||||
| 	} | ||||
| 	if opt.NewLineNum != 0 && opt.OldLineNum != 0 { | ||||
| 		return fmt.Errorf("old and new line num are set, cant identify the code comment position") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // ListPullReviews lists all reviews of a pull request
 | ||||
| func (c *Client) ListPullReviews(owner, repo string, index int64, opt ListPullReviewsOptions) ([]*PullReview, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	rs := make([]*PullReview, 0, opt.PageSize) | ||||
| 
 | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/pulls/%d/reviews", owner, repo, index)) | ||||
| 	link.RawQuery = opt.ListOptions.getURLQuery().Encode() | ||||
| 
 | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, &rs) | ||||
| 	return rs, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetPullReview gets a specific review of a pull request
 | ||||
| func (c *Client) GetPullReview(owner, repo string, index, id int64) (*PullReview, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	r := new(PullReview) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/pulls/%d/reviews/%d", owner, repo, index, id), jsonHeader, nil, &r) | ||||
| 	return r, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListPullReviewComments lists all comments of a pull request review
 | ||||
| func (c *Client) ListPullReviewComments(owner, repo string, index, id int64) ([]*PullReviewComment, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	rcl := make([]*PullReviewComment, 0, 4) | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/pulls/%d/reviews/%d/comments", owner, repo, index, id)) | ||||
| 
 | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, &rcl) | ||||
| 	return rcl, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeletePullReview delete a specific review from a pull request
 | ||||
| func (c *Client) DeletePullReview(owner, repo string, index, id int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/pulls/%d/reviews/%d", owner, repo, index, id), jsonHeader, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // CreatePullReview create a review to an pull request
 | ||||
| func (c *Client) CreatePullReview(owner, repo string, index int64, opt CreatePullReviewOptions) (*PullReview, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	r := new(PullReview) | ||||
| 	resp, err := c.getParsedResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/pulls/%d/reviews", owner, repo, index), | ||||
| 		jsonHeader, bytes.NewReader(body), r) | ||||
| 	return r, resp, err | ||||
| } | ||||
| 
 | ||||
| // SubmitPullReview submit a pending review to an pull request
 | ||||
| func (c *Client) SubmitPullReview(owner, repo string, index, id int64, opt SubmitPullReviewOptions) (*PullReview, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	r := new(PullReview) | ||||
| 	resp, err := c.getParsedResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/pulls/%d/reviews/%d", owner, repo, index, id), | ||||
| 		jsonHeader, bytes.NewReader(body), r) | ||||
| 	return r, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateReviewRequests create review requests to an pull request
 | ||||
| func (c *Client) CreateReviewRequests(owner, repo string, index int64, opt PullReviewRequestOptions) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_14_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	_, resp, err := c.getResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/pulls/%d/requested_reviewers", owner, repo, index), | ||||
| 		jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteReviewRequests delete review requests to an pull request
 | ||||
| func (c *Client) DeleteReviewRequests(owner, repo string, index int64, opt PullReviewRequestOptions) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_14_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	_, resp, err := c.getResponse("DELETE", | ||||
| 		fmt.Sprintf("/repos/%s/%s/pulls/%d/requested_reviewers", owner, repo, index), | ||||
| 		jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DismissPullReview dismiss a review for a pull request
 | ||||
| func (c *Client) DismissPullReview(owner, repo string, index, id int64, opt DismissPullReviewOptions) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_14_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	_, resp, err := c.getResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/pulls/%d/reviews/%d/dismissals", owner, repo, index, id), | ||||
| 		jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // UnDismissPullReview cancel to dismiss a review for a pull request
 | ||||
| func (c *Client) UnDismissPullReview(owner, repo string, index, id int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_14_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	_, resp, err := c.getResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/pulls/%d/reviews/%d/undismissals", owner, repo, index, id), | ||||
| 		jsonHeader, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										202
									
								
								vendor/code.gitea.io/sdk/gitea/release.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										202
									
								
								vendor/code.gitea.io/sdk/gitea/release.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,202 +0,0 @@ | ||||
| // 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" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| 	"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"` | ||||
| 	HTMLURL      string        `json:"html_url"` | ||||
| 	TarURL       string        `json:"tarball_url"` | ||||
| 	ZipURL       string        `json:"zipball_url"` | ||||
| 	IsDraft      bool          `json:"draft"` | ||||
| 	IsPrerelease bool          `json:"prerelease"` | ||||
| 	CreatedAt    time.Time     `json:"created_at"` | ||||
| 	PublishedAt  time.Time     `json:"published_at"` | ||||
| 	Publisher    *User         `json:"author"` | ||||
| 	Attachments  []*Attachment `json:"assets"` | ||||
| } | ||||
| 
 | ||||
| // ListReleasesOptions options for listing repository's releases
 | ||||
| type ListReleasesOptions struct { | ||||
| 	ListOptions | ||||
| 	IsDraft      *bool | ||||
| 	IsPreRelease *bool | ||||
| } | ||||
| 
 | ||||
| // QueryEncode turns options into querystring argument
 | ||||
| func (opt *ListReleasesOptions) QueryEncode() string { | ||||
| 	query := opt.getURLQuery() | ||||
| 
 | ||||
| 	if opt.IsDraft != nil { | ||||
| 		query.Add("draft", fmt.Sprintf("%t", *opt.IsDraft)) | ||||
| 	} | ||||
| 	if opt.IsPreRelease != nil { | ||||
| 		query.Add("draft", fmt.Sprintf("%t", *opt.IsPreRelease)) | ||||
| 	} | ||||
| 
 | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| // ListReleases list releases of a repository
 | ||||
| func (c *Client) ListReleases(owner, repo string, opt ListReleasesOptions) ([]*Release, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	releases := make([]*Release, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases?%s", owner, repo, opt.QueryEncode()), | ||||
| 		nil, nil, &releases) | ||||
| 	return releases, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetRelease get a release of a repository by id
 | ||||
| func (c *Client) GetRelease(owner, repo string, id int64) (*Release, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	r := new(Release) | ||||
| 	resp, err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/%d", owner, repo, id), | ||||
| 		jsonHeader, nil, &r) | ||||
| 	return r, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetReleaseByTag get a release of a repository by tag
 | ||||
| func (c *Client) GetReleaseByTag(owner, repo string, tag string) (*Release, *Response, error) { | ||||
| 	if c.checkServerVersionGreaterThanOrEqual(version1_13_0) != nil { | ||||
| 		return c.fallbackGetReleaseByTag(owner, repo, tag) | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &tag); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	r := new(Release) | ||||
| 	resp, err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/tags/%s", owner, repo, tag), | ||||
| 		nil, nil, &r) | ||||
| 	return r, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateReleaseOption options when creating a release
 | ||||
| type CreateReleaseOption 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"` | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateReleaseOption struct
 | ||||
| func (opt CreateReleaseOption) Validate() error { | ||||
| 	if len(strings.TrimSpace(opt.Title)) == 0 { | ||||
| 		return fmt.Errorf("title is empty") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateRelease create a release
 | ||||
| func (c *Client) CreateRelease(owner, repo string, opt CreateReleaseOption) (*Release, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	r := new(Release) | ||||
| 	resp, err := c.getParsedResponse("POST", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases", owner, repo), | ||||
| 		jsonHeader, bytes.NewReader(body), r) | ||||
| 	return r, resp, 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(owner, repo string, id int64, form EditReleaseOption) (*Release, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(form) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	r := new(Release) | ||||
| 	resp, err := c.getParsedResponse("PATCH", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/%d", owner, repo, id), | ||||
| 		jsonHeader, bytes.NewReader(body), r) | ||||
| 	return r, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteRelease delete a release from a repository, keeping its tag
 | ||||
| func (c *Client) DeleteRelease(user, repo string, id int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/%d", user, repo, id), | ||||
| 		nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteReleaseByTag deletes a release frm a repository by tag
 | ||||
| func (c *Client) DeleteReleaseByTag(user, repo string, tag string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &tag); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_14_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", | ||||
| 		fmt.Sprintf("/repos/%s/%s/releases/tags/%s", user, repo, tag), | ||||
| 		nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // fallbackGetReleaseByTag is fallback for old gitea installations ( < 1.13.0 )
 | ||||
| func (c *Client) fallbackGetReleaseByTag(owner, repo string, tag string) (*Release, *Response, error) { | ||||
| 	for i := 1; ; i++ { | ||||
| 		rl, resp, err := c.ListReleases(owner, repo, ListReleasesOptions{ListOptions: ListOptions{Page: i}}) | ||||
| 		if err != nil { | ||||
| 			return nil, resp, err | ||||
| 		} | ||||
| 		if len(rl) == 0 { | ||||
| 			return nil, | ||||
| 				&Response{&http.Response{StatusCode: 404}}, | ||||
| 				fmt.Errorf("release with tag '%s' not found", tag) | ||||
| 		} | ||||
| 		for _, r := range rl { | ||||
| 			if r.TagName == tag { | ||||
| 				return r, resp, nil | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										534
									
								
								vendor/code.gitea.io/sdk/gitea/repo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										534
									
								
								vendor/code.gitea.io/sdk/gitea/repo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,534 +0,0 @@ | ||||
| // Copyright 2014 The Gogs Authors. All rights reserved.
 | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // Permission represents a set of permissions
 | ||||
| type Permission struct { | ||||
| 	Admin bool `json:"admin"` | ||||
| 	Push  bool `json:"push"` | ||||
| 	Pull  bool `json:"pull"` | ||||
| } | ||||
| 
 | ||||
| // InternalTracker represents settings for internal tracker
 | ||||
| type InternalTracker struct { | ||||
| 	// Enable time tracking (Built-in issue tracker)
 | ||||
| 	EnableTimeTracker bool `json:"enable_time_tracker"` | ||||
| 	// Let only contributors track time (Built-in issue tracker)
 | ||||
| 	AllowOnlyContributorsToTrackTime bool `json:"allow_only_contributors_to_track_time"` | ||||
| 	// Enable dependencies for issues and pull requests (Built-in issue tracker)
 | ||||
| 	EnableIssueDependencies bool `json:"enable_issue_dependencies"` | ||||
| } | ||||
| 
 | ||||
| // ExternalTracker represents settings for external tracker
 | ||||
| type ExternalTracker struct { | ||||
| 	// URL of external issue tracker.
 | ||||
| 	ExternalTrackerURL string `json:"external_tracker_url"` | ||||
| 	// External Issue Tracker URL Format. Use the placeholders {user}, {repo} and {index} for the username, repository name and issue index.
 | ||||
| 	ExternalTrackerFormat string `json:"external_tracker_format"` | ||||
| 	// External Issue Tracker Number Format, either `numeric` or `alphanumeric`
 | ||||
| 	ExternalTrackerStyle string `json:"external_tracker_style"` | ||||
| } | ||||
| 
 | ||||
| // ExternalWiki represents setting for external wiki
 | ||||
| type ExternalWiki struct { | ||||
| 	// URL of external wiki.
 | ||||
| 	ExternalWikiURL string `json:"external_wiki_url"` | ||||
| } | ||||
| 
 | ||||
| // 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"` | ||||
| 	Template                  bool             `json:"template"` | ||||
| 	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"` | ||||
| 	OriginalURL               string           `json:"original_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"` | ||||
| 	OpenPulls                 int              `json:"open_pr_counter"` | ||||
| 	Releases                  int              `json:"release_counter"` | ||||
| 	DefaultBranch             string           `json:"default_branch"` | ||||
| 	Archived                  bool             `json:"archived"` | ||||
| 	Created                   time.Time        `json:"created_at"` | ||||
| 	Updated                   time.Time        `json:"updated_at"` | ||||
| 	Permissions               *Permission      `json:"permissions,omitempty"` | ||||
| 	HasIssues                 bool             `json:"has_issues"` | ||||
| 	InternalTracker           *InternalTracker `json:"internal_tracker,omitempty"` | ||||
| 	ExternalTracker           *ExternalTracker `json:"external_tracker,omitempty"` | ||||
| 	HasWiki                   bool             `json:"has_wiki"` | ||||
| 	ExternalWiki              *ExternalWiki    `json:"external_wiki,omitempty"` | ||||
| 	HasPullRequests           bool             `json:"has_pull_requests"` | ||||
| 	HasProjects               bool             `json:"has_projects"` | ||||
| 	IgnoreWhitespaceConflicts bool             `json:"ignore_whitespace_conflicts"` | ||||
| 	AllowMerge                bool             `json:"allow_merge_commits"` | ||||
| 	AllowRebase               bool             `json:"allow_rebase"` | ||||
| 	AllowRebaseMerge          bool             `json:"allow_rebase_explicit"` | ||||
| 	AllowSquash               bool             `json:"allow_squash_merge"` | ||||
| 	AvatarURL                 string           `json:"avatar_url"` | ||||
| 	Internal                  bool             `json:"internal"` | ||||
| 	MirrorInterval            string           `json:"mirror_interval"` | ||||
| 	DefaultMergeStyle         MergeStyle       `json:"default_merge_style"` | ||||
| } | ||||
| 
 | ||||
| // RepoType represent repo type
 | ||||
| type RepoType string | ||||
| 
 | ||||
| const ( | ||||
| 	// RepoTypeNone dont specify a type
 | ||||
| 	RepoTypeNone RepoType = "" | ||||
| 	// RepoTypeSource is the default repo type
 | ||||
| 	RepoTypeSource RepoType = "source" | ||||
| 	// RepoTypeFork is a repo witch was forked from an other one
 | ||||
| 	RepoTypeFork RepoType = "fork" | ||||
| 	// RepoTypeMirror represents an mirror repo
 | ||||
| 	RepoTypeMirror RepoType = "mirror" | ||||
| ) | ||||
| 
 | ||||
| // TrustModel represent how git signatures are handled in a repository
 | ||||
| type TrustModel string | ||||
| 
 | ||||
| const ( | ||||
| 	// TrustModelDefault use TM set by global config
 | ||||
| 	TrustModelDefault TrustModel = "default" | ||||
| 	// TrustModelCollaborator gpg signature has to be owned by a repo collaborator
 | ||||
| 	TrustModelCollaborator TrustModel = "collaborator" | ||||
| 	// TrustModelCommitter gpg signature has to match committer
 | ||||
| 	TrustModelCommitter TrustModel = "committer" | ||||
| 	// TrustModelCollaboratorCommitter gpg signature has to match committer and owned by a repo collaborator
 | ||||
| 	TrustModelCollaboratorCommitter TrustModel = "collaboratorcommitter" | ||||
| ) | ||||
| 
 | ||||
| // ListReposOptions options for listing repositories
 | ||||
| type ListReposOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListMyRepos lists all repositories for the authenticated user that has access to.
 | ||||
| func (c *Client) ListMyRepos(opt ListReposOptions) ([]*Repository, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	repos := make([]*Repository, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/repos?%s", opt.getURLQuery().Encode()), nil, nil, &repos) | ||||
| 	return repos, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListUserRepos list all repositories of one user by user's name
 | ||||
| func (c *Client) ListUserRepos(user string, opt ListReposOptions) ([]*Repository, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	repos := make([]*Repository, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/users/%s/repos?%s", user, opt.getURLQuery().Encode()), nil, nil, &repos) | ||||
| 	return repos, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListOrgReposOptions options for a organization's repositories
 | ||||
| type ListOrgReposOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListOrgRepos list all repositories of one organization by organization's name
 | ||||
| func (c *Client) ListOrgRepos(org string, opt ListOrgReposOptions) ([]*Repository, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	repos := make([]*Repository, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/orgs/%s/repos?%s", org, opt.getURLQuery().Encode()), nil, nil, &repos) | ||||
| 	return repos, resp, err | ||||
| } | ||||
| 
 | ||||
| // SearchRepoOptions options for searching repositories
 | ||||
| type SearchRepoOptions struct { | ||||
| 	ListOptions | ||||
| 
 | ||||
| 	// The keyword to query
 | ||||
| 	Keyword string | ||||
| 	// Limit search to repositories with keyword as topic
 | ||||
| 	KeywordIsTopic bool | ||||
| 	// Include search of keyword within repository description
 | ||||
| 	KeywordInDescription bool | ||||
| 
 | ||||
| 	/* | ||||
| 		User Filter | ||||
| 	*/ | ||||
| 
 | ||||
| 	// Repo Owner
 | ||||
| 	OwnerID int64 | ||||
| 	// Stared By UserID
 | ||||
| 	StarredByUserID int64 | ||||
| 
 | ||||
| 	/* | ||||
| 		Repo Attributes | ||||
| 	*/ | ||||
| 
 | ||||
| 	// pubic, private or all repositories (defaults to all)
 | ||||
| 	IsPrivate *bool | ||||
| 	// archived, non-archived or all repositories (defaults to all)
 | ||||
| 	IsArchived *bool | ||||
| 	// Exclude template repos from search
 | ||||
| 	ExcludeTemplate bool | ||||
| 	// Filter by "fork", "source", "mirror"
 | ||||
| 	Type RepoType | ||||
| 
 | ||||
| 	/* | ||||
| 		Sort Filters | ||||
| 	*/ | ||||
| 
 | ||||
| 	// sort repos by attribute. Supported values are "alpha", "created", "updated", "size", and "id". Default is "alpha"
 | ||||
| 	Sort string | ||||
| 	// sort order, either "asc" (ascending) or "desc" (descending). Default is "asc", ignored if "sort" is not specified.
 | ||||
| 	Order string | ||||
| 	// Repo owner to prioritize in the results
 | ||||
| 	PrioritizedByOwnerID int64 | ||||
| 
 | ||||
| 	/* | ||||
| 		Cover EdgeCases | ||||
| 	*/ | ||||
| 	// if set all other options are ignored and this string is used as query
 | ||||
| 	RawQuery string | ||||
| } | ||||
| 
 | ||||
| // QueryEncode turns options into querystring argument
 | ||||
| func (opt *SearchRepoOptions) QueryEncode() string { | ||||
| 	query := opt.getURLQuery() | ||||
| 	if opt.Keyword != "" { | ||||
| 		query.Add("q", opt.Keyword) | ||||
| 	} | ||||
| 	if opt.KeywordIsTopic { | ||||
| 		query.Add("topic", "true") | ||||
| 	} | ||||
| 	if opt.KeywordInDescription { | ||||
| 		query.Add("includeDesc", "true") | ||||
| 	} | ||||
| 
 | ||||
| 	// User Filter
 | ||||
| 	if opt.OwnerID > 0 { | ||||
| 		query.Add("uid", fmt.Sprintf("%d", opt.OwnerID)) | ||||
| 		query.Add("exclusive", "true") | ||||
| 	} | ||||
| 	if opt.StarredByUserID > 0 { | ||||
| 		query.Add("starredBy", fmt.Sprintf("%d", opt.StarredByUserID)) | ||||
| 	} | ||||
| 
 | ||||
| 	// Repo Attributes
 | ||||
| 	if opt.IsPrivate != nil { | ||||
| 		query.Add("is_private", fmt.Sprintf("%v", opt.IsPrivate)) | ||||
| 	} | ||||
| 	if opt.IsArchived != nil { | ||||
| 		query.Add("archived", fmt.Sprintf("%v", opt.IsArchived)) | ||||
| 	} | ||||
| 	if opt.ExcludeTemplate { | ||||
| 		query.Add("template", "false") | ||||
| 	} | ||||
| 	if len(opt.Type) != 0 { | ||||
| 		query.Add("mode", string(opt.Type)) | ||||
| 	} | ||||
| 
 | ||||
| 	// Sort Filters
 | ||||
| 	if opt.Sort != "" { | ||||
| 		query.Add("sort", opt.Sort) | ||||
| 	} | ||||
| 	if opt.PrioritizedByOwnerID > 0 { | ||||
| 		query.Add("priority_owner_id", fmt.Sprintf("%d", opt.PrioritizedByOwnerID)) | ||||
| 	} | ||||
| 	if opt.Order != "" { | ||||
| 		query.Add("order", opt.Order) | ||||
| 	} | ||||
| 
 | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| type searchRepoResponse struct { | ||||
| 	Repos []*Repository `json:"data"` | ||||
| } | ||||
| 
 | ||||
| // SearchRepos searches for repositories matching the given filters
 | ||||
| func (c *Client) SearchRepos(opt SearchRepoOptions) ([]*Repository, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	repos := new(searchRepoResponse) | ||||
| 
 | ||||
| 	link, _ := url.Parse("/repos/search") | ||||
| 
 | ||||
| 	if len(opt.RawQuery) != 0 { | ||||
| 		link.RawQuery = opt.RawQuery | ||||
| 	} else { | ||||
| 		link.RawQuery = opt.QueryEncode() | ||||
| 		// IsPrivate only works on gitea >= 1.12.0
 | ||||
| 		if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil && opt.IsPrivate != nil { | ||||
| 			if *opt.IsPrivate { | ||||
| 				// private repos only not supported on gitea <= 1.11.x
 | ||||
| 				return nil, nil, err | ||||
| 			} | ||||
| 			link.Query().Add("private", "false") | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), nil, nil, &repos) | ||||
| 	return repos.Repos, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateRepoOption options when creating repository
 | ||||
| type CreateRepoOption struct { | ||||
| 	// Name of the repository to create
 | ||||
| 	Name string `json:"name"` | ||||
| 	// Description of the repository to create
 | ||||
| 	Description string `json:"description"` | ||||
| 	// Whether the repository is private
 | ||||
| 	Private bool `json:"private"` | ||||
| 	// Issue Label set to use
 | ||||
| 	IssueLabels string `json:"issue_labels"` | ||||
| 	// Whether the repository should be auto-intialized?
 | ||||
| 	AutoInit bool `json:"auto_init"` | ||||
| 	// Whether the repository is template
 | ||||
| 	Template bool `json:"template"` | ||||
| 	// Gitignores to use
 | ||||
| 	Gitignores string `json:"gitignores"` | ||||
| 	// License to use
 | ||||
| 	License string `json:"license"` | ||||
| 	// Readme of the repository to create
 | ||||
| 	Readme string `json:"readme"` | ||||
| 	// DefaultBranch of the repository (used when initializes and in template)
 | ||||
| 	DefaultBranch string `json:"default_branch"` | ||||
| 	// TrustModel of the repository
 | ||||
| 	TrustModel TrustModel `json:"trust_model"` | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateRepoOption struct
 | ||||
| func (opt CreateRepoOption) Validate(c *Client) error { | ||||
| 	if len(strings.TrimSpace(opt.Name)) == 0 { | ||||
| 		return fmt.Errorf("name is empty") | ||||
| 	} | ||||
| 	if len(opt.Name) > 100 { | ||||
| 		return fmt.Errorf("name has more than 100 chars") | ||||
| 	} | ||||
| 	if len(opt.Description) > 255 { | ||||
| 		return fmt.Errorf("name has more than 255 chars") | ||||
| 	} | ||||
| 	if len(opt.DefaultBranch) > 100 { | ||||
| 		return fmt.Errorf("name has more than 100 chars") | ||||
| 	} | ||||
| 	if len(opt.TrustModel) != 0 { | ||||
| 		if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateRepo creates a repository for authenticated user.
 | ||||
| func (c *Client) CreateRepo(opt CreateRepoOption) (*Repository, *Response, error) { | ||||
| 	if err := opt.Validate(c); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	repo := new(Repository) | ||||
| 	resp, err := c.getParsedResponse("POST", "/user/repos", jsonHeader, bytes.NewReader(body), repo) | ||||
| 	return repo, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateOrgRepo creates an organization repository for authenticated user.
 | ||||
| func (c *Client) CreateOrgRepo(org string, opt CreateRepoOption) (*Repository, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&org); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(c); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	repo := new(Repository) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/org/%s/repos", org), jsonHeader, bytes.NewReader(body), repo) | ||||
| 	return repo, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetRepo returns information of a repository of given owner.
 | ||||
| func (c *Client) GetRepo(owner, reponame string) (*Repository, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &reponame); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	repo := new(Repository) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s", owner, reponame), nil, nil, repo) | ||||
| 	return repo, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetRepoByID returns information of a repository by a giver repository ID.
 | ||||
| func (c *Client) GetRepoByID(id int64) (*Repository, *Response, error) { | ||||
| 	repo := new(Repository) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repositories/%d", id), nil, nil, repo) | ||||
| 	return repo, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditRepoOption options when editing a repository's properties
 | ||||
| type EditRepoOption struct { | ||||
| 	// name of the repository
 | ||||
| 	Name *string `json:"name,omitempty"` | ||||
| 	// a short description of the repository.
 | ||||
| 	Description *string `json:"description,omitempty"` | ||||
| 	// a URL with more information about the repository.
 | ||||
| 	Website *string `json:"website,omitempty"` | ||||
| 	// either `true` to make the repository private or `false` to make it public.
 | ||||
| 	// Note: you will get a 422 error if the organization restricts changing repository visibility to organization
 | ||||
| 	// owners and a non-owner tries to change the value of private.
 | ||||
| 	Private *bool `json:"private,omitempty"` | ||||
| 	// either `true` to make this repository a template or `false` to make it a normal repository
 | ||||
| 	Template *bool `json:"template,omitempty"` | ||||
| 	// either `true` to enable issues for this repository or `false` to disable them.
 | ||||
| 	HasIssues *bool `json:"has_issues,omitempty"` | ||||
| 	// set this structure to configure internal issue tracker (requires has_issues)
 | ||||
| 	InternalTracker *InternalTracker `json:"internal_tracker,omitempty"` | ||||
| 	// set this structure to use external issue tracker (requires has_issues)
 | ||||
| 	ExternalTracker *ExternalTracker `json:"external_tracker,omitempty"` | ||||
| 	// either `true` to enable the wiki for this repository or `false` to disable it.
 | ||||
| 	HasWiki *bool `json:"has_wiki,omitempty"` | ||||
| 	// set this structure to use external wiki instead of internal (requires has_wiki)
 | ||||
| 	ExternalWiki *ExternalWiki `json:"external_wiki,omitempty"` | ||||
| 	// sets the default branch for this repository.
 | ||||
| 	DefaultBranch *string `json:"default_branch,omitempty"` | ||||
| 	// either `true` to allow pull requests, or `false` to prevent pull request.
 | ||||
| 	HasPullRequests *bool `json:"has_pull_requests,omitempty"` | ||||
| 	// either `true` to enable project unit, or `false` to disable them.
 | ||||
| 	HasProjects *bool `json:"has_projects,omitempty"` | ||||
| 	// either `true` to ignore whitespace for conflicts, or `false` to not ignore whitespace. `has_pull_requests` must be `true`.
 | ||||
| 	IgnoreWhitespaceConflicts *bool `json:"ignore_whitespace_conflicts,omitempty"` | ||||
| 	// either `true` to allow merging pull requests with a merge commit, or `false` to prevent merging pull requests with merge commits. `has_pull_requests` must be `true`.
 | ||||
| 	AllowMerge *bool `json:"allow_merge_commits,omitempty"` | ||||
| 	// either `true` to allow rebase-merging pull requests, or `false` to prevent rebase-merging. `has_pull_requests` must be `true`.
 | ||||
| 	AllowRebase *bool `json:"allow_rebase,omitempty"` | ||||
| 	// either `true` to allow rebase with explicit merge commits (--no-ff), or `false` to prevent rebase with explicit merge commits. `has_pull_requests` must be `true`.
 | ||||
| 	AllowRebaseMerge *bool `json:"allow_rebase_explicit,omitempty"` | ||||
| 	// either `true` to allow squash-merging pull requests, or `false` to prevent squash-merging. `has_pull_requests` must be `true`.
 | ||||
| 	AllowSquash *bool `json:"allow_squash_merge,omitempty"` | ||||
| 	// set to `true` to archive this repository.
 | ||||
| 	Archived *bool `json:"archived,omitempty"` | ||||
| 	// set to a string like `8h30m0s` to set the mirror interval time
 | ||||
| 	MirrorInterval *string `json:"mirror_interval,omitempty"` | ||||
| 	// either `true` to allow mark pr as merged manually, or `false` to prevent it. `has_pull_requests` must be `true`.
 | ||||
| 	AllowManualMerge *bool `json:"allow_manual_merge,omitempty"` | ||||
| 	// either `true` to enable AutodetectManualMerge, or `false` to prevent it. `has_pull_requests` must be `true`, Note: In some special cases, misjudgments can occur.
 | ||||
| 	AutodetectManualMerge *bool `json:"autodetect_manual_merge,omitempty"` | ||||
| 	// set to a merge style to be used by this repository: "merge", "rebase", "rebase-merge", or "squash". `has_pull_requests` must be `true`.
 | ||||
| 	DefaultMergeStyle *MergeStyle `json:"default_merge_style,omitempty"` | ||||
| 	// set to `true` to archive this repository.
 | ||||
| } | ||||
| 
 | ||||
| // EditRepo edit the properties of a repository
 | ||||
| func (c *Client) EditRepo(owner, reponame string, opt EditRepoOption) (*Repository, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &reponame); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	repo := new(Repository) | ||||
| 	resp, err := c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s", owner, reponame), jsonHeader, bytes.NewReader(body), repo) | ||||
| 	return repo, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteRepo deletes a repository of user or organization.
 | ||||
| func (c *Client) DeleteRepo(owner, repo string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s", owner, repo), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // MirrorSync adds a mirrored repository to the mirror sync queue.
 | ||||
| func (c *Client) MirrorSync(owner, repo string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("POST", fmt.Sprintf("/repos/%s/%s/mirror-sync", owner, repo), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // GetRepoLanguages return language stats of a repo
 | ||||
| func (c *Client) GetRepoLanguages(owner, repo string) (map[string]int64, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	langMap := make(map[string]int64) | ||||
| 
 | ||||
| 	data, resp, err := c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/languages", owner, repo), jsonHeader, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 	if err = json.Unmarshal(data, &langMap); err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 	return langMap, resp, nil | ||||
| } | ||||
| 
 | ||||
| // ArchiveType represent supported archive formats by gitea
 | ||||
| type ArchiveType string | ||||
| 
 | ||||
| const ( | ||||
| 	// ZipArchive represent zip format
 | ||||
| 	ZipArchive ArchiveType = ".zip" | ||||
| 	// TarGZArchive represent tar.gz format
 | ||||
| 	TarGZArchive ArchiveType = ".tar.gz" | ||||
| ) | ||||
| 
 | ||||
| // GetArchive get an archive of a repository by git reference
 | ||||
| // e.g.: ref -> master, 70b7c74b33, v1.2.1, ...
 | ||||
| func (c *Client) GetArchive(owner, repo, ref string, ext ArchiveType) ([]byte, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	ref = pathEscapeSegments(ref) | ||||
| 	return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/archive/%s%s", owner, repo, ref, ext), nil, nil) | ||||
| } | ||||
| 
 | ||||
| // GetArchiveReader gets a `git archive` for a particular tree-ish git reference
 | ||||
| // such as a branch name (`master`), a commit hash (`70b7c74b33`), a tag
 | ||||
| // (`v1.2.1`). The archive is returned as a byte stream in a ReadCloser. It is
 | ||||
| // the responsibility of the client to close the reader.
 | ||||
| func (c *Client) GetArchiveReader(owner, repo, ref string, ext ArchiveType) (io.ReadCloser, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	ref = pathEscapeSegments(ref) | ||||
| 	resp, err := c.doRequest("GET", fmt.Sprintf("/repos/%s/%s/archive/%s%s", owner, repo, ref, ext), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 
 | ||||
| 	if _, err := statusCodeToErr(resp); err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 
 | ||||
| 	return resp.Body, resp, nil | ||||
| } | ||||
							
								
								
									
										143
									
								
								vendor/code.gitea.io/sdk/gitea/repo_branch.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										143
									
								
								vendor/code.gitea.io/sdk/gitea/repo_branch.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,143 +0,0 @@ | ||||
| // Copyright 2016 The Gogs Authors. All rights reserved.
 | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // PayloadUser represents the author or committer of a commit
 | ||||
| type PayloadUser struct { | ||||
| 	// Full name of the commit author
 | ||||
| 	Name     string `json:"name"` | ||||
| 	Email    string `json:"email"` | ||||
| 	UserName string `json:"username"` | ||||
| } | ||||
| 
 | ||||
| // 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"` | ||||
| 	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"` | ||||
| } | ||||
| 
 | ||||
| // Branch represents a repository branch
 | ||||
| type Branch struct { | ||||
| 	Name                          string         `json:"name"` | ||||
| 	Commit                        *PayloadCommit `json:"commit"` | ||||
| 	Protected                     bool           `json:"protected"` | ||||
| 	RequiredApprovals             int64          `json:"required_approvals"` | ||||
| 	EnableStatusCheck             bool           `json:"enable_status_check"` | ||||
| 	StatusCheckContexts           []string       `json:"status_check_contexts"` | ||||
| 	UserCanPush                   bool           `json:"user_can_push"` | ||||
| 	UserCanMerge                  bool           `json:"user_can_merge"` | ||||
| 	EffectiveBranchProtectionName string         `json:"effective_branch_protection_name"` | ||||
| } | ||||
| 
 | ||||
| // ListRepoBranchesOptions options for listing a repository's branches
 | ||||
| type ListRepoBranchesOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListRepoBranches list all the branches of one repository
 | ||||
| func (c *Client) ListRepoBranches(user, repo string, opt ListRepoBranchesOptions) ([]*Branch, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	branches := make([]*Branch, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/branches?%s", user, repo, opt.getURLQuery().Encode()), nil, nil, &branches) | ||||
| 	return branches, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetRepoBranch get one branch's information of one repository
 | ||||
| func (c *Client) GetRepoBranch(user, repo, branch string) (*Branch, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &branch); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	b := new(Branch) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/branches/%s", user, repo, branch), nil, nil, &b) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 	return b, resp, nil | ||||
| } | ||||
| 
 | ||||
| // DeleteRepoBranch delete a branch in a repository
 | ||||
| func (c *Client) DeleteRepoBranch(user, repo, branch string) (bool, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &branch); err != nil { | ||||
| 		return false, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return false, nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("DELETE", fmt.Sprintf("/repos/%s/%s/branches/%s", user, repo, branch), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return false, resp, err | ||||
| 	} | ||||
| 	return status == 204, resp, nil | ||||
| } | ||||
| 
 | ||||
| // CreateBranchOption options when creating a branch in a repository
 | ||||
| type CreateBranchOption struct { | ||||
| 	// Name of the branch to create
 | ||||
| 	BranchName string `json:"new_branch_name"` | ||||
| 	// Name of the old branch to create from (optional)
 | ||||
| 	OldBranchName string `json:"old_branch_name"` | ||||
| } | ||||
| 
 | ||||
| // Validate the CreateBranchOption struct
 | ||||
| func (opt CreateBranchOption) Validate() error { | ||||
| 	if len(opt.BranchName) == 0 { | ||||
| 		return fmt.Errorf("BranchName is empty") | ||||
| 	} | ||||
| 	if len(opt.BranchName) > 100 { | ||||
| 		return fmt.Errorf("BranchName to long") | ||||
| 	} | ||||
| 	if len(opt.OldBranchName) > 100 { | ||||
| 		return fmt.Errorf("OldBranchName to long") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateBranch creates a branch for a user's repository
 | ||||
| func (c *Client) CreateBranch(owner, repo string, opt CreateBranchOption) (*Branch, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	branch := new(Branch) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/branches", owner, repo), jsonHeader, bytes.NewReader(body), branch) | ||||
| 	return branch, resp, err | ||||
| } | ||||
							
								
								
									
										168
									
								
								vendor/code.gitea.io/sdk/gitea/repo_branch_protection.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										168
									
								
								vendor/code.gitea.io/sdk/gitea/repo_branch_protection.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,168 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // BranchProtection represents a branch protection for a repository
 | ||||
| type BranchProtection struct { | ||||
| 	BranchName                    string    `json:"branch_name"` | ||||
| 	EnablePush                    bool      `json:"enable_push"` | ||||
| 	EnablePushWhitelist           bool      `json:"enable_push_whitelist"` | ||||
| 	PushWhitelistUsernames        []string  `json:"push_whitelist_usernames"` | ||||
| 	PushWhitelistTeams            []string  `json:"push_whitelist_teams"` | ||||
| 	PushWhitelistDeployKeys       bool      `json:"push_whitelist_deploy_keys"` | ||||
| 	EnableMergeWhitelist          bool      `json:"enable_merge_whitelist"` | ||||
| 	MergeWhitelistUsernames       []string  `json:"merge_whitelist_usernames"` | ||||
| 	MergeWhitelistTeams           []string  `json:"merge_whitelist_teams"` | ||||
| 	EnableStatusCheck             bool      `json:"enable_status_check"` | ||||
| 	StatusCheckContexts           []string  `json:"status_check_contexts"` | ||||
| 	RequiredApprovals             int64     `json:"required_approvals"` | ||||
| 	EnableApprovalsWhitelist      bool      `json:"enable_approvals_whitelist"` | ||||
| 	ApprovalsWhitelistUsernames   []string  `json:"approvals_whitelist_username"` | ||||
| 	ApprovalsWhitelistTeams       []string  `json:"approvals_whitelist_teams"` | ||||
| 	BlockOnRejectedReviews        bool      `json:"block_on_rejected_reviews"` | ||||
| 	BlockOnOfficialReviewRequests bool      `json:"block_on_official_review_requests"` | ||||
| 	BlockOnOutdatedBranch         bool      `json:"block_on_outdated_branch"` | ||||
| 	DismissStaleApprovals         bool      `json:"dismiss_stale_approvals"` | ||||
| 	RequireSignedCommits          bool      `json:"require_signed_commits"` | ||||
| 	ProtectedFilePatterns         string    `json:"protected_file_patterns"` | ||||
| 	Created                       time.Time `json:"created_at"` | ||||
| 	Updated                       time.Time `json:"updated_at"` | ||||
| } | ||||
| 
 | ||||
| // CreateBranchProtectionOption options for creating a branch protection
 | ||||
| type CreateBranchProtectionOption struct { | ||||
| 	BranchName                    string   `json:"branch_name"` | ||||
| 	EnablePush                    bool     `json:"enable_push"` | ||||
| 	EnablePushWhitelist           bool     `json:"enable_push_whitelist"` | ||||
| 	PushWhitelistUsernames        []string `json:"push_whitelist_usernames"` | ||||
| 	PushWhitelistTeams            []string `json:"push_whitelist_teams"` | ||||
| 	PushWhitelistDeployKeys       bool     `json:"push_whitelist_deploy_keys"` | ||||
| 	EnableMergeWhitelist          bool     `json:"enable_merge_whitelist"` | ||||
| 	MergeWhitelistUsernames       []string `json:"merge_whitelist_usernames"` | ||||
| 	MergeWhitelistTeams           []string `json:"merge_whitelist_teams"` | ||||
| 	EnableStatusCheck             bool     `json:"enable_status_check"` | ||||
| 	StatusCheckContexts           []string `json:"status_check_contexts"` | ||||
| 	RequiredApprovals             int64    `json:"required_approvals"` | ||||
| 	EnableApprovalsWhitelist      bool     `json:"enable_approvals_whitelist"` | ||||
| 	ApprovalsWhitelistUsernames   []string `json:"approvals_whitelist_username"` | ||||
| 	ApprovalsWhitelistTeams       []string `json:"approvals_whitelist_teams"` | ||||
| 	BlockOnRejectedReviews        bool     `json:"block_on_rejected_reviews"` | ||||
| 	BlockOnOfficialReviewRequests bool     `json:"block_on_official_review_requests"` | ||||
| 	BlockOnOutdatedBranch         bool     `json:"block_on_outdated_branch"` | ||||
| 	DismissStaleApprovals         bool     `json:"dismiss_stale_approvals"` | ||||
| 	RequireSignedCommits          bool     `json:"require_signed_commits"` | ||||
| 	ProtectedFilePatterns         string   `json:"protected_file_patterns"` | ||||
| } | ||||
| 
 | ||||
| // EditBranchProtectionOption options for editing a branch protection
 | ||||
| type EditBranchProtectionOption struct { | ||||
| 	EnablePush                    *bool    `json:"enable_push"` | ||||
| 	EnablePushWhitelist           *bool    `json:"enable_push_whitelist"` | ||||
| 	PushWhitelistUsernames        []string `json:"push_whitelist_usernames"` | ||||
| 	PushWhitelistTeams            []string `json:"push_whitelist_teams"` | ||||
| 	PushWhitelistDeployKeys       *bool    `json:"push_whitelist_deploy_keys"` | ||||
| 	EnableMergeWhitelist          *bool    `json:"enable_merge_whitelist"` | ||||
| 	MergeWhitelistUsernames       []string `json:"merge_whitelist_usernames"` | ||||
| 	MergeWhitelistTeams           []string `json:"merge_whitelist_teams"` | ||||
| 	EnableStatusCheck             *bool    `json:"enable_status_check"` | ||||
| 	StatusCheckContexts           []string `json:"status_check_contexts"` | ||||
| 	RequiredApprovals             *int64   `json:"required_approvals"` | ||||
| 	EnableApprovalsWhitelist      *bool    `json:"enable_approvals_whitelist"` | ||||
| 	ApprovalsWhitelistUsernames   []string `json:"approvals_whitelist_username"` | ||||
| 	ApprovalsWhitelistTeams       []string `json:"approvals_whitelist_teams"` | ||||
| 	BlockOnRejectedReviews        *bool    `json:"block_on_rejected_reviews"` | ||||
| 	BlockOnOfficialReviewRequests *bool    `json:"block_on_official_review_requests"` | ||||
| 	BlockOnOutdatedBranch         *bool    `json:"block_on_outdated_branch"` | ||||
| 	DismissStaleApprovals         *bool    `json:"dismiss_stale_approvals"` | ||||
| 	RequireSignedCommits          *bool    `json:"require_signed_commits"` | ||||
| 	ProtectedFilePatterns         *string  `json:"protected_file_patterns"` | ||||
| } | ||||
| 
 | ||||
| // ListBranchProtectionsOptions list branch protection options
 | ||||
| type ListBranchProtectionsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListBranchProtections list branch protections for a repo
 | ||||
| func (c *Client) ListBranchProtections(owner, repo string, opt ListBranchProtectionsOptions) ([]*BranchProtection, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	bps := make([]*BranchProtection, 0, opt.PageSize) | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/branch_protections", owner, repo)) | ||||
| 	link.RawQuery = opt.getURLQuery().Encode() | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, &bps) | ||||
| 	return bps, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetBranchProtection gets a branch protection
 | ||||
| func (c *Client) GetBranchProtection(owner, repo, name string) (*BranchProtection, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &name); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	bp := new(BranchProtection) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/branch_protections/%s", owner, repo, name), jsonHeader, nil, bp) | ||||
| 	return bp, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateBranchProtection creates a branch protection for a repo
 | ||||
| func (c *Client) CreateBranchProtection(owner, repo string, opt CreateBranchProtectionOption) (*BranchProtection, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	bp := new(BranchProtection) | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/branch_protections", owner, repo), jsonHeader, bytes.NewReader(body), bp) | ||||
| 	return bp, resp, err | ||||
| } | ||||
| 
 | ||||
| // EditBranchProtection edits a branch protection for a repo
 | ||||
| func (c *Client) EditBranchProtection(owner, repo, name string, opt EditBranchProtectionOption) (*BranchProtection, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &name); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	bp := new(BranchProtection) | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	resp, err := c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/branch_protections/%s", owner, repo, name), jsonHeader, bytes.NewReader(body), bp) | ||||
| 	return bp, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteBranchProtection deletes a branch protection for a repo
 | ||||
| func (c *Client) DeleteBranchProtection(owner, repo, name string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &name); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/branch_protections/%s", owner, repo, name), jsonHeader, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										136
									
								
								vendor/code.gitea.io/sdk/gitea/repo_collaborator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										136
									
								
								vendor/code.gitea.io/sdk/gitea/repo_collaborator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,136 +0,0 @@ | ||||
| // Copyright 2021 The Gitea Authors. All rights reserved.
 | ||||
| // 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" | ||||
| ) | ||||
| 
 | ||||
| // ListCollaboratorsOptions options for listing a repository's collaborators
 | ||||
| type ListCollaboratorsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListCollaborators list a repository's collaborators
 | ||||
| func (c *Client) ListCollaborators(user, repo string, opt ListCollaboratorsOptions) ([]*User, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	collaborators := make([]*User, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", | ||||
| 		fmt.Sprintf("/repos/%s/%s/collaborators?%s", user, repo, opt.getURLQuery().Encode()), | ||||
| 		nil, nil, &collaborators) | ||||
| 	return collaborators, resp, err | ||||
| } | ||||
| 
 | ||||
| // IsCollaborator check if a user is a collaborator of a repository
 | ||||
| func (c *Client) IsCollaborator(user, repo, collaborator string) (bool, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &collaborator); err != nil { | ||||
| 		return false, nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("GET", fmt.Sprintf("/repos/%s/%s/collaborators/%s", user, repo, collaborator), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return false, resp, err | ||||
| 	} | ||||
| 	if status == 204 { | ||||
| 		return true, resp, nil | ||||
| 	} | ||||
| 	return false, resp, nil | ||||
| } | ||||
| 
 | ||||
| // AddCollaboratorOption options when adding a user as a collaborator of a repository
 | ||||
| type AddCollaboratorOption struct { | ||||
| 	Permission *AccessMode `json:"permission"` | ||||
| } | ||||
| 
 | ||||
| // AccessMode represent the grade of access you have to something
 | ||||
| type AccessMode string | ||||
| 
 | ||||
| const ( | ||||
| 	// AccessModeNone no access
 | ||||
| 	AccessModeNone AccessMode = "none" | ||||
| 	// AccessModeRead read access
 | ||||
| 	AccessModeRead AccessMode = "read" | ||||
| 	// AccessModeWrite write access
 | ||||
| 	AccessModeWrite AccessMode = "write" | ||||
| 	// AccessModeAdmin admin access
 | ||||
| 	AccessModeAdmin AccessMode = "admin" | ||||
| 	// AccessModeOwner owner
 | ||||
| 	AccessModeOwner AccessMode = "owner" | ||||
| ) | ||||
| 
 | ||||
| // Validate the AddCollaboratorOption struct
 | ||||
| func (opt AddCollaboratorOption) Validate() error { | ||||
| 	if opt.Permission != nil { | ||||
| 		if *opt.Permission == AccessModeOwner { | ||||
| 			*opt.Permission = AccessModeAdmin | ||||
| 			return nil | ||||
| 		} | ||||
| 		if *opt.Permission == AccessModeNone { | ||||
| 			opt.Permission = nil | ||||
| 			return nil | ||||
| 		} | ||||
| 		if *opt.Permission != AccessModeRead && *opt.Permission != AccessModeWrite && *opt.Permission != AccessModeAdmin { | ||||
| 			return fmt.Errorf("permission mode invalid") | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // AddCollaborator add some user as a collaborator of a repository
 | ||||
| func (c *Client) AddCollaborator(user, repo, collaborator string, opt AddCollaboratorOption) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &collaborator); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PUT", fmt.Sprintf("/repos/%s/%s/collaborators/%s", user, repo, collaborator), jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteCollaborator remove a collaborator from a repository
 | ||||
| func (c *Client) DeleteCollaborator(user, repo, collaborator string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &collaborator); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", | ||||
| 		fmt.Sprintf("/repos/%s/%s/collaborators/%s", user, repo, collaborator), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // GetReviewers return all users that can be requested to review in this repo
 | ||||
| func (c *Client) GetReviewers(user, repo string) ([]*User, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	reviewers := make([]*User, 0, 5) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/reviewers", user, repo), nil, nil, &reviewers) | ||||
| 	return reviewers, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetAssignees return all users that have write access and can be assigned to issues
 | ||||
| func (c *Client) GetAssignees(user, repo string) ([]*User, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	assignees := make([]*User, 0, 5) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/assignees", user, repo), nil, nil, &assignees) | ||||
| 	return assignees, resp, err | ||||
| } | ||||
							
								
								
									
										101
									
								
								vendor/code.gitea.io/sdk/gitea/repo_commit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										101
									
								
								vendor/code.gitea.io/sdk/gitea/repo_commit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,101 +0,0 @@ | ||||
| // 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" | ||||
| 	"net/url" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // Identity for a person's identity like an author or committer
 | ||||
| type Identity struct { | ||||
| 	Name  string `json:"name"` | ||||
| 	Email string `json:"email"` | ||||
| } | ||||
| 
 | ||||
| // CommitMeta contains meta information of a commit in terms of API.
 | ||||
| type CommitMeta struct { | ||||
| 	URL     string    `json:"url"` | ||||
| 	SHA     string    `json:"sha"` | ||||
| 	Created time.Time `json:"created"` | ||||
| } | ||||
| 
 | ||||
| // 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"` | ||||
| 	Files      []*CommitAffectedFiles `json:"files"` | ||||
| } | ||||
| 
 | ||||
| // CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE
 | ||||
| type CommitDateOptions struct { | ||||
| 	Author    time.Time `json:"author"` | ||||
| 	Committer time.Time `json:"committer"` | ||||
| } | ||||
| 
 | ||||
| // CommitAffectedFiles store information about files affected by the commit
 | ||||
| type CommitAffectedFiles struct { | ||||
| 	Filename string `json:"filename"` | ||||
| } | ||||
| 
 | ||||
| // GetSingleCommit returns a single commit
 | ||||
| func (c *Client) GetSingleCommit(user, repo, commitID string) (*Commit, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &commitID); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	commit := new(Commit) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/git/commits/%s", user, repo, commitID), nil, nil, &commit) | ||||
| 	return commit, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListCommitOptions list commit options
 | ||||
| type ListCommitOptions struct { | ||||
| 	ListOptions | ||||
| 	//SHA or branch to start listing commits from (usually 'master')
 | ||||
| 	SHA string | ||||
| } | ||||
| 
 | ||||
| // QueryEncode turns options into querystring argument
 | ||||
| func (opt *ListCommitOptions) QueryEncode() string { | ||||
| 	query := opt.ListOptions.getURLQuery() | ||||
| 	if opt.SHA != "" { | ||||
| 		query.Add("sha", opt.SHA) | ||||
| 	} | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| // ListRepoCommits return list of commits from a repo
 | ||||
| func (c *Client) ListRepoCommits(user, repo string, opt ListCommitOptions) ([]*Commit, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/commits", user, repo)) | ||||
| 	opt.setDefaults() | ||||
| 	commits := make([]*Commit, 0, opt.PageSize) | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), nil, nil, &commits) | ||||
| 	return commits, resp, err | ||||
| } | ||||
							
								
								
									
										247
									
								
								vendor/code.gitea.io/sdk/gitea/repo_file.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										247
									
								
								vendor/code.gitea.io/sdk/gitea/repo_file.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,247 +0,0 @@ | ||||
| // 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/json" | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // FileOptions options for all file APIs
 | ||||
| type FileOptions struct { | ||||
| 	// message (optional) for the commit of this file. if not supplied, a default message will be used
 | ||||
| 	Message string `json:"message"` | ||||
| 	// branch (optional) to base this file from. if not given, the default branch is used
 | ||||
| 	BranchName string `json:"branch"` | ||||
| 	// new_branch (optional) will make a new branch from `branch` before creating the file
 | ||||
| 	NewBranchName string `json:"new_branch"` | ||||
| 	// `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)
 | ||||
| 	Author    Identity          `json:"author"` | ||||
| 	Committer Identity          `json:"committer"` | ||||
| 	Dates     CommitDateOptions `json:"dates"` | ||||
| 	// Add a Signed-off-by trailer by the committer at the end of the commit log message.
 | ||||
| 	Signoff bool `json:"signoff"` | ||||
| } | ||||
| 
 | ||||
| // CreateFileOptions options for creating files
 | ||||
| // Note: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)
 | ||||
| type CreateFileOptions struct { | ||||
| 	FileOptions | ||||
| 	// content must be base64 encoded
 | ||||
| 	// required: true
 | ||||
| 	Content string `json:"content"` | ||||
| } | ||||
| 
 | ||||
| // DeleteFileOptions options for deleting files (used for other File structs below)
 | ||||
| // Note: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)
 | ||||
| type DeleteFileOptions struct { | ||||
| 	FileOptions | ||||
| 	// sha is the SHA for the file that already exists
 | ||||
| 	// required: true
 | ||||
| 	SHA string `json:"sha"` | ||||
| } | ||||
| 
 | ||||
| // UpdateFileOptions options for updating files
 | ||||
| // Note: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)
 | ||||
| type UpdateFileOptions struct { | ||||
| 	FileOptions | ||||
| 	// sha is the SHA for the file that already exists
 | ||||
| 	// required: true
 | ||||
| 	SHA string `json:"sha"` | ||||
| 	// content must be base64 encoded
 | ||||
| 	// required: true
 | ||||
| 	Content string `json:"content"` | ||||
| 	// from_path (optional) is the path of the original file which will be moved/renamed to the path in the URL
 | ||||
| 	FromPath string `json:"from_path"` | ||||
| } | ||||
| 
 | ||||
| // FileLinksResponse contains the links for a repo's file
 | ||||
| type FileLinksResponse struct { | ||||
| 	Self    *string `json:"self"` | ||||
| 	GitURL  *string `json:"git"` | ||||
| 	HTMLURL *string `json:"html"` | ||||
| } | ||||
| 
 | ||||
| // ContentsResponse contains information about a repo's entry's (dir, file, symlink, submodule) metadata and content
 | ||||
| type ContentsResponse struct { | ||||
| 	Name string `json:"name"` | ||||
| 	Path string `json:"path"` | ||||
| 	SHA  string `json:"sha"` | ||||
| 	// `type` will be `file`, `dir`, `symlink`, or `submodule`
 | ||||
| 	Type string `json:"type"` | ||||
| 	Size int64  `json:"size"` | ||||
| 	// `encoding` is populated when `type` is `file`, otherwise null
 | ||||
| 	Encoding *string `json:"encoding"` | ||||
| 	// `content` is populated when `type` is `file`, otherwise null
 | ||||
| 	Content *string `json:"content"` | ||||
| 	// `target` is populated when `type` is `symlink`, otherwise null
 | ||||
| 	Target      *string `json:"target"` | ||||
| 	URL         *string `json:"url"` | ||||
| 	HTMLURL     *string `json:"html_url"` | ||||
| 	GitURL      *string `json:"git_url"` | ||||
| 	DownloadURL *string `json:"download_url"` | ||||
| 	// `submodule_git_url` is populated when `type` is `submodule`, otherwise null
 | ||||
| 	SubmoduleGitURL *string            `json:"submodule_git_url"` | ||||
| 	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      *ContentsResponse          `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"` | ||||
| } | ||||
| 
 | ||||
| // GetFile downloads a file of repository, ref can be branch/tag/commit.
 | ||||
| // e.g.: ref -> master, filepath -> README.md (no leading slash)
 | ||||
| func (c *Client) GetFile(owner, repo, ref, filepath string) ([]byte, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	filepath = pathEscapeSegments(filepath) | ||||
| 	if c.checkServerVersionGreaterThanOrEqual(version1_14_0) != nil { | ||||
| 		ref = pathEscapeSegments(ref) | ||||
| 		return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s/%s", owner, repo, ref, filepath), nil, nil) | ||||
| 	} | ||||
| 	return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s?ref=%s", owner, repo, filepath, url.QueryEscape(ref)), nil, nil) | ||||
| } | ||||
| 
 | ||||
| // GetContents get the metadata and contents of a file in a repository
 | ||||
| // ref is optional
 | ||||
| func (c *Client) GetContents(owner, repo, ref, filepath string) (*ContentsResponse, *Response, error) { | ||||
| 	data, resp, err := c.getDirOrFileContents(owner, repo, ref, filepath) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 	cr := new(ContentsResponse) | ||||
| 	if json.Unmarshal(data, &cr) != nil { | ||||
| 		return nil, resp, fmt.Errorf("expect file, got directory") | ||||
| 	} | ||||
| 	return cr, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListContents gets a list of entries in a dir
 | ||||
| // ref is optional
 | ||||
| func (c *Client) ListContents(owner, repo, ref, filepath string) ([]*ContentsResponse, *Response, error) { | ||||
| 	data, resp, err := c.getDirOrFileContents(owner, repo, ref, filepath) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 	crl := make([]*ContentsResponse, 0) | ||||
| 	if json.Unmarshal(data, &crl) != nil { | ||||
| 		return nil, resp, fmt.Errorf("expect directory, got file") | ||||
| 	} | ||||
| 	return crl, resp, err | ||||
| } | ||||
| 
 | ||||
| func (c *Client) getDirOrFileContents(owner, repo, ref, filepath string) ([]byte, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	filepath = pathEscapeSegments(strings.TrimPrefix(filepath, "/")) | ||||
| 	return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/contents/%s?ref=%s", owner, repo, filepath, url.QueryEscape(ref)), jsonHeader, nil) | ||||
| } | ||||
| 
 | ||||
| // CreateFile create a file in a repository
 | ||||
| func (c *Client) CreateFile(owner, repo, filepath string, opt CreateFileOptions) (*FileResponse, *Response, error) { | ||||
| 	var err error | ||||
| 	if opt.BranchName, err = c.setDefaultBranchForOldVersions(owner, repo, opt.BranchName); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	filepath = pathEscapeSegments(filepath) | ||||
| 
 | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	fr := new(FileResponse) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/contents/%s", owner, repo, filepath), jsonHeader, bytes.NewReader(body), fr) | ||||
| 	return fr, resp, err | ||||
| } | ||||
| 
 | ||||
| // UpdateFile update a file in a repository
 | ||||
| func (c *Client) UpdateFile(owner, repo, filepath string, opt UpdateFileOptions) (*FileResponse, *Response, error) { | ||||
| 	var err error | ||||
| 	if opt.BranchName, err = c.setDefaultBranchForOldVersions(owner, repo, opt.BranchName); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	filepath = pathEscapeSegments(filepath) | ||||
| 
 | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	fr := new(FileResponse) | ||||
| 	resp, err := c.getParsedResponse("PUT", fmt.Sprintf("/repos/%s/%s/contents/%s", owner, repo, filepath), jsonHeader, bytes.NewReader(body), fr) | ||||
| 	return fr, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteFile delete a file from repository
 | ||||
| func (c *Client) DeleteFile(owner, repo, filepath string, opt DeleteFileOptions) (*Response, error) { | ||||
| 	var err error | ||||
| 	if opt.BranchName, err = c.setDefaultBranchForOldVersions(owner, repo, opt.BranchName); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	filepath = pathEscapeSegments(filepath) | ||||
| 
 | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("DELETE", fmt.Sprintf("/repos/%s/%s/contents/%s", owner, repo, filepath), jsonHeader, bytes.NewReader(body)) | ||||
| 	if err != nil { | ||||
| 		return resp, err | ||||
| 	} | ||||
| 	if status != 200 && status != 204 { | ||||
| 		return resp, fmt.Errorf("unexpected Status: %d", status) | ||||
| 	} | ||||
| 	return resp, nil | ||||
| } | ||||
| 
 | ||||
| func (c *Client) setDefaultBranchForOldVersions(owner, repo, branch string) (string, error) { | ||||
| 	if len(branch) == 0 { | ||||
| 		// Gitea >= 1.12.0 Use DefaultBranch on "", mimic this for older versions
 | ||||
| 		if c.checkServerVersionGreaterThanOrEqual(version1_12_0) != nil { | ||||
| 			r, _, err := c.GetRepo(owner, repo) | ||||
| 			if err != nil { | ||||
| 				return "", err | ||||
| 			} | ||||
| 			return r.DefaultBranch, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return branch, nil | ||||
| } | ||||
							
								
								
									
										91
									
								
								vendor/code.gitea.io/sdk/gitea/repo_key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										91
									
								
								vendor/code.gitea.io/sdk/gitea/repo_key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,91 +0,0 @@ | ||||
| // 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" | ||||
| 	"net/url" | ||||
| 	"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"` | ||||
| 	Created     time.Time   `json:"created_at"` | ||||
| 	ReadOnly    bool        `json:"read_only"` | ||||
| 	Repository  *Repository `json:"repository,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // ListDeployKeysOptions options for listing a repository's deploy keys
 | ||||
| type ListDeployKeysOptions struct { | ||||
| 	ListOptions | ||||
| 	KeyID       int64 | ||||
| 	Fingerprint string | ||||
| } | ||||
| 
 | ||||
| // QueryEncode turns options into querystring argument
 | ||||
| func (opt *ListDeployKeysOptions) QueryEncode() string { | ||||
| 	query := opt.getURLQuery() | ||||
| 	if opt.KeyID > 0 { | ||||
| 		query.Add("key_id", fmt.Sprintf("%d", opt.KeyID)) | ||||
| 	} | ||||
| 	if len(opt.Fingerprint) > 0 { | ||||
| 		query.Add("fingerprint", opt.Fingerprint) | ||||
| 	} | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| // ListDeployKeys list all the deploy keys of one repository
 | ||||
| func (c *Client) ListDeployKeys(user, repo string, opt ListDeployKeysOptions) ([]*DeployKey, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/keys", user, repo)) | ||||
| 	opt.setDefaults() | ||||
| 	link.RawQuery = opt.QueryEncode() | ||||
| 	keys := make([]*DeployKey, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), nil, nil, &keys) | ||||
| 	return keys, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetDeployKey get one deploy key with key id
 | ||||
| func (c *Client) GetDeployKey(user, repo string, keyID int64) (*DeployKey, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	key := new(DeployKey) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/keys/%d", user, repo, keyID), nil, nil, &key) | ||||
| 	return key, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateDeployKey options when create one deploy key
 | ||||
| func (c *Client) CreateDeployKey(user, repo string, opt CreateKeyOption) (*DeployKey, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	key := new(DeployKey) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/keys", user, repo), jsonHeader, bytes.NewReader(body), key) | ||||
| 	return key, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteDeployKey delete deploy key with key id
 | ||||
| func (c *Client) DeleteDeployKey(owner, repo string, keyID int64) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/keys/%d", owner, repo, keyID), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										132
									
								
								vendor/code.gitea.io/sdk/gitea/repo_migrate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										132
									
								
								vendor/code.gitea.io/sdk/gitea/repo_migrate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,132 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
| 
 | ||||
| // GitServiceType represents a git service
 | ||||
| type GitServiceType string | ||||
| 
 | ||||
| const ( | ||||
| 	// GitServicePlain represents a plain git service
 | ||||
| 	GitServicePlain GitServiceType = "git" | ||||
| 	//GitServiceGithub represents github.com
 | ||||
| 	GitServiceGithub GitServiceType = "github" | ||||
| 	// GitServiceGitlab represents a gitlab service
 | ||||
| 	GitServiceGitlab GitServiceType = "gitlab" | ||||
| 	// GitServiceGitea represents a gitea service
 | ||||
| 	GitServiceGitea GitServiceType = "gitea" | ||||
| 	// GitServiceGogs represents a gogs service
 | ||||
| 	GitServiceGogs GitServiceType = "gogs" | ||||
| ) | ||||
| 
 | ||||
| // MigrateRepoOption options for migrating a repository from an external service
 | ||||
| type MigrateRepoOption struct { | ||||
| 	RepoName  string `json:"repo_name"` | ||||
| 	RepoOwner string `json:"repo_owner"` | ||||
| 	// deprecated use RepoOwner
 | ||||
| 	RepoOwnerID    int64          `json:"uid"` | ||||
| 	CloneAddr      string         `json:"clone_addr"` | ||||
| 	Service        GitServiceType `json:"service"` | ||||
| 	AuthUsername   string         `json:"auth_username"` | ||||
| 	AuthPassword   string         `json:"auth_password"` | ||||
| 	AuthToken      string         `json:"auth_token"` | ||||
| 	Mirror         bool           `json:"mirror"` | ||||
| 	Private        bool           `json:"private"` | ||||
| 	Description    string         `json:"description"` | ||||
| 	Wiki           bool           `json:"wiki"` | ||||
| 	Milestones     bool           `json:"milestones"` | ||||
| 	Labels         bool           `json:"labels"` | ||||
| 	Issues         bool           `json:"issues"` | ||||
| 	PullRequests   bool           `json:"pull_requests"` | ||||
| 	Releases       bool           `json:"releases"` | ||||
| 	MirrorInterval string         `json:"mirror_interval"` | ||||
| 	LFS            bool           `json:"lfs"` | ||||
| 	LFSEndpoint    string         `json:"lfs_endpoint"` | ||||
| } | ||||
| 
 | ||||
| // Validate the MigrateRepoOption struct
 | ||||
| func (opt *MigrateRepoOption) Validate(c *Client) error { | ||||
| 	// check user options
 | ||||
| 	if len(opt.CloneAddr) == 0 { | ||||
| 		return fmt.Errorf("CloneAddr required") | ||||
| 	} | ||||
| 	if len(opt.RepoName) == 0 { | ||||
| 		return fmt.Errorf("RepoName required") | ||||
| 	} else if len(opt.RepoName) > 100 { | ||||
| 		return fmt.Errorf("RepoName to long") | ||||
| 	} | ||||
| 	if len(opt.Description) > 255 { | ||||
| 		return fmt.Errorf("Description to long") | ||||
| 	} | ||||
| 	switch opt.Service { | ||||
| 	case GitServiceGithub: | ||||
| 		if len(opt.AuthToken) == 0 { | ||||
| 			return fmt.Errorf("github requires token authentication") | ||||
| 		} | ||||
| 	case GitServiceGitlab, GitServiceGitea: | ||||
| 		if len(opt.AuthToken) == 0 { | ||||
| 			return fmt.Errorf("%s requires token authentication", opt.Service) | ||||
| 		} | ||||
| 		// Gitlab is supported since 1.12.0 but api cant handle it until 1.13.0
 | ||||
| 		// https://github.com/go-gitea/gitea/pull/12672
 | ||||
| 		if c.checkServerVersionGreaterThanOrEqual(version1_13_0) != nil { | ||||
| 			return fmt.Errorf("migrate from service %s need gitea >= 1.13.0", opt.Service) | ||||
| 		} | ||||
| 	case GitServiceGogs: | ||||
| 		if len(opt.AuthToken) == 0 { | ||||
| 			return fmt.Errorf("gogs requires token authentication") | ||||
| 		} | ||||
| 		if c.checkServerVersionGreaterThanOrEqual(version1_14_0) != nil { | ||||
| 			return fmt.Errorf("migrate from service gogs need gitea >= 1.14.0") | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // 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, *Response, error) { | ||||
| 	if err := opt.Validate(c); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | ||||
| 		if len(opt.AuthToken) != 0 { | ||||
| 			// gitea <= 1.12 dont understand AuthToken
 | ||||
| 			opt.AuthUsername = opt.AuthToken | ||||
| 			opt.AuthPassword, opt.AuthToken = "", "" | ||||
| 		} | ||||
| 		if len(opt.RepoOwner) != 0 { | ||||
| 			// gitea <= 1.12 dont understand RepoOwner
 | ||||
| 			u, _, err := c.GetUserInfo(opt.RepoOwner) | ||||
| 			if err != nil { | ||||
| 				return nil, nil, err | ||||
| 			} | ||||
| 			opt.RepoOwnerID = u.ID | ||||
| 		} else if opt.RepoOwnerID == 0 { | ||||
| 			// gitea <= 1.12 require RepoOwnerID
 | ||||
| 			u, _, err := c.GetMyUserInfo() | ||||
| 			if err != nil { | ||||
| 				return nil, nil, err | ||||
| 			} | ||||
| 			opt.RepoOwnerID = u.ID | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	repo := new(Repository) | ||||
| 	resp, err := c.getParsedResponse("POST", "/repos/migrate", jsonHeader, bytes.NewReader(body), repo) | ||||
| 	return repo, resp, err | ||||
| } | ||||
							
								
								
									
										78
									
								
								vendor/code.gitea.io/sdk/gitea/repo_refs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								vendor/code.gitea.io/sdk/gitea/repo_refs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,78 +0,0 @@ | ||||
| // 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, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	ref = strings.TrimPrefix(ref, "refs/") | ||||
| 	ref = pathEscapeSegments(ref) | ||||
| 	r := new(Reference) | ||||
| 	resp, 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, resp, errors.New("no exact match found for this ref") | ||||
| 	} else if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 
 | ||||
| 	return r, resp, nil | ||||
| } | ||||
| 
 | ||||
| // GetRepoRefs get list of ref's information of one repository
 | ||||
| func (c *Client) GetRepoRefs(user, repo, ref string) ([]*Reference, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	ref = strings.TrimPrefix(ref, "refs/") | ||||
| 	ref = pathEscapeSegments(ref) | ||||
| 
 | ||||
| 	data, resp, err := c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/git/refs/%s", user, repo, ref), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 
 | ||||
| 	// Attempt to unmarshal single returned ref.
 | ||||
| 	r := new(Reference) | ||||
| 	refErr := json.Unmarshal(data, r) | ||||
| 	if refErr == nil { | ||||
| 		return []*Reference{r}, resp, nil | ||||
| 	} | ||||
| 
 | ||||
| 	// Attempt to unmarshal multiple refs.
 | ||||
| 	var rs []*Reference | ||||
| 	refsErr := json.Unmarshal(data, &rs) | ||||
| 	if refsErr == nil { | ||||
| 		if len(rs) == 0 { | ||||
| 			return nil, resp, errors.New("unexpected response: an array of refs with length 0") | ||||
| 		} | ||||
| 		return rs, resp, nil | ||||
| 	} | ||||
| 
 | ||||
| 	return nil, resp, fmt.Errorf("unmarshalling failed for both single and multiple refs: %s and %s", refErr, refsErr) | ||||
| } | ||||
							
								
								
									
										96
									
								
								vendor/code.gitea.io/sdk/gitea/repo_stars.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										96
									
								
								vendor/code.gitea.io/sdk/gitea/repo_stars.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,96 +0,0 @@ | ||||
| // Copyright 2021 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" | ||||
| ) | ||||
| 
 | ||||
| // ListStargazersOptions options for listing a repository's stargazers
 | ||||
| type ListStargazersOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListRepoStargazers list a repository's stargazers
 | ||||
| func (c *Client) ListRepoStargazers(user, repo string, opt ListStargazersOptions) ([]*User, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	stargazers := make([]*User, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/stargazers?%s", user, repo, opt.getURLQuery().Encode()), nil, nil, &stargazers) | ||||
| 	return stargazers, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetStarredRepos returns the repos that the given user has starred
 | ||||
| func (c *Client) GetStarredRepos(user string) ([]*Repository, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	repos := make([]*Repository, 0, 10) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/users/%s/starred", user), jsonHeader, nil, &repos) | ||||
| 	return repos, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetMyStarredRepos returns the repos that the authenticated user has starred
 | ||||
| func (c *Client) GetMyStarredRepos() ([]*Repository, *Response, error) { | ||||
| 	repos := make([]*Repository, 0, 10) | ||||
| 	resp, err := c.getParsedResponse("GET", "/user/starred", jsonHeader, nil, &repos) | ||||
| 	return repos, resp, err | ||||
| } | ||||
| 
 | ||||
| // IsRepoStarring returns whether the authenticated user has starred the repo or not
 | ||||
| func (c *Client) IsRepoStarring(user, repo string) (bool, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return false, nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("GET", fmt.Sprintf("/user/starred/%s/%s", user, repo), jsonHeader, nil) | ||||
| 	if resp != nil { | ||||
| 		switch resp.StatusCode { | ||||
| 		case http.StatusNotFound: | ||||
| 			return false, resp, nil | ||||
| 		case http.StatusNoContent: | ||||
| 			return true, resp, nil | ||||
| 		default: | ||||
| 			return false, resp, fmt.Errorf("unexpected status code '%d'", resp.StatusCode) | ||||
| 		} | ||||
| 	} | ||||
| 	return false, nil, err | ||||
| } | ||||
| 
 | ||||
| // StarRepo star specified repo as the authenticated user
 | ||||
| func (c *Client) StarRepo(user, repo string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PUT", fmt.Sprintf("/user/starred/%s/%s", user, repo), jsonHeader, nil) | ||||
| 	if resp != nil { | ||||
| 		switch resp.StatusCode { | ||||
| 		case http.StatusNoContent: | ||||
| 			return resp, nil | ||||
| 		default: | ||||
| 			return resp, fmt.Errorf("unexpected status code '%d'", resp.StatusCode) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, err | ||||
| } | ||||
| 
 | ||||
| // UnStarRepo remove star to specified repo as the authenticated user
 | ||||
| func (c *Client) UnStarRepo(user, repo string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/user/starred/%s/%s", user, repo), jsonHeader, nil) | ||||
| 	if resp != nil { | ||||
| 		switch resp.StatusCode { | ||||
| 		case http.StatusNoContent: | ||||
| 			return resp, nil | ||||
| 		default: | ||||
| 			return resp, fmt.Errorf("unexpected status code '%d'", resp.StatusCode) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, err | ||||
| } | ||||
							
								
								
									
										130
									
								
								vendor/code.gitea.io/sdk/gitea/repo_tag.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										130
									
								
								vendor/code.gitea.io/sdk/gitea/repo_tag.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,130 +0,0 @@ | ||||
| // 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" | ||||
| ) | ||||
| 
 | ||||
| // Tag represents a repository tag
 | ||||
| type Tag struct { | ||||
| 	Name       string      `json:"name"` | ||||
| 	Message    string      `json:"message"` | ||||
| 	ID         string      `json:"id"` | ||||
| 	Commit     *CommitMeta `json:"commit"` | ||||
| 	ZipballURL string      `json:"zipball_url"` | ||||
| 	TarballURL string      `json:"tarball_url"` | ||||
| } | ||||
| 
 | ||||
| // AnnotatedTag represents an annotated tag
 | ||||
| type AnnotatedTag struct { | ||||
| 	Tag          string                     `json:"tag"` | ||||
| 	SHA          string                     `json:"sha"` | ||||
| 	URL          string                     `json:"url"` | ||||
| 	Message      string                     `json:"message"` | ||||
| 	Tagger       *CommitUser                `json:"tagger"` | ||||
| 	Object       *AnnotatedTagObject        `json:"object"` | ||||
| 	Verification *PayloadCommitVerification `json:"verification"` | ||||
| } | ||||
| 
 | ||||
| // AnnotatedTagObject contains meta information of the tag object
 | ||||
| type AnnotatedTagObject struct { | ||||
| 	Type string `json:"type"` | ||||
| 	URL  string `json:"url"` | ||||
| 	SHA  string `json:"sha"` | ||||
| } | ||||
| 
 | ||||
| // ListRepoTagsOptions options for listing a repository's tags
 | ||||
| type ListRepoTagsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListRepoTags list all the branches of one repository
 | ||||
| func (c *Client) ListRepoTags(user, repo string, opt ListRepoTagsOptions) ([]*Tag, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	tags := make([]*Tag, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/tags?%s", user, repo, opt.getURLQuery().Encode()), nil, nil, &tags) | ||||
| 	return tags, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetTag get the tag of a repository
 | ||||
| func (c *Client) GetTag(user, repo, tag string) (*Tag, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &tag); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	t := new(Tag) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/tags/%s", user, repo, tag), nil, nil, &t) | ||||
| 	return t, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetAnnotatedTag get the tag object of an annotated tag (not lightweight tags) of a repository
 | ||||
| func (c *Client) GetAnnotatedTag(user, repo, sha string) (*AnnotatedTag, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &sha); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	t := new(AnnotatedTag) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/git/tags/%s", user, repo, sha), nil, nil, &t) | ||||
| 	return t, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateTagOption options when creating a tag
 | ||||
| type CreateTagOption struct { | ||||
| 	TagName string `json:"tag_name"` | ||||
| 	Message string `json:"message"` | ||||
| 	Target  string `json:"target"` | ||||
| } | ||||
| 
 | ||||
| // Validate validates CreateTagOption
 | ||||
| func (opt CreateTagOption) Validate() error { | ||||
| 	if len(opt.TagName) == 0 { | ||||
| 		return fmt.Errorf("TagName is required") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateTag create a new git tag in a repository
 | ||||
| func (c *Client) CreateTag(user, repo string, opt CreateTagOption) (*Tag, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	t := new(Tag) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/tags", user, repo), jsonHeader, bytes.NewReader(body), &t) | ||||
| 	return t, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteTag deletes a tag from a repository, if no release refers to it
 | ||||
| func (c *Client) DeleteTag(user, repo, tag string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &tag); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_14_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", | ||||
| 		fmt.Sprintf("/repos/%s/%s/tags/%s", user, repo, tag), | ||||
| 		nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										65
									
								
								vendor/code.gitea.io/sdk/gitea/repo_team.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								vendor/code.gitea.io/sdk/gitea/repo_team.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,65 +0,0 @@ | ||||
| // Copyright 2021 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" | ||||
| ) | ||||
| 
 | ||||
| // GetRepoTeams return teams from a repository
 | ||||
| func (c *Client) GetRepoTeams(user, repo string) ([]*Team, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	teams := make([]*Team, 0, 5) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/teams", user, repo), nil, nil, &teams) | ||||
| 	return teams, resp, err | ||||
| } | ||||
| 
 | ||||
| // AddRepoTeam add a team to a repository
 | ||||
| func (c *Client) AddRepoTeam(user, repo, team string) (*Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &team); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PUT", fmt.Sprintf("/repos/%s/%s/teams/%s", user, repo, team), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // RemoveRepoTeam delete a team from a repository
 | ||||
| func (c *Client) RemoveRepoTeam(user, repo, team string) (*Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &team); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/teams/%s", user, repo, team), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // CheckRepoTeam check if team is assigned to repo by name and return it.
 | ||||
| // If not assigned, it will return nil.
 | ||||
| func (c *Client) CheckRepoTeam(user, repo, team string) (*Team, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &team); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	t := new(Team) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/teams/%s", user, repo, team), nil, nil, &t) | ||||
| 	if resp != nil && resp.StatusCode == http.StatusNotFound { | ||||
| 		// if not found it's not an error, it indicates it's not assigned
 | ||||
| 		return nil, resp, nil | ||||
| 	} | ||||
| 	return t, resp, err | ||||
| } | ||||
							
								
								
									
										65
									
								
								vendor/code.gitea.io/sdk/gitea/repo_template.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								vendor/code.gitea.io/sdk/gitea/repo_template.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,65 +0,0 @@ | ||||
| // Copyright 2021 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" | ||||
| ) | ||||
| 
 | ||||
| // CreateRepoFromTemplateOption options when creating repository using a template
 | ||||
| type CreateRepoFromTemplateOption struct { | ||||
| 	// Owner is the organization or person who will own the new repository
 | ||||
| 	Owner string `json:"owner"` | ||||
| 	// Name of the repository to create
 | ||||
| 	Name string `json:"name"` | ||||
| 	// Description of the repository to create
 | ||||
| 	Description string `json:"description"` | ||||
| 	// Private is whether the repository is private
 | ||||
| 	Private bool `json:"private"` | ||||
| 	// GitContent include git content of default branch in template repo
 | ||||
| 	GitContent bool `json:"git_content"` | ||||
| 	// Topics include topics of template repo
 | ||||
| 	Topics bool `json:"topics"` | ||||
| 	// GitHooks include git hooks of template repo
 | ||||
| 	GitHooks bool `json:"git_hooks"` | ||||
| 	// Webhooks include webhooks of template repo
 | ||||
| 	Webhooks bool `json:"webhooks"` | ||||
| 	// Avatar include avatar of the template repo
 | ||||
| 	Avatar bool `json:"avatar"` | ||||
| 	// Labels include labels of template repo
 | ||||
| 	Labels bool `json:"labels"` | ||||
| } | ||||
| 
 | ||||
| // Validate validates CreateRepoFromTemplateOption
 | ||||
| func (opt CreateRepoFromTemplateOption) Validate() error { | ||||
| 	if len(opt.Owner) == 0 { | ||||
| 		return fmt.Errorf("field Owner is required") | ||||
| 	} | ||||
| 	if len(opt.Name) == 0 { | ||||
| 		return fmt.Errorf("field Name is required") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CreateRepoFromTemplate create a repository using a template
 | ||||
| func (c *Client) CreateRepoFromTemplate(templateOwner, templateRepo string, opt CreateRepoFromTemplateOption) (*Repository, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&templateOwner, &templateRepo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	if err := opt.Validate(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	repo := new(Repository) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/generate", templateOwner, templateRepo), jsonHeader, bytes.NewReader(body), &repo) | ||||
| 	return repo, resp, err | ||||
| } | ||||
							
								
								
									
										68
									
								
								vendor/code.gitea.io/sdk/gitea/repo_topics.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										68
									
								
								vendor/code.gitea.io/sdk/gitea/repo_topics.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,68 +0,0 @@ | ||||
| // 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" | ||||
| ) | ||||
| 
 | ||||
| // ListRepoTopicsOptions options for listing repo's topics
 | ||||
| type ListRepoTopicsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // topicsList represents a list of repo's topics
 | ||||
| type topicsList struct { | ||||
| 	Topics []string `json:"topics"` | ||||
| } | ||||
| 
 | ||||
| // ListRepoTopics list all repository's topics
 | ||||
| func (c *Client) ListRepoTopics(user, repo string, opt ListRepoTopicsOptions) ([]string, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 
 | ||||
| 	list := new(topicsList) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/topics?%s", user, repo, opt.getURLQuery().Encode()), nil, nil, list) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 	return list.Topics, resp, nil | ||||
| } | ||||
| 
 | ||||
| // SetRepoTopics replaces the list of repo's topics
 | ||||
| func (c *Client) SetRepoTopics(user, repo string, list []string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	l := topicsList{Topics: list} | ||||
| 	body, err := json.Marshal(&l) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PUT", fmt.Sprintf("/repos/%s/%s/topics", user, repo), jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // AddRepoTopic adds a topic to a repo's topics list
 | ||||
| func (c *Client) AddRepoTopic(user, repo, topic string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &topic); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PUT", fmt.Sprintf("/repos/%s/%s/topics/%s", user, repo, topic), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteRepoTopic deletes a topic from repo's topics list
 | ||||
| func (c *Client) DeleteRepoTopic(user, repo, topic string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &topic); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/topics/%s", user, repo, topic), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										36
									
								
								vendor/code.gitea.io/sdk/gitea/repo_transfer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								vendor/code.gitea.io/sdk/gitea/repo_transfer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,36 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
| 
 | ||||
| // TransferRepoOption options when transfer a repository's ownership
 | ||||
| type TransferRepoOption struct { | ||||
| 	// required: true
 | ||||
| 	NewOwner string `json:"new_owner"` | ||||
| 	// ID of the team or teams to add to the repository. Teams can only be added to organization-owned repositories.
 | ||||
| 	TeamIDs *[]int64 `json:"team_ids"` | ||||
| } | ||||
| 
 | ||||
| // TransferRepo transfers the ownership of a repository
 | ||||
| func (c *Client) TransferRepo(owner, reponame string, opt TransferRepoOption) (*Repository, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &reponame); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	repo := new(Repository) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/transfer", owner, reponame), jsonHeader, bytes.NewReader(body), repo) | ||||
| 	return repo, resp, err | ||||
| } | ||||
							
								
								
									
										44
									
								
								vendor/code.gitea.io/sdk/gitea/repo_tree.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								vendor/code.gitea.io/sdk/gitea/repo_tree.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,44 +0,0 @@ | ||||
| // 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, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user, &repo, &ref); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	trees := new(GitTreeResponse) | ||||
| 	var path = fmt.Sprintf("/repos/%s/%s/git/trees/%s", user, repo, ref) | ||||
| 	if recursive { | ||||
| 		path += "?recursive=1" | ||||
| 	} | ||||
| 	resp, err := c.getParsedResponse("GET", path, nil, nil, trees) | ||||
| 	return trees, resp, err | ||||
| } | ||||
							
								
								
									
										87
									
								
								vendor/code.gitea.io/sdk/gitea/repo_watch.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										87
									
								
								vendor/code.gitea.io/sdk/gitea/repo_watch.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,87 +0,0 @@ | ||||
| // 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 string) ([]*Repository, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	repos := make([]*Repository, 0, 10) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/users/%s/subscriptions", user), nil, nil, &repos) | ||||
| 	return repos, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetMyWatchedRepos list repositories watched by the authenticated user
 | ||||
| func (c *Client) GetMyWatchedRepos() ([]*Repository, *Response, error) { | ||||
| 	repos := make([]*Repository, 0, 10) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/subscriptions"), nil, nil, &repos) | ||||
| 	return repos, resp, err | ||||
| } | ||||
| 
 | ||||
| // CheckRepoWatch check if the current user is watching a repo
 | ||||
| func (c *Client) CheckRepoWatch(owner, repo string) (bool, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return false, nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("GET", fmt.Sprintf("/repos/%s/%s/subscription", owner, repo), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return false, resp, err | ||||
| 	} | ||||
| 	switch status { | ||||
| 	case http.StatusNotFound: | ||||
| 		return false, resp, nil | ||||
| 	case http.StatusOK: | ||||
| 		return true, resp, nil | ||||
| 	default: | ||||
| 		return false, resp, fmt.Errorf("unexpected Status: %d", status) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // WatchRepo start to watch a repository
 | ||||
| func (c *Client) WatchRepo(owner, repo string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("PUT", fmt.Sprintf("/repos/%s/%s/subscription", owner, repo), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return resp, err | ||||
| 	} | ||||
| 	if status == http.StatusOK { | ||||
| 		return resp, nil | ||||
| 	} | ||||
| 	return resp, fmt.Errorf("unexpected Status: %d", status) | ||||
| } | ||||
| 
 | ||||
| // UnWatchRepo stop to watch a repository
 | ||||
| func (c *Client) UnWatchRepo(owner, repo string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	status, resp, err := c.getStatusCode("DELETE", fmt.Sprintf("/repos/%s/%s/subscription", owner, repo), nil, nil) | ||||
| 	if err != nil { | ||||
| 		return resp, err | ||||
| 	} | ||||
| 	if status == http.StatusNoContent { | ||||
| 		return resp, nil | ||||
| 	} | ||||
| 	return resp, fmt.Errorf("unexpected Status: %d", status) | ||||
| } | ||||
							
								
								
									
										78
									
								
								vendor/code.gitea.io/sdk/gitea/settings.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								vendor/code.gitea.io/sdk/gitea/settings.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,78 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| // GlobalUISettings represent the global ui settings of a gitea instance witch is exposed by API
 | ||||
| type GlobalUISettings struct { | ||||
| 	DefaultTheme     string   `json:"default_theme"` | ||||
| 	AllowedReactions []string `json:"allowed_reactions"` | ||||
| 	CustomEmojis     []string `json:"custom_emojis"` | ||||
| } | ||||
| 
 | ||||
| // GlobalRepoSettings represent the global repository settings of a gitea instance witch is exposed by API
 | ||||
| type GlobalRepoSettings struct { | ||||
| 	MirrorsDisabled      bool `json:"mirrors_disabled"` | ||||
| 	HTTPGitDisabled      bool `json:"http_git_disabled"` | ||||
| 	MigrationsDisabled   bool `json:"migrations_disabled"` | ||||
| 	StarsDisabled        bool `json:"stars_disabled"` | ||||
| 	TimeTrackingDisabled bool `json:"time_tracking_disabled"` | ||||
| 	LFSDisabled          bool `json:"lfs_disabled"` | ||||
| } | ||||
| 
 | ||||
| // GlobalAPISettings contains global api settings exposed by it
 | ||||
| type GlobalAPISettings struct { | ||||
| 	MaxResponseItems       int   `json:"max_response_items"` | ||||
| 	DefaultPagingNum       int   `json:"default_paging_num"` | ||||
| 	DefaultGitTreesPerPage int   `json:"default_git_trees_per_page"` | ||||
| 	DefaultMaxBlobSize     int64 `json:"default_max_blob_size"` | ||||
| } | ||||
| 
 | ||||
| // GlobalAttachmentSettings contains global Attachment settings exposed by API
 | ||||
| type GlobalAttachmentSettings struct { | ||||
| 	Enabled      bool   `json:"enabled"` | ||||
| 	AllowedTypes string `json:"allowed_types"` | ||||
| 	MaxSize      int64  `json:"max_size"` | ||||
| 	MaxFiles     int    `json:"max_files"` | ||||
| } | ||||
| 
 | ||||
| // GetGlobalUISettings get global ui settings witch are exposed by API
 | ||||
| func (c *Client) GetGlobalUISettings() (*GlobalUISettings, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	conf := new(GlobalUISettings) | ||||
| 	resp, err := c.getParsedResponse("GET", "/settings/ui", jsonHeader, nil, &conf) | ||||
| 	return conf, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetGlobalRepoSettings get global repository settings witch are exposed by API
 | ||||
| func (c *Client) GetGlobalRepoSettings() (*GlobalRepoSettings, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	conf := new(GlobalRepoSettings) | ||||
| 	resp, err := c.getParsedResponse("GET", "/settings/repository", jsonHeader, nil, &conf) | ||||
| 	return conf, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetGlobalAPISettings get global api settings witch are exposed by it
 | ||||
| func (c *Client) GetGlobalAPISettings() (*GlobalAPISettings, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	conf := new(GlobalAPISettings) | ||||
| 	resp, err := c.getParsedResponse("GET", "/settings/api", jsonHeader, nil, &conf) | ||||
| 	return conf, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetGlobalAttachmentSettings get global repository settings witch are exposed by API
 | ||||
| func (c *Client) GetGlobalAttachmentSettings() (*GlobalAttachmentSettings, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	conf := new(GlobalAttachmentSettings) | ||||
| 	resp, err := c.getParsedResponse("GET", "/settings/attachment", jsonHeader, nil, &conf) | ||||
| 	return conf, resp, err | ||||
| } | ||||
							
								
								
									
										108
									
								
								vendor/code.gitea.io/sdk/gitea/status.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										108
									
								
								vendor/code.gitea.io/sdk/gitea/status.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,108 +0,0 @@ | ||||
| // 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" | ||||
| 	"net/url" | ||||
| 	"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"` | ||||
| 	Created     time.Time   `json:"created_at"` | ||||
| 	Updated     time.Time   `json:"updated_at"` | ||||
| } | ||||
| 
 | ||||
| // 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"` | ||||
| } | ||||
| 
 | ||||
| // CreateStatus creates a new Status for a given Commit
 | ||||
| func (c *Client) CreateStatus(owner, repo, sha string, opts CreateStatusOption) (*Status, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opts) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	status := new(Status) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/statuses/%s", owner, repo, url.QueryEscape(sha)), jsonHeader, bytes.NewReader(body), status) | ||||
| 	return status, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListStatusesOption options for listing a repository's commit's statuses
 | ||||
| type ListStatusesOption struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListStatuses returns all statuses for a given Commit by ref
 | ||||
| func (c *Client) ListStatuses(owner, repo, ref string, opt ListStatusesOption) ([]*Status, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &ref); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	statuses := make([]*Status, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/commits/%s/statuses?%s", owner, repo, ref, opt.getURLQuery().Encode()), jsonHeader, nil, &statuses) | ||||
| 	return statuses, resp, err | ||||
| } | ||||
| 
 | ||||
| // 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"` | ||||
| } | ||||
| 
 | ||||
| // GetCombinedStatus returns the CombinedStatus for a given Commit
 | ||||
| func (c *Client) GetCombinedStatus(owner, repo, ref string) (*CombinedStatus, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&owner, &repo, &ref); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	status := new(CombinedStatus) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/commits/%s/status", owner, repo, ref), jsonHeader, nil, status) | ||||
| 
 | ||||
| 	// gitea api return empty body if nothing here jet
 | ||||
| 	if resp != nil && resp.StatusCode == 200 && err != nil { | ||||
| 		return status, resp, nil | ||||
| 	} | ||||
| 
 | ||||
| 	return status, resp, err | ||||
| } | ||||
							
								
								
									
										90
									
								
								vendor/code.gitea.io/sdk/gitea/user.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										90
									
								
								vendor/code.gitea.io/sdk/gitea/user.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,90 +0,0 @@ | ||||
| // 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 ( | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"strconv" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // User represents a user
 | ||||
| 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"` | ||||
| 	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"` | ||||
| 	// Date and Time of last login
 | ||||
| 	LastLogin time.Time `json:"last_login"` | ||||
| 	// Date and Time of user creation
 | ||||
| 	Created time.Time `json:"created"` | ||||
| 	// Is user restricted
 | ||||
| 	Restricted bool `json:"restricted"` | ||||
| 	// Is user active
 | ||||
| 	IsActive bool `json:"active"` | ||||
| 	// Is user login prohibited
 | ||||
| 	ProhibitLogin bool `json:"prohibit_login"` | ||||
| 	// the user's location
 | ||||
| 	Location string `json:"location"` | ||||
| 	// the user's website
 | ||||
| 	Website string `json:"website"` | ||||
| 	// the user's description
 | ||||
| 	Description string `json:"description"` | ||||
| 	// User visibility level option
 | ||||
| 	Visibility VisibleType `json:"visibility"` | ||||
| 
 | ||||
| 	// user counts
 | ||||
| 	FollowerCount    int `json:"followers_count"` | ||||
| 	FollowingCount   int `json:"following_count"` | ||||
| 	StarredRepoCount int `json:"starred_repos_count"` | ||||
| } | ||||
| 
 | ||||
| // GetUserInfo get user info by user's name
 | ||||
| func (c *Client) GetUserInfo(user string) (*User, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	u := new(User) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/users/%s", user), nil, nil, u) | ||||
| 	return u, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetMyUserInfo get user info of current user
 | ||||
| func (c *Client) GetMyUserInfo() (*User, *Response, error) { | ||||
| 	u := new(User) | ||||
| 	resp, err := c.getParsedResponse("GET", "/user", nil, nil, u) | ||||
| 	return u, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetUserByID returns user by a given user ID
 | ||||
| func (c *Client) GetUserByID(id int64) (*User, *Response, error) { | ||||
| 	if id < 0 { | ||||
| 		return nil, nil, fmt.Errorf("invalid user id %d", id) | ||||
| 	} | ||||
| 
 | ||||
| 	query := make(url.Values) | ||||
| 	query.Add("uid", strconv.FormatInt(id, 10)) | ||||
| 	users, resp, err := c.searchUsers(query.Encode()) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 
 | ||||
| 	if len(users) == 1 { | ||||
| 		return users[0], resp, err | ||||
| 	} | ||||
| 
 | ||||
| 	return nil, resp, fmt.Errorf("user not found with id %d", id) | ||||
| } | ||||
							
								
								
									
										90
									
								
								vendor/code.gitea.io/sdk/gitea/user_app.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										90
									
								
								vendor/code.gitea.io/sdk/gitea/user_app.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,90 +0,0 @@ | ||||
| // 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/json" | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"reflect" | ||||
| ) | ||||
| 
 | ||||
| // AccessToken represents an API access token.
 | ||||
| type AccessToken struct { | ||||
| 	ID             int64  `json:"id"` | ||||
| 	Name           string `json:"name"` | ||||
| 	Token          string `json:"sha1"` | ||||
| 	TokenLastEight string `json:"token_last_eight"` | ||||
| } | ||||
| 
 | ||||
| // ListAccessTokensOptions options for listing a users's access tokens
 | ||||
| type ListAccessTokensOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListAccessTokens lists all the access tokens of user
 | ||||
| func (c *Client) ListAccessTokens(opts ListAccessTokensOptions) ([]*AccessToken, *Response, error) { | ||||
| 	c.mutex.RLock() | ||||
| 	username := c.username | ||||
| 	c.mutex.RUnlock() | ||||
| 	if len(username) == 0 { | ||||
| 		return nil, nil, fmt.Errorf("\"username\" not set: only BasicAuth allowed") | ||||
| 	} | ||||
| 	opts.setDefaults() | ||||
| 	tokens := make([]*AccessToken, 0, opts.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/users/%s/tokens?%s", url.PathEscape(username), opts.getURLQuery().Encode()), jsonHeader, nil, &tokens) | ||||
| 	return tokens, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateAccessTokenOption options when create access token
 | ||||
| type CreateAccessTokenOption struct { | ||||
| 	Name string `json:"name"` | ||||
| } | ||||
| 
 | ||||
| // CreateAccessToken create one access token with options
 | ||||
| func (c *Client) CreateAccessToken(opt CreateAccessTokenOption) (*AccessToken, *Response, error) { | ||||
| 	c.mutex.RLock() | ||||
| 	username := c.username | ||||
| 	c.mutex.RUnlock() | ||||
| 	if len(username) == 0 { | ||||
| 		return nil, nil, fmt.Errorf("\"username\" not set: only BasicAuth allowed") | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	t := new(AccessToken) | ||||
| 	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/users/%s/tokens", url.PathEscape(username)), jsonHeader, bytes.NewReader(body), t) | ||||
| 	return t, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteAccessToken delete token, identified by ID and if not available by name
 | ||||
| func (c *Client) DeleteAccessToken(value interface{}) (*Response, error) { | ||||
| 	c.mutex.RLock() | ||||
| 	username := c.username | ||||
| 	c.mutex.RUnlock() | ||||
| 	if len(username) == 0 { | ||||
| 		return nil, fmt.Errorf("\"username\" not set: only BasicAuth allowed") | ||||
| 	} | ||||
| 
 | ||||
| 	var token = "" | ||||
| 
 | ||||
| 	switch reflect.ValueOf(value).Kind() { | ||||
| 	case reflect.Int64: | ||||
| 		token = fmt.Sprintf("%d", value.(int64)) | ||||
| 	case reflect.String: | ||||
| 		if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		token = value.(string) | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("only string and int64 supported") | ||||
| 	} | ||||
| 
 | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/users/%s/tokens/%s", url.PathEscape(username), url.PathEscape(token)), jsonHeader, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										64
									
								
								vendor/code.gitea.io/sdk/gitea/user_email.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								vendor/code.gitea.io/sdk/gitea/user_email.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,64 +0,0 @@ | ||||
| // 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" | ||||
| ) | ||||
| 
 | ||||
| // Email an email address belonging to a user
 | ||||
| type Email struct { | ||||
| 	Email    string `json:"email"` | ||||
| 	Verified bool   `json:"verified"` | ||||
| 	Primary  bool   `json:"primary"` | ||||
| } | ||||
| 
 | ||||
| // ListEmailsOptions options for listing current's user emails
 | ||||
| type ListEmailsOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListEmails all the email addresses of user
 | ||||
| func (c *Client) ListEmails(opt ListEmailsOptions) ([]*Email, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	emails := make([]*Email, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/emails?%s", opt.getURLQuery().Encode()), nil, nil, &emails) | ||||
| 	return emails, resp, err | ||||
| } | ||||
| 
 | ||||
| // 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, *Response, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	emails := make([]*Email, 0, 3) | ||||
| 	resp, err := c.getParsedResponse("POST", "/user/emails", jsonHeader, bytes.NewReader(body), &emails) | ||||
| 	return emails, resp, err | ||||
| } | ||||
| 
 | ||||
| // 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) (*Response, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", "/user/emails", jsonHeader, bytes.NewReader(body)) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										93
									
								
								vendor/code.gitea.io/sdk/gitea/user_follow.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										93
									
								
								vendor/code.gitea.io/sdk/gitea/user_follow.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,93 +0,0 @@ | ||||
| // 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" | ||||
| 
 | ||||
| // ListFollowersOptions options for listing followers
 | ||||
| type ListFollowersOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListMyFollowers list all the followers of current user
 | ||||
| func (c *Client) ListMyFollowers(opt ListFollowersOptions) ([]*User, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	users := make([]*User, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/followers?%s", opt.getURLQuery().Encode()), nil, nil, &users) | ||||
| 	return users, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListFollowers list all the followers of one user
 | ||||
| func (c *Client) ListFollowers(user string, opt ListFollowersOptions) ([]*User, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	users := make([]*User, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/users/%s/followers?%s", user, opt.getURLQuery().Encode()), nil, nil, &users) | ||||
| 	return users, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListFollowingOptions options for listing a user's users being followed
 | ||||
| type ListFollowingOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListMyFollowing list all the users current user followed
 | ||||
| func (c *Client) ListMyFollowing(opt ListFollowingOptions) ([]*User, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	users := make([]*User, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/following?%s", opt.getURLQuery().Encode()), nil, nil, &users) | ||||
| 	return users, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListFollowing list all the users the user followed
 | ||||
| func (c *Client) ListFollowing(user string, opt ListFollowingOptions) ([]*User, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	users := make([]*User, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/users/%s/following?%s", user, opt.getURLQuery().Encode()), nil, nil, &users) | ||||
| 	return users, resp, err | ||||
| } | ||||
| 
 | ||||
| // IsFollowing if current user followed the target
 | ||||
| func (c *Client) IsFollowing(target string) (bool, *Response) { | ||||
| 	if err := escapeValidatePathSegments(&target); err != nil { | ||||
| 		// ToDo return err
 | ||||
| 		return false, nil | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("GET", fmt.Sprintf("/user/following/%s", target), nil, nil) | ||||
| 	return err == nil, resp | ||||
| } | ||||
| 
 | ||||
| // IsUserFollowing if the user followed the target
 | ||||
| func (c *Client) IsUserFollowing(user, target string) (bool, *Response) { | ||||
| 	if err := escapeValidatePathSegments(&user, &target); err != nil { | ||||
| 		// ToDo return err
 | ||||
| 		return false, nil | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("GET", fmt.Sprintf("/users/%s/following/%s", user, target), nil, nil) | ||||
| 	return err == nil, resp | ||||
| } | ||||
| 
 | ||||
| // Follow set current user follow the target
 | ||||
| func (c *Client) Follow(target string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&target); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("PUT", fmt.Sprintf("/user/following/%s", target), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
| 
 | ||||
| // Unfollow set current user unfollow the target
 | ||||
| func (c *Client) Unfollow(target string) (*Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&target); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/user/following/%s", target), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										89
									
								
								vendor/code.gitea.io/sdk/gitea/user_gpgkey.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										89
									
								
								vendor/code.gitea.io/sdk/gitea/user_gpgkey.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,89 +0,0 @@ | ||||
| // 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"` | ||||
| 	Created           time.Time      `json:"created_at,omitempty"` | ||||
| 	Expires           time.Time      `json:"expires_at,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // GPGKeyEmail an email attached to a GPGKey
 | ||||
| type GPGKeyEmail struct { | ||||
| 	Email    string `json:"email"` | ||||
| 	Verified bool   `json:"verified"` | ||||
| } | ||||
| 
 | ||||
| // ListGPGKeysOptions options for listing a user's GPGKeys
 | ||||
| type ListGPGKeysOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListGPGKeys list all the GPG keys of the user
 | ||||
| func (c *Client) ListGPGKeys(user string, opt ListGPGKeysOptions) ([]*GPGKey, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	keys := make([]*GPGKey, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/users/%s/gpg_keys?%s", user, opt.getURLQuery().Encode()), nil, nil, &keys) | ||||
| 	return keys, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListMyGPGKeys list all the GPG keys of current user
 | ||||
| func (c *Client) ListMyGPGKeys(opt *ListGPGKeysOptions) ([]*GPGKey, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	keys := make([]*GPGKey, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/gpg_keys?%s", opt.getURLQuery().Encode()), nil, nil, &keys) | ||||
| 	return keys, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetGPGKey get current user's GPG key by key id
 | ||||
| func (c *Client) GetGPGKey(keyID int64) (*GPGKey, *Response, error) { | ||||
| 	key := new(GPGKey) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/gpg_keys/%d", keyID), nil, nil, &key) | ||||
| 	return key, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateGPGKeyOption options create user GPG key
 | ||||
| type CreateGPGKeyOption struct { | ||||
| 	// An armored GPG key to add
 | ||||
| 	//
 | ||||
| 	ArmoredKey string `json:"armored_public_key"` | ||||
| } | ||||
| 
 | ||||
| // CreateGPGKey create GPG key with options
 | ||||
| func (c *Client) CreateGPGKey(opt CreateGPGKeyOption) (*GPGKey, *Response, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	key := new(GPGKey) | ||||
| 	resp, err := c.getParsedResponse("POST", "/user/gpg_keys", jsonHeader, bytes.NewReader(body), key) | ||||
| 	return key, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeleteGPGKey delete GPG key with key id
 | ||||
| func (c *Client) DeleteGPGKey(keyID int64) (*Response, error) { | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/user/gpg_keys/%d", keyID), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										83
									
								
								vendor/code.gitea.io/sdk/gitea/user_key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										83
									
								
								vendor/code.gitea.io/sdk/gitea/user_key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,83 +0,0 @@ | ||||
| // 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"` | ||||
| 	Created     time.Time `json:"created_at,omitempty"` | ||||
| 	Owner       *User     `json:"user,omitempty"` | ||||
| 	ReadOnly    bool      `json:"read_only,omitempty"` | ||||
| 	KeyType     string    `json:"key_type,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // ListPublicKeysOptions options for listing a user's PublicKeys
 | ||||
| type ListPublicKeysOptions struct { | ||||
| 	ListOptions | ||||
| } | ||||
| 
 | ||||
| // ListPublicKeys list all the public keys of the user
 | ||||
| func (c *Client) ListPublicKeys(user string, opt ListPublicKeysOptions) ([]*PublicKey, *Response, error) { | ||||
| 	if err := escapeValidatePathSegments(&user); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	opt.setDefaults() | ||||
| 	keys := make([]*PublicKey, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/users/%s/keys?%s", user, opt.getURLQuery().Encode()), nil, nil, &keys) | ||||
| 	return keys, resp, err | ||||
| } | ||||
| 
 | ||||
| // ListMyPublicKeys list all the public keys of current user
 | ||||
| func (c *Client) ListMyPublicKeys(opt ListPublicKeysOptions) ([]*PublicKey, *Response, error) { | ||||
| 	opt.setDefaults() | ||||
| 	keys := make([]*PublicKey, 0, opt.PageSize) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/keys?%s", opt.getURLQuery().Encode()), nil, nil, &keys) | ||||
| 	return keys, resp, err | ||||
| } | ||||
| 
 | ||||
| // GetPublicKey get current user's public key by key id
 | ||||
| func (c *Client) GetPublicKey(keyID int64) (*PublicKey, *Response, error) { | ||||
| 	key := new(PublicKey) | ||||
| 	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/user/keys/%d", keyID), nil, nil, &key) | ||||
| 	return key, resp, err | ||||
| } | ||||
| 
 | ||||
| // CreateKeyOption options when creating a key
 | ||||
| type CreateKeyOption struct { | ||||
| 	// Title of the key to add
 | ||||
| 	Title string `json:"title"` | ||||
| 	// An armored SSH key to add
 | ||||
| 	Key string `json:"key"` | ||||
| 	// Describe if the key has only read access or read/write
 | ||||
| 	ReadOnly bool `json:"read_only"` | ||||
| } | ||||
| 
 | ||||
| // CreatePublicKey create public key with options
 | ||||
| func (c *Client) CreatePublicKey(opt CreateKeyOption) (*PublicKey, *Response, error) { | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	key := new(PublicKey) | ||||
| 	resp, err := c.getParsedResponse("POST", "/user/keys", jsonHeader, bytes.NewReader(body), key) | ||||
| 	return key, resp, err | ||||
| } | ||||
| 
 | ||||
| // DeletePublicKey delete public key with key id
 | ||||
| func (c *Client) DeletePublicKey(keyID int64) (*Response, error) { | ||||
| 	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/user/keys/%d", keyID), nil, nil) | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										48
									
								
								vendor/code.gitea.io/sdk/gitea/user_search.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								vendor/code.gitea.io/sdk/gitea/user_search.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,48 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| ) | ||||
| 
 | ||||
| type searchUsersResponse struct { | ||||
| 	Users []*User `json:"data"` | ||||
| } | ||||
| 
 | ||||
| // SearchUsersOption options for SearchUsers
 | ||||
| type SearchUsersOption struct { | ||||
| 	ListOptions | ||||
| 	KeyWord string | ||||
| } | ||||
| 
 | ||||
| // QueryEncode turns options into querystring argument
 | ||||
| func (opt *SearchUsersOption) QueryEncode() string { | ||||
| 	query := make(url.Values) | ||||
| 	if opt.Page > 0 { | ||||
| 		query.Add("page", fmt.Sprintf("%d", opt.Page)) | ||||
| 	} | ||||
| 	if opt.PageSize > 0 { | ||||
| 		query.Add("limit", fmt.Sprintf("%d", opt.PageSize)) | ||||
| 	} | ||||
| 	if len(opt.KeyWord) > 0 { | ||||
| 		query.Add("q", opt.KeyWord) | ||||
| 	} | ||||
| 	return query.Encode() | ||||
| } | ||||
| 
 | ||||
| func (c *Client) searchUsers(rawQuery string) ([]*User, *Response, error) { | ||||
| 	link, _ := url.Parse("/users/search") | ||||
| 	link.RawQuery = rawQuery | ||||
| 	userResp := new(searchUsersResponse) | ||||
| 	resp, err := c.getParsedResponse("GET", link.String(), nil, nil, &userResp) | ||||
| 	return userResp.Users, resp, err | ||||
| } | ||||
| 
 | ||||
| // SearchUsers finds users by query
 | ||||
| func (c *Client) SearchUsers(opt SearchUsersOption) ([]*User, *Response, error) { | ||||
| 	return c.searchUsers(opt.QueryEncode()) | ||||
| } | ||||
							
								
								
									
										62
									
								
								vendor/code.gitea.io/sdk/gitea/user_settings.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										62
									
								
								vendor/code.gitea.io/sdk/gitea/user_settings.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,62 +0,0 @@ | ||||
| // Copyright 2021 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" | ||||
| ) | ||||
| 
 | ||||
| // UserSettings represents user settings
 | ||||
| type UserSettings struct { | ||||
| 	FullName      string `json:"full_name"` | ||||
| 	Website       string `json:"website"` | ||||
| 	Description   string `json:"description"` | ||||
| 	Location      string `json:"location"` | ||||
| 	Language      string `json:"language"` | ||||
| 	Theme         string `json:"theme"` | ||||
| 	DiffViewStyle string `json:"diff_view_style"` | ||||
| 	// Privacy
 | ||||
| 	HideEmail    bool `json:"hide_email"` | ||||
| 	HideActivity bool `json:"hide_activity"` | ||||
| } | ||||
| 
 | ||||
| // UserSettingsOptions represents options to change user settings
 | ||||
| type UserSettingsOptions struct { | ||||
| 	FullName      *string `json:"full_name,omitempty"` | ||||
| 	Website       *string `json:"website,omitempty"` | ||||
| 	Description   *string `json:"description,omitempty"` | ||||
| 	Location      *string `json:"location,omitempty"` | ||||
| 	Language      *string `json:"language,omitempty"` | ||||
| 	Theme         *string `json:"theme,omitempty"` | ||||
| 	DiffViewStyle *string `json:"diff_view_style,omitempty"` | ||||
| 	// Privacy
 | ||||
| 	HideEmail    *bool `json:"hide_email,omitempty"` | ||||
| 	HideActivity *bool `json:"hide_activity,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // GetUserSettings returns user settings
 | ||||
| func (c *Client) GetUserSettings() (*UserSettings, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	userConfig := new(UserSettings) | ||||
| 	resp, err := c.getParsedResponse("GET", "/user/settings", nil, nil, userConfig) | ||||
| 	return userConfig, resp, err | ||||
| } | ||||
| 
 | ||||
| // UpdateUserSettings returns user settings
 | ||||
| func (c *Client) UpdateUserSettings(opt UserSettingsOptions) (*UserSettings, *Response, error) { | ||||
| 	if err := c.checkServerVersionGreaterThanOrEqual(version1_15_0); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	body, err := json.Marshal(&opt) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	userConfig := new(UserSettings) | ||||
| 	resp, err := c.getParsedResponse("PATCH", "/user/settings", jsonHeader, bytes.NewReader(body), userConfig) | ||||
| 	return userConfig, resp, err | ||||
| } | ||||
							
								
								
									
										101
									
								
								vendor/code.gitea.io/sdk/gitea/version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										101
									
								
								vendor/code.gitea.io/sdk/gitea/version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,101 +0,0 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package gitea | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 
 | ||||
| 	"github.com/hashicorp/go-version" | ||||
| ) | ||||
| 
 | ||||
| // ServerVersion returns the version of the server
 | ||||
| func (c *Client) ServerVersion() (string, *Response, error) { | ||||
| 	var v = struct { | ||||
| 		Version string `json:"version"` | ||||
| 	}{} | ||||
| 	resp, err := c.getParsedResponse("GET", "/version", nil, nil, &v) | ||||
| 	return v.Version, resp, err | ||||
| } | ||||
| 
 | ||||
| // CheckServerVersionConstraint validates that the login's server satisfies a
 | ||||
| // given version constraint such as ">= 1.11.0+dev"
 | ||||
| func (c *Client) CheckServerVersionConstraint(constraint string) error { | ||||
| 	if err := c.loadServerVersion(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	check, err := version.NewConstraint(constraint) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if !check.Check(c.serverVersion) { | ||||
| 		c.mutex.RLock() | ||||
| 		url := c.url | ||||
| 		c.mutex.RUnlock() | ||||
| 		return fmt.Errorf("gitea server at %s does not satisfy version constraint %s", url, constraint) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // SetGiteaVersion configures the Client to assume the given version of the
 | ||||
| // Gitea server, instead of querying the server for it when initializing.
 | ||||
| // Use "" to skip all canonical ways in the SDK to check for versions
 | ||||
| func SetGiteaVersion(v string) ClientOption { | ||||
| 	if v == "" { | ||||
| 		return func(c *Client) error { | ||||
| 			c.ignoreVersion = true | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
| 	return func(c *Client) (err error) { | ||||
| 		c.getVersionOnce.Do(func() { | ||||
| 			c.serverVersion, err = version.NewVersion(v) | ||||
| 			return | ||||
| 		}) | ||||
| 		return | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // predefined versions only have to be parsed by library once
 | ||||
| var ( | ||||
| 	version1_11_0, _ = version.NewVersion("1.11.0") | ||||
| 	version1_12_0, _ = version.NewVersion("1.12.0") | ||||
| 	version1_13_0, _ = version.NewVersion("1.13.0") | ||||
| 	version1_14_0, _ = version.NewVersion("1.14.0") | ||||
| 	version1_15_0, _ = version.NewVersion("1.15.0") | ||||
| ) | ||||
| 
 | ||||
| // checkServerVersionGreaterThanOrEqual is the canonical way in the SDK to check for versions for API compatibility reasons
 | ||||
| func (c *Client) checkServerVersionGreaterThanOrEqual(v *version.Version) error { | ||||
| 	if c.ignoreVersion { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if err := c.loadServerVersion(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if !c.serverVersion.GreaterThanOrEqual(v) { | ||||
| 		c.mutex.RLock() | ||||
| 		url := c.url | ||||
| 		c.mutex.RUnlock() | ||||
| 		return fmt.Errorf("gitea server at %s is older than %s", url, v.Original()) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // loadServerVersion init the serverVersion variable
 | ||||
| func (c *Client) loadServerVersion() (err error) { | ||||
| 	c.getVersionOnce.Do(func() { | ||||
| 		raw, _, err2 := c.ServerVersion() | ||||
| 		if err2 != nil { | ||||
| 			err = err2 | ||||
| 			return | ||||
| 		} | ||||
| 		if c.serverVersion, err = version.NewVersion(raw); err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 	}) | ||||
| 	return | ||||
| } | ||||
							
								
								
									
										33
									
								
								vendor/gitea.com/go-chi/binding/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/gitea.com/go-chi/binding/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,33 +0,0 @@ | ||||
| --- | ||||
| kind: pipeline | ||||
| name: go1-13 | ||||
| 
 | ||||
| platform: | ||||
|   os: linux | ||||
|   arch: arm64 | ||||
| 
 | ||||
| steps: | ||||
| - name: test | ||||
|   image: golang:1.13 | ||||
|   environment: | ||||
|     GOPROXY: https://goproxy.cn | ||||
|   commands: | ||||
|   - go build -v | ||||
|   - go test -v -race -coverprofile=coverage.txt -covermode=atomic | ||||
| 
 | ||||
| --- | ||||
| kind: pipeline | ||||
| name: go1-16 | ||||
| 
 | ||||
| platform: | ||||
|   os: linux | ||||
|   arch: arm64 | ||||
| 
 | ||||
| steps: | ||||
| - name: test | ||||
|   image: golang:1.16 | ||||
|   environment: | ||||
|     GOPROXY: https://goproxy.cn | ||||
|   commands: | ||||
|   - go build -v | ||||
|   - go test -v -race -coverprofile=coverage.txt -covermode=atomic | ||||
							
								
								
									
										1
									
								
								vendor/gitea.com/go-chi/binding/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/gitea.com/go-chi/binding/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | ||||
| .idea | ||||
							
								
								
									
										191
									
								
								vendor/gitea.com/go-chi/binding/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										191
									
								
								vendor/gitea.com/go-chi/binding/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,191 +0,0 @@ | ||||
| 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: | ||||
| 
 | ||||
| You must give any other recipients of the Work or Derivative Works a copy of | ||||
| this License; and | ||||
| You must cause any modified files to carry prominent notices stating that You | ||||
| changed the files; and | ||||
| 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 | ||||
| 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. | ||||
							
								
								
									
										5
									
								
								vendor/gitea.com/go-chi/binding/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/gitea.com/go-chi/binding/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,5 +0,0 @@ | ||||
| Middleware binding provides request data binding and validation for net/http, It's a fork of [Macaron](https://github.com/go-macaron/macaron). | ||||
| 
 | ||||
| ## License | ||||
| 
 | ||||
| This project is under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for the full license text. | ||||
							
								
								
									
										710
									
								
								vendor/gitea.com/go-chi/binding/binding.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										710
									
								
								vendor/gitea.com/go-chi/binding/binding.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,710 +0,0 @@ | ||||
| // Copyright 2014 Martini Authors
 | ||||
| // Copyright 2014 The Macaron Authors
 | ||||
| // Copyright 2020 The Gitea Authors
 | ||||
| //
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // Package binding is a middleware that provides request data binding and validation for Chi.
 | ||||
| package binding | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"mime/multipart" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"reflect" | ||||
| 	"regexp" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"unicode/utf8" | ||||
| 
 | ||||
| 	"github.com/goccy/go-json" | ||||
| 	"github.com/unknwon/com" | ||||
| ) | ||||
| 
 | ||||
| // Bind wraps up the functionality of the Form and Json middleware
 | ||||
| // according to the Content-Type and verb of the request.
 | ||||
| // A Content-Type is required for POST and PUT requests.
 | ||||
| // Bind invokes the ErrorHandler middleware to bail out if errors
 | ||||
| // occurred. If you want to perform your own error handling, use
 | ||||
| // Form or Json middleware directly. An interface pointer can
 | ||||
| // be added as a second argument in order to map the struct to
 | ||||
| // a specific interface.
 | ||||
| func Bind(req *http.Request, obj interface{}) Errors { | ||||
| 	contentType := req.Header.Get("Content-Type") | ||||
| 	if req.Method == "POST" || req.Method == "PUT" || len(contentType) > 0 { | ||||
| 		switch { | ||||
| 		case strings.Contains(contentType, "form-urlencoded"): | ||||
| 			return Form(req, obj) | ||||
| 		case strings.Contains(contentType, "multipart/form-data"): | ||||
| 			return MultipartForm(req, obj) | ||||
| 		case strings.Contains(contentType, "json"): | ||||
| 			return JSON(req, obj) | ||||
| 		default: | ||||
| 			var errors Errors | ||||
| 			if contentType == "" { | ||||
| 				errors.Add([]string{}, ERR_CONTENT_TYPE, "Empty Content-Type") | ||||
| 			} else { | ||||
| 				errors.Add([]string{}, ERR_CONTENT_TYPE, "Unsupported Content-Type") | ||||
| 			} | ||||
| 			return errors | ||||
| 		} | ||||
| 	} else { | ||||
| 		return Form(req, obj) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| const ( | ||||
| 	_JSON_CONTENT_TYPE          = "application/json; charset=utf-8" | ||||
| 	STATUS_UNPROCESSABLE_ENTITY = 422 | ||||
| ) | ||||
| 
 | ||||
| // errorHandler simply counts the number of errors in the
 | ||||
| // context and, if more than 0, writes a response with an
 | ||||
| // error code and a JSON payload describing the errors.
 | ||||
| // The response will have a JSON content-type.
 | ||||
| // Middleware remaining on the stack will not even see the request
 | ||||
| // if, by this point, there are any errors.
 | ||||
| // This is a "default" handler, of sorts, and you are
 | ||||
| // welcome to use your own instead. The Bind middleware
 | ||||
| // invokes this automatically for convenience.
 | ||||
| func errorHandler(errs Errors, rw http.ResponseWriter) { | ||||
| 	if len(errs) > 0 { | ||||
| 		rw.Header().Set("Content-Type", _JSON_CONTENT_TYPE) | ||||
| 		if errs.Has(ERR_DESERIALIZATION) { | ||||
| 			rw.WriteHeader(http.StatusBadRequest) | ||||
| 		} else if errs.Has(ERR_CONTENT_TYPE) { | ||||
| 			rw.WriteHeader(http.StatusUnsupportedMediaType) | ||||
| 		} else { | ||||
| 			rw.WriteHeader(STATUS_UNPROCESSABLE_ENTITY) | ||||
| 		} | ||||
| 		errOutput, _ := json.Marshal(errs) | ||||
| 		rw.Write(errOutput) | ||||
| 		return | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Form is middleware to deserialize form-urlencoded data from the request.
 | ||||
| // It gets data from the form-urlencoded body, if present, or from the
 | ||||
| // query string. It uses the http.Request.ParseForm() method
 | ||||
| // to perform deserialization, then reflection is used to map each field
 | ||||
| // into the struct with the proper type. Structs with primitive slice types
 | ||||
| // (bool, float, int, string) can support deserialization of repeated form
 | ||||
| // keys, for example: key=val1&key=val2&key=val3
 | ||||
| // An interface pointer can be added as a second argument in order
 | ||||
| // to map the struct to a specific interface.
 | ||||
| func Form(req *http.Request, formStruct interface{}) Errors { | ||||
| 	var errors Errors | ||||
| 
 | ||||
| 	ensurePointer(formStruct) | ||||
| 	formStructV := reflect.ValueOf(formStruct) | ||||
| 	parseErr := req.ParseForm() | ||||
| 
 | ||||
| 	// Format validation of the request body or the URL would add considerable overhead,
 | ||||
| 	// and ParseForm does not complain when URL encoding is off.
 | ||||
| 	// Because an empty request body or url can also mean absence of all needed values,
 | ||||
| 	// it is not in all cases a bad request, so let's return 422.
 | ||||
| 	if parseErr != nil { | ||||
| 		errors.Add([]string{}, ERR_DESERIALIZATION, parseErr.Error()) | ||||
| 	} | ||||
| 	errors = mapForm(formStructV, req.Form, nil, errors) | ||||
| 	return append(errors, Validate(req, formStruct)...) | ||||
| } | ||||
| 
 | ||||
| // MaxMemory represents maximum amount of memory to use when parsing a multipart form.
 | ||||
| // Set this to whatever value you prefer; default is 10 MB.
 | ||||
| var MaxMemory = int64(1024 * 1024 * 10) | ||||
| 
 | ||||
| // MultipartForm works much like Form, except it can parse multipart forms
 | ||||
| // and handle file uploads. Like the other deserialization middleware handlers,
 | ||||
| // you can pass in an interface to make the interface available for injection
 | ||||
| // into other handlers later.
 | ||||
| func MultipartForm(req *http.Request, formStruct interface{}) Errors { | ||||
| 	var errors Errors | ||||
| 	ensurePointer(formStruct) | ||||
| 	formStructV := reflect.ValueOf(formStruct) | ||||
| 	// This if check is necessary due to https://github.com/martini-contrib/csrf/issues/6
 | ||||
| 	if req.MultipartForm == nil { | ||||
| 		// Workaround for multipart forms returning nil instead of an error
 | ||||
| 		// when content is not multipart; see https://code.google.com/p/go/issues/detail?id=6334
 | ||||
| 		if multipartReader, err := req.MultipartReader(); err != nil { | ||||
| 			errors.Add([]string{}, ERR_DESERIALIZATION, err.Error()) | ||||
| 		} else { | ||||
| 			form, parseErr := multipartReader.ReadForm(MaxMemory) | ||||
| 			if parseErr != nil { | ||||
| 				errors.Add([]string{}, ERR_DESERIALIZATION, parseErr.Error()) | ||||
| 			} | ||||
| 
 | ||||
| 			if req.Form == nil { | ||||
| 				req.ParseForm() | ||||
| 			} | ||||
| 			for k, v := range form.Value { | ||||
| 				req.Form[k] = append(req.Form[k], v...) | ||||
| 			} | ||||
| 
 | ||||
| 			req.MultipartForm = form | ||||
| 		} | ||||
| 	} | ||||
| 	errors = mapForm(formStructV, req.MultipartForm.Value, req.MultipartForm.File, errors) | ||||
| 	return append(errors, Validate(req, formStruct)...) | ||||
| } | ||||
| 
 | ||||
| // JSON is middleware to deserialize a JSON payload from the request
 | ||||
| // into the struct that is passed in. The resulting struct is then
 | ||||
| // validated, but no error handling is actually performed here.
 | ||||
| // An interface pointer can be added as a second argument in order
 | ||||
| // to map the struct to a specific interface.
 | ||||
| func JSON(req *http.Request, jsonStruct interface{}) Errors { | ||||
| 	var errors Errors | ||||
| 	ensurePointer(jsonStruct) | ||||
| 
 | ||||
| 	if req.Body != nil { | ||||
| 		defer req.Body.Close() | ||||
| 		err := json.NewDecoder(req.Body).Decode(jsonStruct) | ||||
| 		if err != nil && err != io.EOF { | ||||
| 			errors.Add([]string{}, ERR_DESERIALIZATION, err.Error()) | ||||
| 		} | ||||
| 	} | ||||
| 	return append(errors, Validate(req, jsonStruct)...) | ||||
| } | ||||
| 
 | ||||
| // RawValidate is same as Validate but does not require a HTTP context,
 | ||||
| // and can be used independently just for validation.
 | ||||
| // This function does not support Validator interface.
 | ||||
| func RawValidate(obj interface{}) Errors { | ||||
| 	var errs Errors | ||||
| 	v := reflect.ValueOf(obj) | ||||
| 	k := v.Kind() | ||||
| 	if k == reflect.Interface || k == reflect.Ptr { | ||||
| 		v = v.Elem() | ||||
| 		k = v.Kind() | ||||
| 	} | ||||
| 	if k == reflect.Slice || k == reflect.Array { | ||||
| 		for i := 0; i < v.Len(); i++ { | ||||
| 			e := v.Index(i).Interface() | ||||
| 			errs = validateStruct(errs, e) | ||||
| 		} | ||||
| 	} else { | ||||
| 		errs = validateStruct(errs, obj) | ||||
| 	} | ||||
| 	return errs | ||||
| } | ||||
| 
 | ||||
| // Validate is middleware to enforce required fields. If the struct
 | ||||
| // passed in implements Validator, then the user-defined Validate method
 | ||||
| // is executed, and its errors are mapped to the context. This middleware
 | ||||
| // performs no error handling: it merely detects errors and maps them.
 | ||||
| func Validate(req *http.Request, obj interface{}) Errors { | ||||
| 	var errs Errors | ||||
| 	v := reflect.ValueOf(obj) | ||||
| 	k := v.Kind() | ||||
| 	if k == reflect.Interface || k == reflect.Ptr { | ||||
| 		v = v.Elem() | ||||
| 		k = v.Kind() | ||||
| 	} | ||||
| 	if k == reflect.Slice || k == reflect.Array { | ||||
| 		for i := 0; i < v.Len(); i++ { | ||||
| 			e := v.Index(i).Interface() | ||||
| 			errs = validateStruct(errs, e) | ||||
| 			if validator, ok := e.(Validator); ok { | ||||
| 				errs = validator.Validate(req, errs) | ||||
| 			} | ||||
| 		} | ||||
| 	} else { | ||||
| 		errs = validateStruct(errs, obj) | ||||
| 		if validator, ok := obj.(Validator); ok { | ||||
| 			errs = validator.Validate(req, errs) | ||||
| 		} | ||||
| 	} | ||||
| 	return errs | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	AlphaDashPattern    = regexp.MustCompile(`[^\d\w-_]`) | ||||
| 	AlphaDashDotPattern = regexp.MustCompile(`[^\d\w-_\.]`) | ||||
| 	EmailPattern        = regexp.MustCompile(`\A[\w!#$%&'*+/=?^_`+"`"+`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`+"`"+`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[a-zA-Z0-9](?:[\w-]*[\w])?\z`) | ||||
| ) | ||||
| 
 | ||||
| // Copied from github.com/asaskevich/govalidator.
 | ||||
| const _MAX_URL_RUNE_COUNT = 2083 | ||||
| const _MIN_URL_RUNE_COUNT = 3 | ||||
| 
 | ||||
| var ( | ||||
| 	urlSchemaRx    = `((ftp|tcp|udp|wss?|https?):\/\/)` | ||||
| 	urlUsernameRx  = `(\S+(:\S*)?@)` | ||||
| 	urlIPRx        = `([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))` | ||||
| 	ipRx           = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))` | ||||
| 	urlSubdomainRx = `((www\.)|([a-zA-Z0-9]([-\.][-\._a-zA-Z0-9]+)*))` | ||||
| 	urlPortRx      = `(:(\d{1,5}))` | ||||
| 	urlPathRx      = `((\/|\?|#)[^\s]*)` | ||||
| 	URLPattern     = regexp.MustCompile(`\A` + urlSchemaRx + `?` + urlUsernameRx + `?` + `((` + urlIPRx + `|(\[` + ipRx + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + urlSubdomainRx + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + urlPortRx + `?` + urlPathRx + `?\z`) | ||||
| ) | ||||
| 
 | ||||
| // IsURL check if the string is an URL.
 | ||||
| func isURL(str string) bool { | ||||
| 	if str == "" || utf8.RuneCountInString(str) >= _MAX_URL_RUNE_COUNT || len(str) <= _MIN_URL_RUNE_COUNT || strings.HasPrefix(str, ".") { | ||||
| 		return false | ||||
| 	} | ||||
| 	u, err := url.Parse(str) | ||||
| 	if err != nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	if strings.HasPrefix(u.Host, ".") { | ||||
| 		return false | ||||
| 	} | ||||
| 	if u.Host == "" && (u.Path != "" && !strings.Contains(u.Path, ".")) { | ||||
| 		return false | ||||
| 	} | ||||
| 	return URLPattern.MatchString(str) | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| type ( | ||||
| 	// Rule represents a validation rule.
 | ||||
| 	Rule struct { | ||||
| 		// IsMatch checks if rule matches.
 | ||||
| 		IsMatch func(string) bool | ||||
| 		// IsValid applies validation rule to condition.
 | ||||
| 		IsValid func(Errors, string, interface{}) (bool, Errors) | ||||
| 	} | ||||
| 
 | ||||
| 	// ParamRule does same thing as Rule but passes rule itself to IsValid method.
 | ||||
| 	ParamRule struct { | ||||
| 		// IsMatch checks if rule matches.
 | ||||
| 		IsMatch func(string) bool | ||||
| 		// IsValid applies validation rule to condition.
 | ||||
| 		IsValid func(Errors, string, string, interface{}) (bool, Errors) | ||||
| 	} | ||||
| 
 | ||||
| 	// RuleMapper and ParamRuleMapper represent validation rule mappers,
 | ||||
| 	// it allwos users to add custom validation rules.
 | ||||
| 	RuleMapper      []*Rule | ||||
| 	ParamRuleMapper []*ParamRule | ||||
| ) | ||||
| 
 | ||||
| var ruleMapper RuleMapper | ||||
| var paramRuleMapper ParamRuleMapper | ||||
| 
 | ||||
| // AddRule adds new validation rule.
 | ||||
| func AddRule(r *Rule) { | ||||
| 	ruleMapper = append(ruleMapper, r) | ||||
| } | ||||
| 
 | ||||
| // AddParamRule adds new validation rule.
 | ||||
| func AddParamRule(r *ParamRule) { | ||||
| 	paramRuleMapper = append(paramRuleMapper, r) | ||||
| } | ||||
| 
 | ||||
| func in(fieldValue interface{}, arr string) bool { | ||||
| 	val := fmt.Sprintf("%v", fieldValue) | ||||
| 	vals := strings.Split(arr, ",") | ||||
| 	isIn := false | ||||
| 	for _, v := range vals { | ||||
| 		if v == val { | ||||
| 			isIn = true | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return isIn | ||||
| } | ||||
| 
 | ||||
| func parseFormName(raw, actual string) string { | ||||
| 	if len(actual) > 0 { | ||||
| 		return actual | ||||
| 	} | ||||
| 	return nameMapper(raw) | ||||
| } | ||||
| 
 | ||||
| // Performs required field checking on a struct
 | ||||
| func validateStruct(errors Errors, obj interface{}) Errors { | ||||
| 	typ := reflect.TypeOf(obj) | ||||
| 	val := reflect.ValueOf(obj) | ||||
| 
 | ||||
| 	if typ.Kind() == reflect.Ptr { | ||||
| 		typ = typ.Elem() | ||||
| 		val = val.Elem() | ||||
| 	} | ||||
| 
 | ||||
| 	for i := 0; i < typ.NumField(); i++ { | ||||
| 		field := typ.Field(i) | ||||
| 
 | ||||
| 		// Allow ignored fields in the struct
 | ||||
| 		if field.Tag.Get("form") == "-" || !val.Field(i).CanInterface() { | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		fieldVal := val.Field(i) | ||||
| 		fieldValue := fieldVal.Interface() | ||||
| 		zero := reflect.Zero(field.Type).Interface() | ||||
| 
 | ||||
| 		// Validate nested and embedded structs (if pointer, only do so if not nil)
 | ||||
| 		if field.Type.Kind() == reflect.Struct || | ||||
| 			(field.Type.Kind() == reflect.Ptr && !reflect.DeepEqual(zero, fieldValue) && | ||||
| 				field.Type.Elem().Kind() == reflect.Struct) { | ||||
| 			errors = validateStruct(errors, fieldValue) | ||||
| 		} | ||||
| 		errors = validateField(errors, zero, field, fieldVal, fieldValue) | ||||
| 	} | ||||
| 	return errors | ||||
| } | ||||
| 
 | ||||
| // Don't pass in pointers to bind to. Can lead to bugs.
 | ||||
| func ensureNotPointer(obj interface{}) { | ||||
| 	if reflect.TypeOf(obj).Kind() == reflect.Ptr { | ||||
| 		panic("Pointers are not accepted as binding models") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func validateField(errors Errors, zero interface{}, field reflect.StructField, fieldVal reflect.Value, fieldValue interface{}) Errors { | ||||
| 	if fieldVal.Kind() == reflect.Slice { | ||||
| 		for i := 0; i < fieldVal.Len(); i++ { | ||||
| 			sliceVal := fieldVal.Index(i) | ||||
| 			if sliceVal.Kind() == reflect.Ptr { | ||||
| 				sliceVal = sliceVal.Elem() | ||||
| 			} | ||||
| 
 | ||||
| 			sliceValue := sliceVal.Interface() | ||||
| 			zero := reflect.Zero(sliceVal.Type()).Interface() | ||||
| 			if sliceVal.Kind() == reflect.Struct || | ||||
| 				(sliceVal.Kind() == reflect.Ptr && !reflect.DeepEqual(zero, sliceValue) && | ||||
| 					sliceVal.Elem().Kind() == reflect.Struct) { | ||||
| 				errors = validateStruct(errors, sliceValue) | ||||
| 			} | ||||
| 			/* Apply validation rules to each item in a slice. ISSUE #3 | ||||
| 			else { | ||||
| 				errors = validateField(errors, zero, field, sliceVal, sliceValue) | ||||
| 			}*/ | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	rules := strings.Split(field.Tag.Get("binding"), ";") | ||||
| 
 | ||||
| 	if reflect.DeepEqual(zero, fieldValue) { | ||||
| 		for _, rule := range rules { | ||||
| 			if rule == "Required" { | ||||
| 				errors.Add([]string{field.Name}, ERR_REQUIRED, "Required") | ||||
| 				break | ||||
| 			} | ||||
| 			if strings.HasPrefix(rule, "Default(") { | ||||
| 				if fieldVal.CanSet() { | ||||
| 					errors = setWithProperType(field.Type.Kind(), rule[8:len(rule)-1], fieldVal, field.Tag.Get("form"), errors) | ||||
| 				} else { | ||||
| 					errors.Add([]string{field.Name}, ERR_EXCLUDE, "Default") | ||||
| 				} | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		return errors | ||||
| 	} | ||||
| 
 | ||||
| VALIDATE_RULES: | ||||
| 	for _, rule := range rules { | ||||
| 		if len(rule) == 0 { | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		switch { | ||||
| 		case rule == "Required": | ||||
| 			continue | ||||
| 		case strings.HasPrefix(rule, "Default("): | ||||
| 			continue | ||||
| 		case rule == "OmitEmpty": // legacy
 | ||||
| 			continue | ||||
| 
 | ||||
| 		case rule == "AlphaDash": | ||||
| 			if AlphaDashPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { | ||||
| 				errors.Add([]string{field.Name}, ERR_ALPHA_DASH, "AlphaDash") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		case rule == "AlphaDashDot": | ||||
| 			if AlphaDashDotPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { | ||||
| 				errors.Add([]string{field.Name}, ERR_ALPHA_DASH_DOT, "AlphaDashDot") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		case strings.HasPrefix(rule, "Size("): | ||||
| 			size, _ := strconv.Atoi(rule[5 : len(rule)-1]) | ||||
| 			if str, ok := fieldValue.(string); ok && utf8.RuneCountInString(str) != size { | ||||
| 				errors.Add([]string{field.Name}, ERR_SIZE, "Size") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 			if fieldVal.Kind() == reflect.Slice && fieldVal.Len() != size { | ||||
| 				errors.Add([]string{field.Name}, ERR_SIZE, "Size") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		case strings.HasPrefix(rule, "MinSize("): | ||||
| 			min, _ := strconv.Atoi(rule[8 : len(rule)-1]) | ||||
| 			if str, ok := fieldValue.(string); ok && utf8.RuneCountInString(str) < min { | ||||
| 				errors.Add([]string{field.Name}, ERR_MIN_SIZE, "MinSize") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 			if fieldVal.Kind() == reflect.Slice && fieldVal.Len() < min { | ||||
| 				errors.Add([]string{field.Name}, ERR_MIN_SIZE, "MinSize") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		case strings.HasPrefix(rule, "MaxSize("): | ||||
| 			max, _ := strconv.Atoi(rule[8 : len(rule)-1]) | ||||
| 			if str, ok := fieldValue.(string); ok && utf8.RuneCountInString(str) > max { | ||||
| 				errors.Add([]string{field.Name}, ERR_MAX_SIZE, "MaxSize") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 			if fieldVal.Kind() == reflect.Slice && fieldVal.Len() > max { | ||||
| 				errors.Add([]string{field.Name}, ERR_MAX_SIZE, "MaxSize") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		case strings.HasPrefix(rule, "Range("): | ||||
| 			nums := strings.Split(rule[6:len(rule)-1], ",") | ||||
| 			if len(nums) != 2 { | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 			val := com.StrTo(fmt.Sprintf("%v", fieldValue)).MustInt() | ||||
| 			if val < com.StrTo(nums[0]).MustInt() || val > com.StrTo(nums[1]).MustInt() { | ||||
| 				errors.Add([]string{field.Name}, ERR_RANGE, "Range") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		case rule == "Email": | ||||
| 			if !EmailPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { | ||||
| 				errors.Add([]string{field.Name}, ERR_EMAIL, "Email") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		case rule == "Url": | ||||
| 			str := fmt.Sprintf("%v", fieldValue) | ||||
| 			if !isURL(str) { | ||||
| 				errors.Add([]string{field.Name}, ERR_URL, "Url") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		case strings.HasPrefix(rule, "In("): | ||||
| 			if !in(fieldValue, rule[3:len(rule)-1]) { | ||||
| 				errors.Add([]string{field.Name}, ERR_IN, "In") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		case strings.HasPrefix(rule, "NotIn("): | ||||
| 			if in(fieldValue, rule[6:len(rule)-1]) { | ||||
| 				errors.Add([]string{field.Name}, ERR_NOT_INT, "NotIn") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		case strings.HasPrefix(rule, "Include("): | ||||
| 			if !strings.Contains(fmt.Sprintf("%v", fieldValue), rule[8:len(rule)-1]) { | ||||
| 				errors.Add([]string{field.Name}, ERR_INCLUDE, "Include") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		case strings.HasPrefix(rule, "Exclude("): | ||||
| 			if strings.Contains(fmt.Sprintf("%v", fieldValue), rule[8:len(rule)-1]) { | ||||
| 				errors.Add([]string{field.Name}, ERR_EXCLUDE, "Exclude") | ||||
| 				break VALIDATE_RULES | ||||
| 			} | ||||
| 		default: | ||||
| 			// Apply custom validation rules
 | ||||
| 			var isValid bool | ||||
| 			for i := range ruleMapper { | ||||
| 				if ruleMapper[i].IsMatch(rule) { | ||||
| 					isValid, errors = ruleMapper[i].IsValid(errors, field.Name, fieldValue) | ||||
| 					if !isValid { | ||||
| 						break VALIDATE_RULES | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			for i := range paramRuleMapper { | ||||
| 				if paramRuleMapper[i].IsMatch(rule) { | ||||
| 					isValid, errors = paramRuleMapper[i].IsValid(errors, rule, field.Name, fieldValue) | ||||
| 					if !isValid { | ||||
| 						break VALIDATE_RULES | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return errors | ||||
| } | ||||
| 
 | ||||
| // NameMapper represents a form tag name mapper.
 | ||||
| type NameMapper func(string) string | ||||
| 
 | ||||
| var ( | ||||
| 	nameMapper = func(field string) string { | ||||
| 		newstr := make([]rune, 0, len(field)) | ||||
| 		for i, chr := range field { | ||||
| 			if isUpper := 'A' <= chr && chr <= 'Z'; isUpper { | ||||
| 				if i > 0 { | ||||
| 					newstr = append(newstr, '_') | ||||
| 				} | ||||
| 				chr -= ('A' - 'a') | ||||
| 			} | ||||
| 			newstr = append(newstr, chr) | ||||
| 		} | ||||
| 		return string(newstr) | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| // SetNameMapper sets name mapper.
 | ||||
| func SetNameMapper(nm NameMapper) { | ||||
| 	nameMapper = nm | ||||
| } | ||||
| 
 | ||||
| // Takes values from the form data and puts them into a struct
 | ||||
| func mapForm(formStruct reflect.Value, form map[string][]string, | ||||
| 	formfile map[string][]*multipart.FileHeader, errors Errors) Errors { | ||||
| 
 | ||||
| 	if formStruct.Kind() == reflect.Ptr { | ||||
| 		formStruct = formStruct.Elem() | ||||
| 	} | ||||
| 	typ := formStruct.Type() | ||||
| 
 | ||||
| 	for i := 0; i < typ.NumField(); i++ { | ||||
| 		typeField := typ.Field(i) | ||||
| 		structField := formStruct.Field(i) | ||||
| 
 | ||||
| 		if typeField.Type.Kind() == reflect.Ptr && typeField.Anonymous { | ||||
| 			structField.Set(reflect.New(typeField.Type.Elem())) | ||||
| 			errors = mapForm(structField.Elem(), form, formfile, errors) | ||||
| 			if reflect.DeepEqual(structField.Elem().Interface(), reflect.Zero(structField.Elem().Type()).Interface()) { | ||||
| 				structField.Set(reflect.Zero(structField.Type())) | ||||
| 			} | ||||
| 		} else if typeField.Type.Kind() == reflect.Struct { | ||||
| 			errors = mapForm(structField, form, formfile, errors) | ||||
| 		} | ||||
| 
 | ||||
| 		inputFieldName := parseFormName(typeField.Name, typeField.Tag.Get("form")) | ||||
| 		if len(inputFieldName) == 0 || !structField.CanSet() { | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		inputValue, exists := form[inputFieldName] | ||||
| 		if exists { | ||||
| 			numElems := len(inputValue) | ||||
| 			if structField.Kind() == reflect.Slice && numElems > 0 { | ||||
| 				sliceOf := structField.Type().Elem().Kind() | ||||
| 				slice := reflect.MakeSlice(structField.Type(), numElems, numElems) | ||||
| 				for i := 0; i < numElems; i++ { | ||||
| 					errors = setWithProperType(sliceOf, inputValue[i], slice.Index(i), inputFieldName, errors) | ||||
| 				} | ||||
| 				formStruct.Field(i).Set(slice) | ||||
| 			} else { | ||||
| 				errors = setWithProperType(typeField.Type.Kind(), inputValue[0], structField, inputFieldName, errors) | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		inputFile, exists := formfile[inputFieldName] | ||||
| 		if !exists { | ||||
| 			continue | ||||
| 		} | ||||
| 		fhType := reflect.TypeOf((*multipart.FileHeader)(nil)) | ||||
| 		numElems := len(inputFile) | ||||
| 		if structField.Kind() == reflect.Slice && numElems > 0 && structField.Type().Elem() == fhType { | ||||
| 			slice := reflect.MakeSlice(structField.Type(), numElems, numElems) | ||||
| 			for i := 0; i < numElems; i++ { | ||||
| 				slice.Index(i).Set(reflect.ValueOf(inputFile[i])) | ||||
| 			} | ||||
| 			structField.Set(slice) | ||||
| 		} else if structField.Type() == fhType { | ||||
| 			structField.Set(reflect.ValueOf(inputFile[0])) | ||||
| 		} | ||||
| 	} | ||||
| 	return errors | ||||
| } | ||||
| 
 | ||||
| // This sets the value in a struct of an indeterminate type to the
 | ||||
| // matching value from the request (via Form middleware) in the
 | ||||
| // same type, so that not all deserialized values have to be strings.
 | ||||
| // Supported types are string, int, float, and bool.
 | ||||
| func setWithProperType(valueKind reflect.Kind, val string, structField reflect.Value, nameInTag string, errors Errors) Errors { | ||||
| 	switch valueKind { | ||||
| 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||
| 		if val == "" { | ||||
| 			val = "0" | ||||
| 		} | ||||
| 		intVal, err := strconv.ParseInt(val, 10, 64) | ||||
| 		if err != nil { | ||||
| 			errors.Add([]string{nameInTag}, ERR_INTERGER_TYPE, "Value could not be parsed as integer") | ||||
| 		} else { | ||||
| 			structField.SetInt(intVal) | ||||
| 		} | ||||
| 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: | ||||
| 		if val == "" { | ||||
| 			val = "0" | ||||
| 		} | ||||
| 		uintVal, err := strconv.ParseUint(val, 10, 64) | ||||
| 		if err != nil { | ||||
| 			errors.Add([]string{nameInTag}, ERR_INTERGER_TYPE, "Value could not be parsed as unsigned integer") | ||||
| 		} else { | ||||
| 			structField.SetUint(uintVal) | ||||
| 		} | ||||
| 	case reflect.Bool: | ||||
| 		if val == "on" { | ||||
| 			structField.SetBool(true) | ||||
| 			break | ||||
| 		} | ||||
| 
 | ||||
| 		if val == "" { | ||||
| 			val = "false" | ||||
| 		} | ||||
| 		boolVal, err := strconv.ParseBool(val) | ||||
| 		if err != nil { | ||||
| 			errors.Add([]string{nameInTag}, ERR_BOOLEAN_TYPE, "Value could not be parsed as boolean") | ||||
| 		} else if boolVal { | ||||
| 			structField.SetBool(true) | ||||
| 		} | ||||
| 	case reflect.Float32: | ||||
| 		if val == "" { | ||||
| 			val = "0.0" | ||||
| 		} | ||||
| 		floatVal, err := strconv.ParseFloat(val, 32) | ||||
| 		if err != nil { | ||||
| 			errors.Add([]string{nameInTag}, ERR_FLOAT_TYPE, "Value could not be parsed as 32-bit float") | ||||
| 		} else { | ||||
| 			structField.SetFloat(floatVal) | ||||
| 		} | ||||
| 	case reflect.Float64: | ||||
| 		if val == "" { | ||||
| 			val = "0.0" | ||||
| 		} | ||||
| 		floatVal, err := strconv.ParseFloat(val, 64) | ||||
| 		if err != nil { | ||||
| 			errors.Add([]string{nameInTag}, ERR_FLOAT_TYPE, "Value could not be parsed as 64-bit float") | ||||
| 		} else { | ||||
| 			structField.SetFloat(floatVal) | ||||
| 		} | ||||
| 	case reflect.String: | ||||
| 		structField.SetString(val) | ||||
| 	} | ||||
| 	return errors | ||||
| } | ||||
| 
 | ||||
| // Pointers must be bind to.
 | ||||
| func ensurePointer(obj interface{}) { | ||||
| 	if reflect.TypeOf(obj).Kind() != reflect.Ptr { | ||||
| 		panic("Pointers are only accepted as binding models") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| type ( | ||||
| 	// ErrorHandler is the interface that has custom error handling process.
 | ||||
| 	ErrorHandler interface { | ||||
| 		// Error handles validation errors with custom process.
 | ||||
| 		Error(*http.Request, Errors) | ||||
| 	} | ||||
| 
 | ||||
| 	// Validator is the interface that handles some rudimentary
 | ||||
| 	// request validation logic so your application doesn't have to.
 | ||||
| 	Validator interface { | ||||
| 		// Validate validates that the request is OK. It is recommended
 | ||||
| 		// that validation be limited to checking values for syntax and
 | ||||
| 		// semantics, enough to know that you can make sense of the request
 | ||||
| 		// in your application. For example, you might verify that a credit
 | ||||
| 		// card number matches a valid pattern, but you probably wouldn't
 | ||||
| 		// perform an actual credit card authorization here.
 | ||||
| 		Validate(*http.Request, Errors) Errors | ||||
| 	} | ||||
| ) | ||||
							
								
								
									
										159
									
								
								vendor/gitea.com/go-chi/binding/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										159
									
								
								vendor/gitea.com/go-chi/binding/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,159 +0,0 @@ | ||||
| // Copyright 2014 Martini Authors
 | ||||
| // Copyright 2014 The Macaron Authors
 | ||||
| //
 | ||||
| // 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.
 | ||||
| 
 | ||||
| package binding | ||||
| 
 | ||||
| const ( | ||||
| 	// Type mismatch errors.
 | ||||
| 	ERR_CONTENT_TYPE    = "ContentTypeError" | ||||
| 	ERR_DESERIALIZATION = "DeserializationError" | ||||
| 	ERR_INTERGER_TYPE   = "IntegerTypeError" | ||||
| 	ERR_BOOLEAN_TYPE    = "BooleanTypeError" | ||||
| 	ERR_FLOAT_TYPE      = "FloatTypeError" | ||||
| 
 | ||||
| 	// Validation errors.
 | ||||
| 	ERR_REQUIRED       = "RequiredError" | ||||
| 	ERR_ALPHA_DASH     = "AlphaDashError" | ||||
| 	ERR_ALPHA_DASH_DOT = "AlphaDashDotError" | ||||
| 	ERR_SIZE           = "SizeError" | ||||
| 	ERR_MIN_SIZE       = "MinSizeError" | ||||
| 	ERR_MAX_SIZE       = "MaxSizeError" | ||||
| 	ERR_RANGE          = "RangeError" | ||||
| 	ERR_EMAIL          = "EmailError" | ||||
| 	ERR_URL            = "UrlError" | ||||
| 	ERR_IN             = "InError" | ||||
| 	ERR_NOT_INT        = "NotInError" | ||||
| 	ERR_INCLUDE        = "IncludeError" | ||||
| 	ERR_EXCLUDE        = "ExcludeError" | ||||
| 	ERR_DEFAULT        = "DefaultError" | ||||
| ) | ||||
| 
 | ||||
| type ( | ||||
| 	// Errors may be generated during deserialization, binding,
 | ||||
| 	// or validation. This type is mapped to the context so you
 | ||||
| 	// can inject it into your own handlers and use it in your
 | ||||
| 	// application if you want all your errors to look the same.
 | ||||
| 	Errors []Error | ||||
| 
 | ||||
| 	Error struct { | ||||
| 		// An error supports zero or more field names, because an
 | ||||
| 		// error can morph three ways: (1) it can indicate something
 | ||||
| 		// wrong with the request as a whole, (2) it can point to a
 | ||||
| 		// specific problem with a particular input field, or (3) it
 | ||||
| 		// can span multiple related input fields.
 | ||||
| 		FieldNames []string `json:"fieldNames,omitempty"` | ||||
| 
 | ||||
| 		// The classification is like an error code, convenient to
 | ||||
| 		// use when processing or categorizing an error programmatically.
 | ||||
| 		// It may also be called the "kind" of error.
 | ||||
| 		Classification string `json:"classification,omitempty"` | ||||
| 
 | ||||
| 		// Message should be human-readable and detailed enough to
 | ||||
| 		// pinpoint and resolve the problem, but it should be brief. For
 | ||||
| 		// example, a payload of 100 objects in a JSON array might have
 | ||||
| 		// an error in the 41st object. The message should help the
 | ||||
| 		// end user find and fix the error with their request.
 | ||||
| 		Message string `json:"message,omitempty"` | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| // Add adds an error associated with the fields indicated
 | ||||
| // by fieldNames, with the given classification and message.
 | ||||
| func (e *Errors) Add(fieldNames []string, classification, message string) { | ||||
| 	*e = append(*e, Error{ | ||||
| 		FieldNames:     fieldNames, | ||||
| 		Classification: classification, | ||||
| 		Message:        message, | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| // Len returns the number of errors.
 | ||||
| func (e *Errors) Len() int { | ||||
| 	return len(*e) | ||||
| } | ||||
| 
 | ||||
| // Has determines whether an Errors slice has an Error with
 | ||||
| // a given classification in it; it does not search on messages
 | ||||
| // or field names.
 | ||||
| func (e *Errors) Has(class string) bool { | ||||
| 	for _, err := range *e { | ||||
| 		if err.Kind() == class { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| /* | ||||
| // WithClass gets a copy of errors that are classified by the
 | ||||
| // the given classification.
 | ||||
| func (e *Errors) WithClass(classification string) Errors { | ||||
| 	var errs Errors | ||||
| 	for _, err := range *e { | ||||
| 		if err.Kind() == classification { | ||||
| 			errs = append(errs, err) | ||||
| 		} | ||||
| 	} | ||||
| 	return errs | ||||
| } | ||||
| 
 | ||||
| // ForField gets a copy of errors that are associated with the
 | ||||
| // field by the given name.
 | ||||
| func (e *Errors) ForField(name string) Errors { | ||||
| 	var errs Errors | ||||
| 	for _, err := range *e { | ||||
| 		for _, fieldName := range err.Fields() { | ||||
| 			if fieldName == name { | ||||
| 				errs = append(errs, err) | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return errs | ||||
| } | ||||
| 
 | ||||
| // Get gets errors of a particular class for the specified
 | ||||
| // field name.
 | ||||
| func (e *Errors) Get(class, fieldName string) Errors { | ||||
| 	var errs Errors | ||||
| 	for _, err := range *e { | ||||
| 		if err.Kind() == class { | ||||
| 			for _, nameOfField := range err.Fields() { | ||||
| 				if nameOfField == fieldName { | ||||
| 					errs = append(errs, err) | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return errs | ||||
| } | ||||
| */ | ||||
| 
 | ||||
| // Fields returns the list of field names this error is
 | ||||
| // associated with.
 | ||||
| func (e Error) Fields() []string { | ||||
| 	return e.FieldNames | ||||
| } | ||||
| 
 | ||||
| // Kind returns this error's classification.
 | ||||
| func (e Error) Kind() string { | ||||
| 	return e.Classification | ||||
| } | ||||
| 
 | ||||
| // Error returns this error's message.
 | ||||
| func (e Error) Error() string { | ||||
| 	return e.Message | ||||
| } | ||||
							
								
								
									
										10
									
								
								vendor/gitea.com/go-chi/binding/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/gitea.com/go-chi/binding/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,10 +0,0 @@ | ||||
| module gitea.com/go-chi/binding | ||||
| 
 | ||||
| go 1.13 | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/go-chi/chi/v5 v5.0.4 | ||||
| 	github.com/goccy/go-json v0.4.11 | ||||
| 	github.com/stretchr/testify v1.3.0 | ||||
| 	github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e | ||||
| ) | ||||
							
								
								
									
										21
									
								
								vendor/gitea.com/go-chi/binding/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								vendor/gitea.com/go-chi/binding/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,21 +0,0 @@ | ||||
| github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= | ||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/go-chi/chi/v5 v5.0.4 h1:5e494iHzsYBiyXQAHHuI4tyJS9M3V84OuX3ufIIGHFo= | ||||
| github.com/go-chi/chi/v5 v5.0.4/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= | ||||
| github.com/goccy/go-json v0.4.11 h1:92nyX606ZN/cUFwctfxwDWm8YWSA38Zlv9s7taFeLyo= | ||||
| github.com/goccy/go-json v0.4.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | ||||
| github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE= | ||||
| github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= | ||||
| 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/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY= | ||||
| github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= | ||||
| github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c h1:Ho+uVpkel/udgjbwB5Lktg9BtvJSh2DT0Hi6LPSyI2w= | ||||
| github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= | ||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||
| github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e h1:GSGeB9EAKY2spCABz6xOX5DbxZEXolK+nBSvmsQwRjM= | ||||
| github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= | ||||
							
								
								
									
										24
									
								
								vendor/gitea.com/go-chi/cache/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/gitea.com/go-chi/cache/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,24 +0,0 @@ | ||||
| kind: pipeline | ||||
| name: go1-1-1 | ||||
| 
 | ||||
| steps: | ||||
| - name: test | ||||
|   image: golang:1.11 | ||||
|   environment: | ||||
|     GOPROXY: https://goproxy.cn | ||||
|   commands: | ||||
|   - go build -v | ||||
|   - go test -v -race -coverprofile=coverage.txt -covermode=atomic | ||||
| 
 | ||||
| --- | ||||
| kind: pipeline | ||||
| name: go1-1-2 | ||||
| 
 | ||||
| steps: | ||||
| - name: test | ||||
|   image: golang:1.12 | ||||
|   environment: | ||||
|     GOPROXY: https://goproxy.cn | ||||
|   commands: | ||||
|   - go build -v | ||||
|   - go test -v -race -coverprofile=coverage.txt -covermode=atomic | ||||
							
								
								
									
										5
									
								
								vendor/gitea.com/go-chi/cache/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/gitea.com/go-chi/cache/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,5 +0,0 @@ | ||||
| nodb/cache | ||||
| ledis/tmp.db/ | ||||
| nodb/tmp.db/ | ||||
| /vendor | ||||
| /.idea | ||||
							
								
								
									
										191
									
								
								vendor/gitea.com/go-chi/cache/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										191
									
								
								vendor/gitea.com/go-chi/cache/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,191 +0,0 @@ | ||||
| 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: | ||||
| 
 | ||||
| You must give any other recipients of the Work or Derivative Works a copy of | ||||
| this License; and | ||||
| You must cause any modified files to carry prominent notices stating that You | ||||
| changed the files; and | ||||
| 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 | ||||
| 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. | ||||
							
								
								
									
										20
									
								
								vendor/gitea.com/go-chi/cache/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/gitea.com/go-chi/cache/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,20 +0,0 @@ | ||||
| # cache | ||||
| 
 | ||||
| Middleware cache provides cache management for [Macaron](https://github.com/go-macaron/macaron). It can use many cache adapters, including memory, file, Redis, Memcache, PostgreSQL, MySQL, Ledis and Nodb. | ||||
| 
 | ||||
| ### Installation | ||||
| 
 | ||||
| 	go get gitea.com/macaron/cache | ||||
| 
 | ||||
| ## Getting Help | ||||
| 
 | ||||
| - [API Reference](https://gowalker.org/gitea.com/macaron/cache) | ||||
| - [Documentation](http://go-macaron.com/docs/middlewares/cache) | ||||
| 
 | ||||
| ## Credits | ||||
| 
 | ||||
| This package is a modified version of [go-macaron/cache](github.com/go-macaron/cache). | ||||
| 
 | ||||
| ## License | ||||
| 
 | ||||
| This project is under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for the full license text. | ||||
							
								
								
									
										96
									
								
								vendor/gitea.com/go-chi/cache/cache.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										96
									
								
								vendor/gitea.com/go-chi/cache/cache.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,96 +0,0 @@ | ||||
| // Copyright 2013 Beego Authors
 | ||||
| // Copyright 2014 The Macaron Authors
 | ||||
| //
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // Package cache is a middleware that provides the cache management of Macaron.
 | ||||
| package cache | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| ) | ||||
| 
 | ||||
| // Cache is the interface that operates the cache data.
 | ||||
| type Cache interface { | ||||
| 	// Put puts value into cache with key and expire time.
 | ||||
| 	Put(key string, val interface{}, timeout int64) error | ||||
| 	// Get gets cached value by given key.
 | ||||
| 	Get(key string) interface{} | ||||
| 	// Delete deletes cached value by given key.
 | ||||
| 	Delete(key string) error | ||||
| 	// Incr increases cached int-type value by given key as a counter.
 | ||||
| 	Incr(key string) error | ||||
| 	// Decr decreases cached int-type value by given key as a counter.
 | ||||
| 	Decr(key string) error | ||||
| 	// IsExist returns true if cached value exists.
 | ||||
| 	IsExist(key string) bool | ||||
| 	// Flush deletes all cached data.
 | ||||
| 	Flush() error | ||||
| 	// StartAndGC starts GC routine based on config string settings.
 | ||||
| 	StartAndGC(opt Options) error | ||||
| } | ||||
| 
 | ||||
| // Options represents a struct for specifying configuration options for the cache middleware.
 | ||||
| type Options struct { | ||||
| 	// Name of adapter. Default is "memory".
 | ||||
| 	Adapter string | ||||
| 	// Adapter configuration, it's corresponding to adapter.
 | ||||
| 	AdapterConfig string | ||||
| 	// GC interval time in seconds. Default is 60.
 | ||||
| 	Interval int | ||||
| 	// Occupy entire database. Default is false.
 | ||||
| 	OccupyMode bool | ||||
| 	// Configuration section name. Default is "cache".
 | ||||
| 	Section string | ||||
| } | ||||
| 
 | ||||
| func prepareOptions(opt Options) Options { | ||||
| 	if len(opt.Section) == 0 { | ||||
| 		opt.Section = "cache" | ||||
| 	} | ||||
| 	if len(opt.Adapter) == 0 { | ||||
| 		opt.Adapter = "memory" | ||||
| 	} | ||||
| 	if opt.Interval == 0 { | ||||
| 		opt.Interval = 60 | ||||
| 	} | ||||
| 	if len(opt.AdapterConfig) == 0 { | ||||
| 		opt.AdapterConfig = "data/caches" | ||||
| 	} | ||||
| 
 | ||||
| 	return opt | ||||
| } | ||||
| 
 | ||||
| // NewCacher creates and returns a new cacher by given adapter name and configuration.
 | ||||
| // It panics when given adapter isn't registered and starts GC automatically.
 | ||||
| func NewCacher(opt Options) (Cache, error) { | ||||
| 	opt = prepareOptions(opt) | ||||
| 	adapter, ok := adapters[opt.Adapter] | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("cache: unknown adapter '%s'(forgot to import?)", opt.Adapter) | ||||
| 	} | ||||
| 	return adapter, adapter.StartAndGC(opt) | ||||
| } | ||||
| 
 | ||||
| var adapters = make(map[string]Cache) | ||||
| 
 | ||||
| // Register registers a adapter.
 | ||||
| func Register(name string, adapter Cache) { | ||||
| 	if adapter == nil { | ||||
| 		panic("cache: cannot register adapter with nil value") | ||||
| 	} | ||||
| 	if _, dup := adapters[name]; dup { | ||||
| 		panic(fmt.Errorf("cache: cannot register adapter '%s' twice", name)) | ||||
| 	} | ||||
| 	adapters[name] = adapter | ||||
| } | ||||
							
								
								
									
										208
									
								
								vendor/gitea.com/go-chi/cache/file.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										208
									
								
								vendor/gitea.com/go-chi/cache/file.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,208 +0,0 @@ | ||||
| // Copyright 2013 Beego Authors
 | ||||
| // Copyright 2014 The Macaron Authors
 | ||||
| //
 | ||||
| // 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.
 | ||||
| 
 | ||||
| package cache | ||||
| 
 | ||||
| import ( | ||||
| 	"crypto/md5" | ||||
| 	"encoding/hex" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"sync" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // Item represents a cache item.
 | ||||
| type Item struct { | ||||
| 	Val     interface{} | ||||
| 	Created int64 | ||||
| 	Expire  int64 | ||||
| } | ||||
| 
 | ||||
| func (item *Item) hasExpired() bool { | ||||
| 	return item.Expire > 0 && | ||||
| 		(time.Now().Unix()-item.Created) >= item.Expire | ||||
| } | ||||
| 
 | ||||
| // FileCacher represents a file cache adapter implementation.
 | ||||
| type FileCacher struct { | ||||
| 	lock     sync.Mutex | ||||
| 	rootPath string | ||||
| 	interval int // GC interval.
 | ||||
| } | ||||
| 
 | ||||
| // NewFileCacher creates and returns a new file cacher.
 | ||||
| func NewFileCacher() *FileCacher { | ||||
| 	return &FileCacher{} | ||||
| } | ||||
| 
 | ||||
| func (c *FileCacher) filepath(key string) string { | ||||
| 	m := md5.Sum([]byte(key)) | ||||
| 	hash := hex.EncodeToString(m[:]) | ||||
| 	return filepath.Join(c.rootPath, string(hash[0]), string(hash[1]), hash) | ||||
| } | ||||
| 
 | ||||
| // Put puts value into cache with key and expire time.
 | ||||
| // If expired is 0, it will be deleted by next GC operation.
 | ||||
| func (c *FileCacher) Put(key string, val interface{}, expire int64) error { | ||||
| 	filename := c.filepath(key) | ||||
| 	item := &Item{val, time.Now().Unix(), expire} | ||||
| 	data, err := EncodeGob(item) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	os.MkdirAll(filepath.Dir(filename), os.ModePerm) | ||||
| 	return ioutil.WriteFile(filename, data, os.ModePerm) | ||||
| } | ||||
| 
 | ||||
| func (c *FileCacher) read(key string) (*Item, error) { | ||||
| 	filename := c.filepath(key) | ||||
| 
 | ||||
| 	data, err := ioutil.ReadFile(filename) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	item := new(Item) | ||||
| 	return item, DecodeGob(data, item) | ||||
| } | ||||
| 
 | ||||
| // Get gets cached value by given key.
 | ||||
| func (c *FileCacher) Get(key string) interface{} { | ||||
| 	item, err := c.read(key) | ||||
| 	if err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	if item.hasExpired() { | ||||
| 		os.Remove(c.filepath(key)) | ||||
| 		return nil | ||||
| 	} | ||||
| 	return item.Val | ||||
| } | ||||
| 
 | ||||
| // Delete deletes cached value by given key.
 | ||||
| func (c *FileCacher) Delete(key string) error { | ||||
| 	return os.Remove(c.filepath(key)) | ||||
| } | ||||
| 
 | ||||
| // Incr increases cached int-type value by given key as a counter.
 | ||||
| func (c *FileCacher) Incr(key string) error { | ||||
| 	item, err := c.read(key) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	item.Val, err = Incr(item.Val) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return c.Put(key, item.Val, item.Expire) | ||||
| } | ||||
| 
 | ||||
| // Decrease cached int value.
 | ||||
| func (c *FileCacher) Decr(key string) error { | ||||
| 	item, err := c.read(key) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	item.Val, err = Decr(item.Val) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return c.Put(key, item.Val, item.Expire) | ||||
| } | ||||
| 
 | ||||
| // IsExist returns true if cached value exists.
 | ||||
| func (c *FileCacher) IsExist(key string) bool { | ||||
| 	if item, err := c.read(key); err == nil { | ||||
| 		return !item.hasExpired() | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // Flush deletes all cached data.
 | ||||
| func (c *FileCacher) Flush() error { | ||||
| 	return os.RemoveAll(c.rootPath) | ||||
| } | ||||
| 
 | ||||
| func (c *FileCacher) startGC() { | ||||
| 	c.lock.Lock() | ||||
| 	defer c.lock.Unlock() | ||||
| 
 | ||||
| 	if c.interval < 1 { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if err := filepath.Walk(c.rootPath, func(path string, fi os.FileInfo, err error) error { | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("Walk: %v", err) | ||||
| 		} | ||||
| 
 | ||||
| 		if fi.IsDir() { | ||||
| 			return nil | ||||
| 		} | ||||
| 
 | ||||
| 		data, err := ioutil.ReadFile(path) | ||||
| 		if err != nil && !os.IsNotExist(err) { | ||||
| 			fmt.Errorf("ReadFile: %v", err) | ||||
| 		} | ||||
| 
 | ||||
| 		item := new(Item) | ||||
| 		if err = DecodeGob(data, item); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if item.hasExpired() { | ||||
| 			if err = os.Remove(path); err != nil && !os.IsNotExist(err) { | ||||
| 				return fmt.Errorf("Remove: %v", err) | ||||
| 			} | ||||
| 		} | ||||
| 		return nil | ||||
| 	}); err != nil { | ||||
| 		log.Printf("error garbage collecting cache files: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	time.AfterFunc(time.Duration(c.interval)*time.Second, func() { c.startGC() }) | ||||
| } | ||||
| 
 | ||||
| // StartAndGC starts GC routine based on config string settings.
 | ||||
| func (c *FileCacher) StartAndGC(opt Options) error { | ||||
| 	c.lock.Lock() | ||||
| 	c.rootPath = opt.AdapterConfig | ||||
| 	c.interval = opt.Interval | ||||
| 
 | ||||
| 	if !filepath.IsAbs(c.rootPath) { | ||||
| 		panic("rootPath must be an absolute path") | ||||
| 	} | ||||
| 	c.lock.Unlock() | ||||
| 
 | ||||
| 	if err := os.MkdirAll(c.rootPath, os.ModePerm); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	go c.startGC() | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func init() { | ||||
| 	Register("file", NewFileCacher()) | ||||
| } | ||||
							
								
								
									
										32
									
								
								vendor/gitea.com/go-chi/cache/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/gitea.com/go-chi/cache/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,32 +0,0 @@ | ||||
| module gitea.com/go-chi/cache | ||||
| 
 | ||||
| go 1.11 | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/BurntSushi/toml v0.3.1 // indirect | ||||
| 	github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668 | ||||
| 	github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76 // indirect | ||||
| 	github.com/edsrzf/mmap-go v1.0.0 // indirect | ||||
| 	github.com/go-redis/redis v6.15.2+incompatible | ||||
| 	github.com/go-sql-driver/mysql v1.4.1 | ||||
| 	github.com/golang/snappy v0.0.2 // indirect | ||||
| 	github.com/lib/pq v1.2.0 | ||||
| 	github.com/lunny/log v0.0.0-20160921050905-7887c61bf0de // indirect | ||||
| 	github.com/lunny/nodb v0.0.0-20160621015157-fc1ef06ad4af | ||||
| 	github.com/mattn/go-sqlite3 v1.11.0 // indirect | ||||
| 	github.com/onsi/ginkgo v1.8.0 // indirect | ||||
| 	github.com/onsi/gomega v1.5.0 // indirect | ||||
| 	github.com/pelletier/go-toml v1.8.1 // indirect | ||||
| 	github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 // indirect | ||||
| 	github.com/siddontang/go-snappy v0.0.0-20140704025258-d8f7bb82a96d // indirect | ||||
| 	github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92 | ||||
| 	github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d // indirect | ||||
| 	github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 | ||||
| 	github.com/syndtr/goleveldb v1.0.0 // indirect | ||||
| 	github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e | ||||
| 	golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 // indirect | ||||
| 	golang.org/x/sys v0.0.0-20190730183949-1393eb018365 // indirect | ||||
| 	google.golang.org/appengine v1.6.1 // indirect | ||||
| 	gopkg.in/ini.v1 v1.44.2 | ||||
| 	gopkg.in/yaml.v2 v2.2.2 // indirect | ||||
| ) | ||||
							
								
								
									
										101
									
								
								vendor/gitea.com/go-chi/cache/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										101
									
								
								vendor/gitea.com/go-chi/cache/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,101 +0,0 @@ | ||||
| github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= | ||||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||
| github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668 h1:U/lr3Dgy4WK+hNk4tyD+nuGjpVLPEHuJSFXMw11/HPA= | ||||
| github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= | ||||
| github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76 h1:Lgdd/Qp96Qj8jqLpq2cI1I1X7BJnu06efS+XkhRoLUQ= | ||||
| github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= | ||||
| 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/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= | ||||
| github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= | ||||
| github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= | ||||
| github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||||
| github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4= | ||||
| github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= | ||||
| github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= | ||||
| github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= | ||||
| github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= | ||||
| github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= | ||||
| github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/golang/snappy v0.0.2 h1:aeE13tS0IiQgFjYdoL8qN3K1N2bXXtI6Vi51/y7BpMw= | ||||
| github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | ||||
| github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= | ||||
| github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | ||||
| github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= | ||||
| github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= | ||||
| github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= | ||||
| github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= | ||||
| github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/lunny/log v0.0.0-20160921050905-7887c61bf0de h1:nyxwRdWHAVxpFcDThedEgQ07DbcRc5xgNObtbTp76fk= | ||||
| github.com/lunny/log v0.0.0-20160921050905-7887c61bf0de/go.mod h1:3q8WtuPQsoRbatJuy3nvq/hRSvuBJrHHr+ybPPiNvHQ= | ||||
| github.com/lunny/nodb v0.0.0-20160621015157-fc1ef06ad4af h1:UaWHNBdukWrSG3DRvHFR/hyfg681fceqQDYVTBncKfQ= | ||||
| github.com/lunny/nodb v0.0.0-20160621015157-fc1ef06ad4af/go.mod h1:Cqz6pqow14VObJ7peltM+2n3PWOz7yTrfUuGbVFkzN0= | ||||
| github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q= | ||||
| github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= | ||||
| github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= | ||||
| github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | ||||
| github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= | ||||
| github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | ||||
| github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= | ||||
| github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= | ||||
| github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 h1:xT+JlYxNGqyT+XcU8iUrN18JYed2TvG9yN5ULG2jATM= | ||||
| github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= | ||||
| github.com/siddontang/go-snappy v0.0.0-20140704025258-d8f7bb82a96d h1:qQWKKOvHN7Q9c6GdmUteCef2F9ubxMpxY1IKwpIKz68= | ||||
| github.com/siddontang/go-snappy v0.0.0-20140704025258-d8f7bb82a96d/go.mod h1:vq0tzqLRu6TS7Id0wMo2N5QzJoKedVeovOpHjnykSzY= | ||||
| github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92 h1:qvsJwGToa8rxb42cDRhkbKeX2H5N8BH+s2aUikGt8mI= | ||||
| github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= | ||||
| github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d h1:NVwnfyR3rENtlz62bcrkXME3INVUa4lcdGt+opvxExs= | ||||
| github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= | ||||
| github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= | ||||
| github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY= | ||||
| github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= | ||||
| github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= | ||||
| github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= | ||||
| github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | ||||
| github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= | ||||
| github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= | ||||
| github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e h1:GSGeB9EAKY2spCABz6xOX5DbxZEXolK+nBSvmsQwRjM= | ||||
| github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= | ||||
| golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= | ||||
| golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190730183949-1393eb018365 h1:SaXEMXhWzMJThc05vu6uh61Q245r4KaWMrsTedk0FDc= | ||||
| golang.org/x/sys v0.0.0-20190730183949-1393eb018365/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= | ||||
| golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | ||||
| google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= | ||||
| google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= | ||||
| gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | ||||
| gopkg.in/ini.v1 v1.44.2 h1:N6kNUPqiIyxP+s/aINPzRvNpcTVV30qLC0t6ZjZFlUU= | ||||
| gopkg.in/ini.v1 v1.44.2/go.mod h1:M3Cogqpuv0QCi3ExAY5V4uOt4qb/R3xZubo9m8lK5wg= | ||||
| gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= | ||||
| gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= | ||||
| gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= | ||||
| gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
							
								
								
									
										92
									
								
								vendor/gitea.com/go-chi/cache/memcache/memcache.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										92
									
								
								vendor/gitea.com/go-chi/cache/memcache/memcache.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,92 +0,0 @@ | ||||
| // Copyright 2013 Beego Authors
 | ||||
| // Copyright 2014 The Macaron Authors
 | ||||
| //
 | ||||
| // 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.
 | ||||
| 
 | ||||
| package cache | ||||
| 
 | ||||
| import ( | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/bradfitz/gomemcache/memcache" | ||||
| 	"github.com/unknwon/com" | ||||
| 
 | ||||
| 	"gitea.com/go-chi/cache" | ||||
| ) | ||||
| 
 | ||||
| // MemcacheCacher represents a memcache cache adapter implementation.
 | ||||
| type MemcacheCacher struct { | ||||
| 	c *memcache.Client | ||||
| } | ||||
| 
 | ||||
| func NewItem(key string, data []byte, expire int32) *memcache.Item { | ||||
| 	return &memcache.Item{ | ||||
| 		Key:        key, | ||||
| 		Value:      data, | ||||
| 		Expiration: expire, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Put puts value into cache with key and expire time.
 | ||||
| // If expired is 0, it lives forever.
 | ||||
| func (c *MemcacheCacher) Put(key string, val interface{}, expire int64) error { | ||||
| 	return c.c.Set(NewItem(key, []byte(com.ToStr(val)), int32(expire))) | ||||
| } | ||||
| 
 | ||||
| // Get gets cached value by given key.
 | ||||
| func (c *MemcacheCacher) Get(key string) interface{} { | ||||
| 	item, err := c.c.Get(key) | ||||
| 	if err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return string(item.Value) | ||||
| } | ||||
| 
 | ||||
| // Delete deletes cached value by given key.
 | ||||
| func (c *MemcacheCacher) Delete(key string) error { | ||||
| 	return c.c.Delete(key) | ||||
| } | ||||
| 
 | ||||
| // Incr increases cached int-type value by given key as a counter.
 | ||||
| func (c *MemcacheCacher) Incr(key string) error { | ||||
| 	_, err := c.c.Increment(key, 1) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // Decr decreases cached int-type value by given key as a counter.
 | ||||
| func (c *MemcacheCacher) Decr(key string) error { | ||||
| 	_, err := c.c.Decrement(key, 1) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // IsExist returns true if cached value exists.
 | ||||
| func (c *MemcacheCacher) IsExist(key string) bool { | ||||
| 	_, err := c.c.Get(key) | ||||
| 	return err == nil | ||||
| } | ||||
| 
 | ||||
| // Flush deletes all cached data.
 | ||||
| func (c *MemcacheCacher) Flush() error { | ||||
| 	return c.c.FlushAll() | ||||
| } | ||||
| 
 | ||||
| // StartAndGC starts GC routine based on config string settings.
 | ||||
| // AdapterConfig: 127.0.0.1:9090;127.0.0.1:9091
 | ||||
| func (c *MemcacheCacher) StartAndGC(opt cache.Options) error { | ||||
| 	c.c = memcache.New(strings.Split(opt.AdapterConfig, ";")...) | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func init() { | ||||
| 	cache.Register("memcache", &MemcacheCacher{}) | ||||
| } | ||||
							
								
								
									
										1
									
								
								vendor/gitea.com/go-chi/cache/memcache/memcache.goconvey
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/gitea.com/go-chi/cache/memcache/memcache.goconvey
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | ||||
| ignore | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user