diff --git a/.ecrc b/.ecrc index feef7e9da..1e2188c4e 100644 --- a/.ecrc +++ b/.ecrc @@ -8,6 +8,7 @@ "node_modules", "server/store/datastore/migration/testfiles/sqlite.db", "server/store/datastore/feed.go", + "cmd/server/docs/docs.go", "_test.go", "Makefile" ] diff --git a/.gitignore b/.gitignore index e6f2f697f..95ac46fb1 100644 --- a/.gitignore +++ b/.gitignore @@ -40,9 +40,6 @@ extras/ /build/ /dist/ -server/swagger/files/*.json -server/swagger/swagger_gen.go - docs/venv # helm charts @@ -51,3 +48,4 @@ docs/venv ### Generated by CI ### docs/docs/40-cli.md +docs/docs/20-usage/90-rest-api.md diff --git a/.golangci.yml b/.golangci.yml index e6f8fe1e1..6d1b43a35 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -40,10 +40,6 @@ run: issues: exclude-rules: - - path: woodpecker-go/woodpecker/client.go|server/swagger/swagger.go - linters: - - deadcode - - unused # gin force us to use string as context key - path: server/store/context.go linters: diff --git a/.woodpecker/test.yml b/.woodpecker/test.yml index b3fbc9fb1..ac8b60c0f 100644 --- a/.woodpecker/test.yml +++ b/.woodpecker/test.yml @@ -45,6 +45,16 @@ pipeline: when: path: *when_path + check_swagger: + image: *golang_image + group: test + commands: + - "make generate-swagger" + - "DIFF=$(git diff | head)" + - "[ -n \"$DIFF\" ] && { echo \"swagger not up to date, exec 'make generate-swagger' and commit\"; exit 1; } || true" + when: + path: *when_path + lint-editorconfig: image: mstruebing/editorconfig-checker group: test diff --git a/Makefile b/Makefile index 606b92479..6b923499c 100644 --- a/Makefile +++ b/Makefile @@ -91,9 +91,12 @@ clean: ## Clean build artifacts @[ "1" != "$(shell docker image ls woodpecker/make:local -a | wc -l)" ] && docker image rm woodpecker/make:local || echo no docker image to clean .PHONY: generate -generate: ## Run all code generations +generate: generate-swagger ## Run all code generations go generate ./... +generate-swagger: install-tools ## Run swagger code generation + swag init -g server/api/ -g cmd/server/swagger.go --outputTypes go -output cmd/server/docs + check-xgo: ## Check if xgo is installed @hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ $(GO) install src.techknowlogick.com/xgo@latest; \ @@ -108,6 +111,9 @@ install-tools: ## Install development tools fi ; \ hash gofumpt > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ go install mvdan.cc/gofumpt@latest; \ + fi ; \ + hash swag > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + go install github.com/swaggo/swag/cmd/swag@latest; \ fi ui-dependencies: ## Install UI dependencies @@ -161,7 +167,7 @@ test: test-agent test-server test-server-datastore test-cli test-lib test-ui ## build-ui: ## Build UI (cd web/; pnpm install --frozen-lockfile; pnpm build) -build-server: build-ui ## Build server +build-server: build-ui generate-swagger ## Build server CGO_ENABLED=${CGO_ENABLED} GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -ldflags '${LDFLAGS}' -o dist/woodpecker-server github.com/woodpecker-ci/woodpecker/cmd/server build-agent: ## Build agent @@ -284,5 +290,6 @@ bundle: bundle-agent bundle-server bundle-cli ## Create all bundles .PHONY: docs docs: ## Generate docs (currently only for the cli) go generate cmd/cli/app.go + go generate cmd/server/swagger.go endif diff --git a/cmd/server/docs/docs.go b/cmd/server/docs/docs.go new file mode 100644 index 000000000..f2106a374 --- /dev/null +++ b/cmd/server/docs/docs.go @@ -0,0 +1,4343 @@ +// Code generated by swaggo/swag. DO NOT EDIT. + +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "contact": { + "name": "Woodpecker CI Community", + "url": "https://woodpecker-ci.org/" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/agents": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Agents" + ], + "summary": "Get agent list", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "default": 1, + "description": "for response pagination, page offset number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "default": 50, + "description": "for response pagination, max items per page", + "name": "perPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Agent" + } + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Agents" + ], + "summary": "Create a new agent with a random token so a new agent can connect to the server", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "description": "the agent's data (only 'name' and 'no_schedule' are read)", + "name": "agent", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Agent" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Agent" + } + } + } + } + }, + "/agents/{agent}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Agents" + ], + "summary": "Get agent information", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "description": "the agent's id", + "name": "agent", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Agent" + } + } + } + }, + "delete": { + "produces": [ + "text/plain" + ], + "tags": [ + "Agents" + ], + "summary": "Delete an agent", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "description": "the agent's id", + "name": "agent", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "Agents" + ], + "summary": "Update agent information", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "description": "the agent's id", + "name": "agent", + "in": "path", + "required": true + }, + { + "description": "the agent's data", + "name": "agentData", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Agent" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Agent" + } + } + } + } + }, + "/agents/{agent}/tasks": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Agents" + ], + "summary": "Get agent tasks", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "description": "the agent's id", + "name": "agent", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Task" + } + } + } + } + } + }, + "/badges/{owner}/{name}/cc.xml": { + "get": { + "description": "CCMenu displays the pipeline status of projects on a CI server as an item in the Mac's menu bar.\nMore details on how to install, you can find at http://ccmenu.org/\nThe response format adheres to CCTray v1 Specification, https://cctray.org/v1/", + "produces": [ + "text/xml" + ], + "tags": [ + "Badges" + ], + "summary": "Provide pipeline status information to the CCMenu tool", + "parameters": [ + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/badges/{owner}/{name}/status.svg": { + "get": { + "produces": [ + "image/svg+xml" + ], + "tags": [ + "Badges" + ], + "summary": "Get status badge, SVG format", + "parameters": [ + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/debug/pprof": { + "get": { + "description": "Only available, when server was started with WOODPECKER_LOG_LEVEL=debug", + "produces": [ + "text/html" + ], + "tags": [ + "Process profiling and debugging" + ], + "summary": "List available pprof profiles (HTML)", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/debug/pprof/block": { + "get": { + "description": "Only available, when server was started with WOODPECKER_LOG_LEVEL=debug", + "produces": [ + "text/plain" + ], + "tags": [ + "Process profiling and debugging" + ], + "summary": "Get pprof stack traces that led to blocking on synchronization primitives", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/debug/pprof/cmdline": { + "get": { + "description": "Only available, when server was started with WOODPECKER_LOG_LEVEL=debug", + "produces": [ + "text/plain" + ], + "tags": [ + "Process profiling and debugging" + ], + "summary": "Get the command line invocation of the current program", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/debug/pprof/goroutine": { + "get": { + "description": "Only available, when server was started with WOODPECKER_LOG_LEVEL=debug", + "produces": [ + "text/plain" + ], + "tags": [ + "Process profiling and debugging" + ], + "summary": "Get pprof stack traces of all current goroutines", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "default": 1, + "description": "Use debug=2 as a query parameter to export in the same format as an un-recovered panic", + "name": "debug", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/debug/pprof/heap": { + "get": { + "description": "Only available, when server was started with WOODPECKER_LOG_LEVEL=debug", + "produces": [ + "text/plain" + ], + "tags": [ + "Process profiling and debugging" + ], + "summary": "Get pprof heap dump, a sampling of memory allocations of live objects", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "default": "", + "description": "You can specify gc=heap to run GC before taking the heap sample", + "name": "gc", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/debug/pprof/profile": { + "get": { + "description": "Only available, when server was started with WOODPECKER_LOG_LEVEL=debug\nAfter you get the profile file, use the go tool pprof command to investigate the profile.", + "produces": [ + "text/plain" + ], + "tags": [ + "Process profiling and debugging" + ], + "summary": "Get pprof CPU profile", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "description": "You can specify the duration in the seconds GET parameter.", + "name": "seconds", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/debug/pprof/symbol": { + "get": { + "description": "Only available, when server was started with WOODPECKER_LOG_LEVEL=debug\nLooks up the program counters listed in the request,\nresponding with a table mapping program counters to function names.\nThe requested program counters can be provided via GET + query parameters,\nor POST + body parameters. Program counters shall be space delimited.", + "produces": [ + "text/plain" + ], + "tags": [ + "Process profiling and debugging" + ], + "summary": "Get pprof program counters mapping to function names", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "description": "Only available, when server was started with WOODPECKER_LOG_LEVEL=debug\nLooks up the program counters listed in the request,\nresponding with a table mapping program counters to function names.\nThe requested program counters can be provided via GET + query parameters,\nor POST + body parameters. Program counters shall be space delimited.", + "produces": [ + "text/plain" + ], + "tags": [ + "Process profiling and debugging" + ], + "summary": "Get pprof program counters mapping to function names", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/debug/pprof/threadcreate": { + "get": { + "description": "Only available, when server was started with WOODPECKER_LOG_LEVEL=debug", + "produces": [ + "text/plain" + ], + "tags": [ + "Process profiling and debugging" + ], + "summary": "Get pprof stack traces that led to the creation of new OS threads", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/debug/pprof/trace": { + "get": { + "description": "Only available, when server was started with WOODPECKER_LOG_LEVEL=debug\nAfter you get the profile file, use the go tool pprof command to investigate the profile.", + "produces": [ + "text/plain" + ], + "tags": [ + "Process profiling and debugging" + ], + "summary": "Get a trace of execution of the current program", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "description": "You can specify the duration in the seconds GET parameter.", + "name": "seconds", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/healthz": { + "get": { + "description": "If everything is fine, just a 200 will be returned, a 500 signals server state is unhealthy.", + "produces": [ + "text/plain" + ], + "tags": [ + "System" + ], + "summary": "Health information", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/hook": { + "post": { + "produces": [ + "text/plain" + ], + "tags": [ + "System" + ], + "summary": "Incoming webhook from forge", + "parameters": [ + { + "description": "the webhook payload; forge is automatically detected", + "name": "hook", + "in": "body", + "required": true, + "schema": { + "type": "object" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/log-level": { + "get": { + "description": "Endpoint returns the current logging level. Requires admin rights.", + "produces": [ + "application/json" + ], + "tags": [ + "System" + ], + "summary": "Current log level", + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "log-level": { + "type": "string" + } + } + } + ] + } + } + } + }, + "post": { + "description": "Endpoint sets the current logging level. Requires admin rights.", + "produces": [ + "application/json" + ], + "tags": [ + "System" + ], + "summary": "Set log level", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "description": "the new log level, one of \u003cdebug,trace,info,warn,error,fatal,panic,disabled\u003e", + "name": "log-level", + "in": "body", + "required": true, + "schema": { + "allOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "log-level": { + "type": "string" + } + } + } + ] + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "log-level": { + "type": "string" + } + } + } + ] + } + } + } + } + }, + "/orgs/{owner}/permissions": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Organization permissions" + ], + "summary": "Get the permissions of the current user in the given organization", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the owner's name", + "name": "owner", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/OrgPerm" + } + } + } + } + } + }, + "/orgs/{owner}/secrets": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Organization secrets" + ], + "summary": "Get the organization secret list", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 1, + "description": "for response pagination, page offset number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "default": 50, + "description": "for response pagination, max items per page", + "name": "perPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Secret" + } + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Organization secrets" + ], + "summary": "Persist/create an organization secret", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "description": "the new secret", + "name": "secretData", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Secret" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Secret" + } + } + } + } + }, + "/orgs/{owner}/secrets/{secret}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Organization secrets" + ], + "summary": "Get the named organization secret", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the secret's name", + "name": "secret", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Secret" + } + } + } + }, + "delete": { + "produces": [ + "text/plain" + ], + "tags": [ + "Organization secrets" + ], + "summary": "Delete the named secret from an organization", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the secret's name", + "name": "secret", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "Organization secrets" + ], + "summary": "Update an organization secret", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the secret's name", + "name": "secret", + "in": "path", + "required": true + }, + { + "description": "the update secret data", + "name": "secretData", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Secret" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Secret" + } + } + } + } + }, + "/pipelines": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Pipeline queues" + ], + "summary": "List pipeline queues", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Feed" + } + } + } + } + } + }, + "/queue/info": { + "get": { + "description": "TODO: link the InfoT response object - this is blocked, until the ` + "`" + `swaggo/swag` + "`" + ` tool dependency is v1.18.12 or newer", + "produces": [ + "application/json" + ], + "tags": [ + "Pipeline queues" + ], + "summary": "Get pipeline queue information", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/queue/norunningpipelines": { + "get": { + "produces": [ + "text/plain" + ], + "tags": [ + "Pipeline queues" + ], + "summary": "Block til pipeline queue has a running item", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/queue/pause": { + "post": { + "produces": [ + "text/plain" + ], + "tags": [ + "Pipeline queues" + ], + "summary": "Pause a pipeline queue", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/queue/resume": { + "post": { + "produces": [ + "text/plain" + ], + "tags": [ + "Pipeline queues" + ], + "summary": "Resume a pipeline queue", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/repos/{owner}/{name}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Repositories" + ], + "summary": "Get repository information", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Repo" + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Repositories" + ], + "summary": "Activate a repository", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Repo" + } + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "Repositories" + ], + "summary": "Delete a repository", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Repo" + } + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "Repositories" + ], + "summary": "Change a repository", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "description": "the repository's information", + "name": "repo", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/RepoPatch" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Repo" + } + } + } + } + }, + "/repos/{owner}/{name}/branches": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Repositories" + ], + "summary": "Get repository branches", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 1, + "description": "for response pagination, page offset number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "default": 50, + "description": "for response pagination, max items per page", + "name": "perPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "/repos/{owner}/{name}/chown": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Repositories" + ], + "summary": "Change a repository's owner, to the one holding the access token", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Repo" + } + } + } + } + }, + "/repos/{owner}/{name}/cron": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository cron jobs" + ], + "summary": "Get the cron job list", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 1, + "description": "for response pagination, page offset number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "default": 50, + "description": "for response pagination, max items per page", + "name": "perPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Cron" + } + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository cron jobs" + ], + "summary": "Persist/creat a cron job", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "description": "the new cron job", + "name": "cronJob", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Cron" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Cron" + } + } + } + } + }, + "/repos/{owner}/{name}/cron/{cron}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository cron jobs" + ], + "summary": "Get a cron job by id", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the cron job id", + "name": "cron", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Cron" + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository cron jobs" + ], + "summary": "Start a cron job now", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the cron job id", + "name": "cron", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Pipeline" + } + } + } + }, + "delete": { + "produces": [ + "text/plain" + ], + "tags": [ + "Repository cron jobs" + ], + "summary": "Delete a cron job by id", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the cron job id", + "name": "cron", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository cron jobs" + ], + "summary": "Update a cron job", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the cron job id", + "name": "cron", + "in": "path", + "required": true + }, + { + "description": "the cron job data", + "name": "cronJob", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Cron" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Cron" + } + } + } + } + }, + "/repos/{owner}/{name}/logs/{number}": { + "post": { + "produces": [ + "text/plain" + ], + "tags": [ + "Pipeline logs" + ], + "summary": "Deletes log", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the number of the pipeline", + "name": "number", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/repos/{owner}/{name}/logs/{number}/{pid}": { + "get": { + "produces": [ + "text/plain" + ], + "tags": [ + "Pipeline logs" + ], + "summary": "Log information", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the number of the pipeline", + "name": "number", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the pipeline id", + "name": "pid", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/repos/{owner}/{name}/logs/{number}/{pid}/{step}": { + "get": { + "produces": [ + "text/plain" + ], + "tags": [ + "Pipeline logs" + ], + "summary": "Log information per step", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the number of the pipeline", + "name": "number", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the pipeline id", + "name": "pid", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the step name", + "name": "step", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/repos/{owner}/{name}/move": { + "post": { + "produces": [ + "text/plain" + ], + "tags": [ + "Repositories" + ], + "summary": "Move a repository to a new owner", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the username to move the repository to", + "name": "to", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/repos/{owner}/{name}/permissions": { + "get": { + "description": "The repository permission, according to the used access token.", + "produces": [ + "application/json" + ], + "tags": [ + "Repositories" + ], + "summary": "Repository permission information", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Perm" + } + } + } + } + }, + "/repos/{owner}/{name}/pipelines": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Pipelines" + ], + "summary": "Get pipelines, current running and past ones", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 1, + "description": "for response pagination, page offset number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "default": 50, + "description": "for response pagination, max items per page", + "name": "perPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pipeline" + } + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Pipelines" + ], + "summary": "Run/trigger a pipelines", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "description": "the options for the pipeline to run", + "name": "options", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PipelineOptions" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Pipeline" + } + } + } + } + }, + "/repos/{owner}/{name}/pipelines/{number}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Pipelines" + ], + "summary": "Pipeline information by number", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the number of the pipeline, OR 'latest'", + "name": "number", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Pipeline" + } + } + } + }, + "post": { + "description": "Restarts a pipeline optional with altered event, deploy or environment", + "produces": [ + "application/json" + ], + "tags": [ + "Pipelines" + ], + "summary": "Restart a pipeline", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the number of the pipeline", + "name": "number", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "override the event type", + "name": "event", + "in": "query" + }, + { + "type": "string", + "description": "override the target deploy value", + "name": "deploy_to", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Pipeline" + } + } + } + } + }, + "/repos/{owner}/{name}/pipelines/{number}/approve": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Pipelines" + ], + "summary": "Start pipelines in gated repos", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the number of the pipeline", + "name": "number", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Pipeline" + } + } + } + } + }, + "/repos/{owner}/{name}/pipelines/{number}/cancel": { + "post": { + "produces": [ + "text/plain" + ], + "tags": [ + "Pipelines" + ], + "summary": "Cancels a pipeline", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the number of the pipeline", + "name": "number", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/repos/{owner}/{name}/pipelines/{number}/config": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Pipelines" + ], + "summary": "Pipeline configuration", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the number of the pipeline", + "name": "number", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Config" + } + } + } + } + } + }, + "/repos/{owner}/{name}/pipelines/{number}/decline": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Pipelines" + ], + "summary": "Decline pipelines in gated repos", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the number of the pipeline", + "name": "number", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Pipeline" + } + } + } + } + }, + "/repos/{owner}/{name}/pull_requests": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Repositories" + ], + "summary": "List active pull requests", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 1, + "description": "for response pagination, page offset number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "default": 50, + "description": "for response pagination, max items per page", + "name": "perPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PullRequest" + } + } + } + } + } + }, + "/repos/{owner}/{name}/registry": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository registries" + ], + "summary": "Get the registry list", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 1, + "description": "for response pagination, page offset number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "default": 50, + "description": "for response pagination, max items per page", + "name": "perPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Registry" + } + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository registries" + ], + "summary": "Persist/create a registry", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "description": "the new registry data", + "name": "registry", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Registry" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Registry" + } + } + } + } + }, + "/repos/{owner}/{name}/registry/{registry}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository registries" + ], + "summary": "Get a named registry", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the registry name", + "name": "registry", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Registry" + } + } + } + }, + "delete": { + "produces": [ + "text/plain" + ], + "tags": [ + "Repository registries" + ], + "summary": "Delete a named registry", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the registry name", + "name": "registry", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository registries" + ], + "summary": "Update a named registry", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the registry name", + "name": "registry", + "in": "path", + "required": true + }, + { + "description": "the attributes for the registry", + "name": "registryData", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Registry" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Registry" + } + } + } + } + }, + "/repos/{owner}/{name}/repair": { + "post": { + "produces": [ + "text/plain" + ], + "tags": [ + "Repositories" + ], + "summary": "Repair a repository", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/repos/{owner}/{name}/secrets": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository secrets" + ], + "summary": "Get the secret list", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 1, + "description": "for response pagination, page offset number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "default": 50, + "description": "for response pagination, max items per page", + "name": "perPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Secret" + } + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository secrets" + ], + "summary": "Persist/create a secret", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "description": "the new secret", + "name": "secret", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Secret" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Secret" + } + } + } + } + }, + "/repos/{owner}/{name}/secrets/{secretName}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository secrets" + ], + "summary": "Get a named secret", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the secret name", + "name": "secretName", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Secret" + } + } + } + }, + "delete": { + "produces": [ + "text/plain" + ], + "tags": [ + "Repository secrets" + ], + "summary": "Delete a named secret", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the secret name", + "name": "secretName", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "Repository secrets" + ], + "summary": "Update a named secret", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the repository owner's name", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the repository name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the secret name", + "name": "secretName", + "in": "path", + "required": true + }, + { + "description": "the secret itself", + "name": "secret", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Secret" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Secret" + } + } + } + } + }, + "/secrets": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Secrets" + ], + "summary": "Get the global secret list", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "default": 1, + "description": "for response pagination, page offset number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "default": 50, + "description": "for response pagination, max items per page", + "name": "perPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Secret" + } + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Secrets" + ], + "summary": "Persist/create a global secret", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "description": "the secret object data", + "name": "secret", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Secret" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Secret" + } + } + } + } + }, + "/secrets/{secret}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Secrets" + ], + "summary": "Get a global secret by name", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the secret's name", + "name": "secret", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Secret" + } + } + } + }, + "delete": { + "produces": [ + "text/plain" + ], + "tags": [ + "Secrets" + ], + "summary": "Delete a global secret by name", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the secret's name", + "name": "secret", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "Secrets" + ], + "summary": "Update a global secret by name", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the secret's name", + "name": "secret", + "in": "path", + "required": true + }, + { + "description": "the secret's data", + "name": "secretData", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Secret" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Secret" + } + } + } + } + }, + "/signature/public-key": { + "get": { + "produces": [ + "text/plain" + ], + "tags": [ + "System" + ], + "summary": "Get server's signature public key", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/user": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Returns the currently authenticated user.", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/User" + } + } + } + } + }, + "/user/feed": { + "get": { + "description": "Feed entries can be used to display information on the latest builds.", + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "A feed entry for a build.", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/Feed" + } + } + } + } + }, + "/user/repos": { + "get": { + "description": "Retrieve the currently authenticated User's Repository list", + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Get user's repos", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Repo" + } + } + } + } + } + }, + "/user/token": { + "post": { + "produces": [ + "text/plain" + ], + "tags": [ + "User" + ], + "summary": "Return the token of the current user as stringÂȘ", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "description": "Reset's the current personal access token of the user and returns a new one.", + "produces": [ + "text/plain" + ], + "tags": [ + "User" + ], + "summary": "Reset a token", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/users": { + "get": { + "description": "Returns all registered, active users in the system. Requires admin rights.", + "produces": [ + "application/json" + ], + "tags": [ + "Users" + ], + "summary": "Get all users", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "default": 1, + "description": "for response pagination, page offset number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "default": 50, + "description": "for response pagination, max items per page", + "name": "perPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + } + } + } + }, + "post": { + "description": "Creates a new user account with the specified external login. Requires admin rights.", + "produces": [ + "application/json" + ], + "tags": [ + "Users" + ], + "summary": "Create a user", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "description": "the user's data", + "name": "user", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/User" + } + } + } + } + }, + "/users/{login}": { + "get": { + "description": "Returns a user with the specified login name. Requires admin rights.", + "produces": [ + "application/json" + ], + "tags": [ + "Users" + ], + "summary": "Get a user", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the user's login name", + "name": "login", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/User" + } + } + } + }, + "delete": { + "description": "Deletes the given user. Requires admin rights.", + "produces": [ + "application/json" + ], + "tags": [ + "Users" + ], + "summary": "Delete a user", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the user's login name", + "name": "login", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/User" + } + } + } + }, + "patch": { + "description": "Changes the data of an existing user. Requires admin rights.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Users" + ], + "summary": "Change a user", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cpersonal access token\u003e", + "description": "Insert your personal access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "string", + "description": "the user's login name", + "name": "login", + "in": "path", + "required": true + }, + { + "description": "the user's data", + "name": "user", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/User" + } + } + } + } + }, + "/version": { + "get": { + "description": "Endpoint returns the server version and build information.", + "produces": [ + "application/json" + ], + "tags": [ + "System" + ], + "summary": "Get version", + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "source": { + "type": "string" + }, + "version": { + "type": "string" + } + } + } + ] + } + } + } + } + } + }, + "definitions": { + "Agent": { + "type": "object", + "properties": { + "backend": { + "type": "string" + }, + "capacity": { + "type": "integer" + }, + "created": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "last_contact": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "no_schedule": { + "type": "boolean" + }, + "owner_id": { + "type": "integer" + }, + "platform": { + "type": "string" + }, + "token": { + "type": "string" + }, + "updated": { + "type": "integer" + }, + "version": { + "type": "string" + } + } + }, + "Config": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "integer" + } + }, + "hash": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "Cron": { + "type": "object", + "properties": { + "branch": { + "type": "string" + }, + "created_at": { + "type": "integer" + }, + "creator_id": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "next_exec": { + "type": "integer" + }, + "repo_id": { + "type": "integer" + }, + "schedule": { + "description": "@weekly,\t3min, ...", + "type": "string" + } + } + }, + "Feed": { + "type": "object", + "properties": { + "author": { + "type": "string" + }, + "author_avatar": { + "type": "string" + }, + "author_email": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "commit": { + "type": "string" + }, + "created_at": { + "type": "integer" + }, + "event": { + "type": "string" + }, + "finished_at": { + "type": "integer" + }, + "full_name": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "message": { + "type": "string" + }, + "name": { + "type": "string" + }, + "number": { + "type": "integer" + }, + "owner": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "refspec": { + "type": "string" + }, + "remote": { + "type": "string" + }, + "started_at": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "title": { + "type": "string" + } + } + }, + "OrgPerm": { + "type": "object", + "properties": { + "admin": { + "type": "boolean" + }, + "member": { + "type": "boolean" + } + } + }, + "Perm": { + "type": "object", + "properties": { + "admin": { + "type": "boolean" + }, + "created": { + "type": "integer" + }, + "pull": { + "type": "boolean" + }, + "push": { + "type": "boolean" + }, + "synced": { + "type": "integer" + }, + "updated": { + "type": "integer" + } + } + }, + "Pipeline": { + "type": "object", + "properties": { + "author": { + "type": "string" + }, + "author_avatar": { + "type": "string" + }, + "author_email": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "changed_files": { + "type": "array", + "items": { + "type": "string" + } + }, + "clone_url": { + "type": "string" + }, + "commit": { + "type": "string" + }, + "created_at": { + "type": "integer" + }, + "deploy_to": { + "type": "string" + }, + "enqueued_at": { + "type": "integer" + }, + "error": { + "type": "string" + }, + "event": { + "$ref": "#/definitions/WebhookEvent" + }, + "finished_at": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "link_url": { + "type": "string" + }, + "message": { + "type": "string" + }, + "number": { + "type": "integer" + }, + "parent": { + "type": "integer" + }, + "pr_labels": { + "type": "array", + "items": { + "type": "string" + } + }, + "ref": { + "type": "string" + }, + "refspec": { + "type": "string" + }, + "reviewed_at": { + "type": "integer" + }, + "reviewed_by": { + "type": "string" + }, + "sender": { + "description": "uses reported user for webhooks and name of cron for cron pipelines", + "type": "string" + }, + "signed": { + "description": "deprecate", + "type": "boolean" + }, + "started_at": { + "type": "integer" + }, + "status": { + "$ref": "#/definitions/StatusValue" + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/definitions/Step" + } + }, + "timestamp": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "updated_at": { + "type": "integer" + }, + "variables": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "verified": { + "description": "deprecate", + "type": "boolean" + } + } + }, + "PipelineOptions": { + "type": "object", + "properties": { + "branch": { + "type": "string" + }, + "variables": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "PullRequest": { + "type": "object", + "properties": { + "index": { + "type": "integer" + }, + "title": { + "type": "string" + } + } + }, + "Registry": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "email": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "password": { + "type": "string" + }, + "token": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "Repo": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "allow_pr": { + "type": "boolean" + }, + "avatar_url": { + "type": "string" + }, + "cancel_previous_pipeline_events": { + "type": "array", + "items": { + "$ref": "#/definitions/WebhookEvent" + } + }, + "clone_url": { + "type": "string" + }, + "config_file": { + "type": "string" + }, + "default_branch": { + "type": "string" + }, + "full_name": { + "type": "string" + }, + "gated": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "link_url": { + "type": "string" + }, + "name": { + "type": "string" + }, + "netrc_only_trusted": { + "type": "boolean" + }, + "owner": { + "type": "string" + }, + "private": { + "type": "boolean" + }, + "scm": { + "$ref": "#/definitions/SCMKind" + }, + "timeout": { + "type": "integer" + }, + "trusted": { + "type": "boolean" + }, + "visibility": { + "$ref": "#/definitions/RepoVisibility" + } + } + }, + "RepoPatch": { + "type": "object", + "properties": { + "allow_pr": { + "type": "boolean" + }, + "cancel_previous_pipeline_events": { + "type": "array", + "items": { + "$ref": "#/definitions/WebhookEvent" + } + }, + "config_file": { + "type": "string" + }, + "gated": { + "type": "boolean" + }, + "netrc_only_trusted": { + "type": "boolean" + }, + "timeout": { + "type": "integer" + }, + "trusted": { + "type": "boolean" + }, + "visibility": { + "type": "string" + } + } + }, + "RepoVisibility": { + "type": "string", + "enum": [ + "public", + "private", + "internal" + ], + "x-enum-varnames": [ + "VisibilityPublic", + "VisibilityPrivate", + "VisibilityInternal" + ] + }, + "SCMKind": { + "type": "string", + "enum": [ + "git", + "hg", + "fossil", + "perforce" + ], + "x-enum-varnames": [ + "RepoGit", + "RepoHg", + "RepoFossil", + "RepoPerforce" + ] + }, + "Secret": { + "type": "object", + "properties": { + "event": { + "type": "array", + "items": { + "$ref": "#/definitions/WebhookEvent" + } + }, + "id": { + "type": "integer" + }, + "image": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "plugins_only": { + "type": "boolean" + }, + "value": { + "type": "string" + } + } + }, + "StatusValue": { + "type": "string", + "enum": [ + "skipped", + "pending", + "running", + "success", + "failure", + "killed", + "error", + "blocked", + "declined" + ], + "x-enum-varnames": [ + "StatusSkipped", + "StatusPending", + "StatusRunning", + "StatusSuccess", + "StatusFailure", + "StatusKilled", + "StatusError", + "StatusBlocked", + "StatusDeclined" + ] + }, + "Step": { + "type": "object", + "properties": { + "agent_id": { + "type": "integer" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/Step" + } + }, + "end_time": { + "type": "integer" + }, + "environ": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "error": { + "type": "string" + }, + "exit_code": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "pgid": { + "type": "integer" + }, + "pid": { + "type": "integer" + }, + "pipeline_id": { + "type": "integer" + }, + "platform": { + "type": "string" + }, + "ppid": { + "type": "integer" + }, + "start_time": { + "type": "integer" + }, + "state": { + "$ref": "#/definitions/StatusValue" + } + } + }, + "Task": { + "type": "object", + "properties": { + "agent_id": { + "type": "integer" + }, + "data": { + "type": "array", + "items": { + "type": "integer" + } + }, + "dep_status": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/StatusValue" + } + }, + "dependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "id": { + "type": "string" + }, + "labels": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "run_on": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "User": { + "type": "object", + "properties": { + "admin": { + "description": "Admin indicates the user is a system administrator.\n\nNOTE: If the username is part of the WOODPECKER_ADMIN\nenvironment variable this value will be set to true on login.", + "type": "boolean" + }, + "avatar_url": { + "description": "the avatar url for this user.", + "type": "string" + }, + "email": { + "description": "Email is the email address for this user.\n\nrequired: true", + "type": "string" + }, + "id": { + "description": "the id for this user.\n\nrequired: true", + "type": "integer" + }, + "login": { + "description": "Login is the username for this user.\n\nrequired: true", + "type": "string" + } + } + }, + "WebhookEvent": { + "type": "string", + "enum": [ + "push", + "pull_request", + "tag", + "deployment", + "cron", + "manual" + ], + "x-enum-varnames": [ + "EventPush", + "EventPull", + "EventTag", + "EventDeploy", + "EventCron", + "EventManual" + ] + } + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "", + Host: "", + BasePath: "", + Schemes: []string{}, + Title: "", + Description: "", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/cmd/server/main.go b/cmd/server/main.go index 034b7b192..bbb1f0ba3 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -20,6 +20,7 @@ import ( _ "github.com/joho/godotenv/autoload" "github.com/urfave/cli/v2" + _ "github.com/woodpecker-ci/woodpecker/cmd/server/docs" "github.com/woodpecker-ci/woodpecker/version" ) @@ -32,6 +33,8 @@ func main() { app.Action = run app.Flags = flags + setupSwaggerStaticConfig() + if err := app.Run(os.Args); err != nil { _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) diff --git a/cmd/server/swagger.go b/cmd/server/swagger.go new file mode 100644 index 000000000..4cead29fa --- /dev/null +++ b/cmd/server/swagger.go @@ -0,0 +1,38 @@ +// Copyright 2023 Woodpecker 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 main + +import ( + "github.com/woodpecker-ci/woodpecker/cmd/server/docs" + "github.com/woodpecker-ci/woodpecker/version" +) + +// generate docs/docs/20-usage/90-rest-api.md via: +//go:generate go run woodpecker_docs_gen.go swagger.go + +// setupSwaggerStaticConfig initializes static content only (contacts, title and description) +// for dynamic configuration of e.g. hostname, etc. see router.setupSwaggerConfigAndRoutes +// +// @contact.name Woodpecker CI Community +// @contact.url https://woodpecker-ci.org/ +func setupSwaggerStaticConfig() { + docs.SwaggerInfo.BasePath = "/api" + docs.SwaggerInfo.InfoInstanceName = "api" + docs.SwaggerInfo.Title = "Woodpecker CI API" + docs.SwaggerInfo.Version = version.String() + docs.SwaggerInfo.Description = "Woodpecker is a simple CI engine with great extensibility.\n" + + "To get a personal access token (PAT) for authentication, please log in your Woodpecker server,\n" + + "and go to you personal profile page, by clicking the user icon at the top right." +} diff --git a/cmd/server/woodpecker_docs_gen.go b/cmd/server/woodpecker_docs_gen.go new file mode 100644 index 000000000..f31fdf54d --- /dev/null +++ b/cmd/server/woodpecker_docs_gen.go @@ -0,0 +1,134 @@ +// Copyright 2023 Woodpecker 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. + +// ************************************************************************************************ +// This is a generator tool, to update the Markdown documentation for the woodpecker-ci.org website +// ************************************************************************************************ + +//go:build generate +// +build generate + +package main + +import ( + "bufio" + "fmt" + "os" + "path" + "strings" + "time" + + "github.com/go-swagger/go-swagger/generator" + + "github.com/woodpecker-ci/woodpecker/cmd/server/docs" +) + +const restApiMarkdownInto = ` +# REST API + +Woodpecker offers a comprehensive REST API, so you can integrate easily with from and with other tools. + +## API specification + +Starting with Woodpecker v1.0.0 a Swagger v2 API specification is served by the Woodpecker Server. +The typical URL looks like "http://woodpecker-host/swagger/doc.json", where you can fetch the API specification. + +## Swagger API UI + +Starting with Woodpecker v1.0.0 a Swagger web user interface (UI) is served by the Woodpecker Server. +Typically, you can open "http://woodpecker-host/swagger/index.html" in your browser, to explore the API documentation. + +# API endpoint summary + +This is a summary of available API endpoints. +Please, keep in mind this documentation reflects latest development changes +and might differ from your used server version. +Its recommended to consult the Swagger API UI of your Woodpecker server, +where you also have the chance to do manual exploration and live testing. + +` + +func main() { + setupSwaggerStaticConfig() + + specFile := createTempFileWithSwaggerSpec() + defer os.Remove(specFile) + markdown := generateTempMarkdown(specFile) + + f, err := os.Create(path.Join("..", "..", "docs", "docs", "20-usage", "90-rest-api.md")) + if err != nil { + panic(err) + } + defer f.Close() + _, err = f.WriteString(restApiMarkdownInto) + if err != nil { + panic(err) + } + _, err = f.WriteString(readGeneratedMarkdownAndSkipIntro(markdown)) + if err != nil { + panic(err) + } +} + +func createTempFileWithSwaggerSpec() string { + f, err := os.CreateTemp(os.TempDir(), "swagger.json") + if err != nil { + panic(err) + } + defer f.Close() + _, err = f.WriteString(docs.SwaggerInfo.ReadDoc()) + if err != nil { + panic(err) + } + return f.Name() +} + +func generateTempMarkdown(specFile string) string { + // HINT: we MUST use underscores, since the library tends to rename things + tempFile := fmt.Sprintf("woodpecker_api_%d.md", time.Now().UnixMilli()) + markdownFile := path.Join(os.TempDir(), tempFile) + + opts := generator.GenOpts{ + GenOptsCommon: generator.GenOptsCommon{ + Spec: specFile, + }, + } + // TODO: contrib upstream a GenerateMarkdown that use io.Reader and io.Writer + err := generator.GenerateMarkdown(markdownFile, []string{}, []string{}, &opts) + if err != nil { + panic(err) + } + + data, err := os.ReadFile(markdownFile) + if err != nil { + panic(err) + } + defer os.Remove(markdownFile) + + return string(data) +} + +func readGeneratedMarkdownAndSkipIntro(markdown string) string { + scanner := bufio.NewScanner(strings.NewReader(markdown)) + sb := strings.Builder{} + foundActualContentStart := false + for scanner.Scan() { + text := scanner.Text() + foundActualContentStart = foundActualContentStart || (strings.HasPrefix(text, "##") && strings.Contains(strings.ToLower(text), "all endpoints")) + if foundActualContentStart { + sb.WriteString(text + "\n") + } + } + return sb.String() +} diff --git a/docs/docs/92-development/08-swagger.md b/docs/docs/92-development/08-swagger.md new file mode 100644 index 000000000..6d8d99f6f --- /dev/null +++ b/docs/docs/92-development/08-swagger.md @@ -0,0 +1,76 @@ +# Swagger, API Spec and Code Generation + +Woodpecker uses [gin-swagger](https://github.com/swaggo/gin-swagger) middleware to automatically +generate Swagger v2 API specifications and a nice looking Web UI from the source code. +Also, the generated spec will be transformed into Markdown, using [go-swagger](https://github.com/go-swagger/go-swagger) +and then being using on the community's website documentation. + +It's paramount important to keep the gin handler function's godoc documentation up-to-date, +to always have accurate API documentation. +Whenever you change, add or enhance an API endpoint, please update the godocs. + +You don't require any extra tools on your machine, all Swagger tooling is automatically fetched by standard Go tools. + +### Gin-Handler API documentation guideline + +Here's a typical example of how annotations for Swagger documentation look like... + +```text +--- server/api/user.go --- +// @Summary Get a user +// @Description Returns a user with the specified login name. Requires admin rights. +// @Router /users/{login} [get] +// @Produce json +// @Success 200 {object} User +// @Tags Users +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param login path string true "the user's login name" +// @Param foobar query string false "optional foobar parameter" +// @Param page query int false "for response pagination, page offset number" default(1) +// @Param perPage query int false "for response pagination, max items per page" default(50) +``` + +```text +--- server/model/user.go --- +type User struct { + ID int64 `json:"id" xorm:"pk autoincr 'user_id'"` +// ... +} // @name User +``` + +These guidelines aim to have consistent wording in the swagger doc: +* first word after `@Summary` and `@Summary` are always uppercase +* `@Summary` has no . (dot) at the end of the line +* model structs shall use custom short names, to ease life for API consumers, using `@name` +* `@Success` object or array declarations shall be short, this means the actual `model.User` struct must have a `@name` annotation, so that the model can be renderend in Swagger +* when pagination is used, `@Parame page` and `@Parame perPage` must be added manually +* `@Param Authorization` is almost always present, there are just a few un-protected endpoints + +There are many examples in the server/api package, which you can use a blueprint. +More enhanced information you can find here https://github.com/swaggo/swag/blob/master/README.md#declarative-comments-format + +### Manual code generation + +##### generate the server's Go code containing the Swagger + +```shell +make generate-swagger +``` + +##### update the Markdown in the ./docs folder + +```shell +make docs +``` + +##### auto-format swagger related godoc + +```shell +go run github.com/swaggo/swag/cmd/swag@latest fmt -g server/api/z.go +``` + +**WARNING, known issue**: using swag v1.18.12 , there's a bug when running the `fmt` command, +which makes the swagger generator failing, because it can't find the models/structs/types anymore. +To fix it, please replace `// @name\tModelName` with `// @name ModelName`, +which means, replace the tab (`\t`) with a space (` `). +See https://github.com/swaggo/swag/pull/1594 == once this is merged and released, the mentioned issue is obsolete. diff --git a/go.mod b/go.mod index 715457184..884b33e4e 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( github.com/gin-gonic/gin v1.9.1 github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf github.com/go-sql-driver/mysql v1.7.1 + github.com/go-swagger/go-swagger v0.30.4 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/google/go-github/v39 v39.2.0 github.com/google/tink/go v1.7.0 @@ -38,6 +39,9 @@ require ( github.com/robfig/cron v1.2.0 github.com/rs/zerolog v1.29.1 github.com/stretchr/testify v1.8.3 + github.com/swaggo/files v1.0.1 + github.com/swaggo/gin-swagger v1.6.0 + github.com/swaggo/swag v1.16.1 github.com/tevino/abool v1.2.0 github.com/urfave/cli/v2 v2.25.3 github.com/xanzy/go-gitlab v0.83.0 @@ -59,7 +63,12 @@ require ( require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/KyleBanks/depth v1.2.1 // indirect + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/semver/v3 v3.2.0 // indirect + github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bytedance/sonic v1.9.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -74,9 +83,17 @@ require ( github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-fed/httpsig v1.1.0 // indirect github.com/go-logr/logr v1.2.3 // indirect + github.com/go-openapi/analysis v0.21.4 // indirect + github.com/go-openapi/errors v0.20.3 // indirect + github.com/go-openapi/inflect v0.19.0 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/loads v0.21.2 // indirect + github.com/go-openapi/runtime v0.25.0 // indirect + github.com/go-openapi/spec v0.20.8 // indirect + github.com/go-openapi/strfmt v0.21.3 // indirect github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/validate v0.22.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.14.0 // indirect @@ -92,43 +109,61 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.2 // indirect github.com/hashicorp/go-version v1.5.0 // indirect - github.com/imdario/mergo v0.3.6 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/huandu/xstrings v1.3.3 // indirect + github.com/imdario/mergo v0.3.12 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/kr/fs v0.1.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/libdns/libdns v0.2.1 // indirect + github.com/magiconair/properties v1.8.6 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mholt/acmez v1.0.4 // indirect github.com/miekg/dns v1.1.50 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/oklog/ulid v1.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pkg/sftp v1.13.5 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/shopspring/decimal v1.2.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect + github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.14.0 // indirect github.com/stretchr/objx v0.5.0 // indirect + github.com/subosito/gotenv v1.4.1 // indirect github.com/syndtr/goleveldb v1.0.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + go.mongodb.org/mongo-driver v1.11.1 // indirect go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.6.0 // indirect + go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.23.0 // indirect golang.org/x/arch v0.3.0 // indirect golang.org/x/mod v0.9.0 // indirect @@ -140,6 +175,7 @@ require ( google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gotest.tools/v3 v3.4.0 // indirect k8s.io/klog/v2 v2.90.1 // indirect diff --git a/go.sum b/go.sum index 7fddb891c..d6f11123b 100644 --- a/go.sum +++ b/go.sum @@ -1,21 +1,68 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= code.gitea.io/sdk/gitea v0.15.1-0.20221016183512-2d9ee57af1e0 h1:AKpsCoOtVrWWBtANM9319pwCB5ihx1Sdvr1HSbAwr54= code.gitea.io/sdk/gitea v0.15.1-0.20221016183512-2d9ee57af1e0/go.mod h1:ndkDk99BnfiUCCYEUhpNzi0lpmApXlwRFqClBlOlEBg= codeberg.org/6543/go-yaml2json v1.0.0 h1:heGqo9VEi7gY2yNqjj7X4ADs5nzlFIbGsJtgYDLrnig= codeberg.org/6543/go-yaml2json v1.0.0/go.mod h1:mz61q14LWF4ZABrgMEDMmk3t9dPi6zgR1uBh2VKV2RQ= codeberg.org/6543/xyaml v1.1.0 h1:0PWTy8OUqshshjrrnAXFWXSPUEa8R49DIh2ah07SxFc= codeberg.org/6543/xyaml v1.1.0/go.mod h1:jI7afXLZUxeL4rNNsG1SlHh78L+gma9lK1bIebyFZwA= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= gitee.com/travelliu/dm v1.8.11192/go.mod h1:DHTzyhCrM843x9VdKVbZ+GKXGRbKM2sJ4LxihRxShkE= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= +github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= +github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= @@ -34,6 +81,9 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= @@ -47,8 +97,6 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bmatcuk/doublestar/v4 v4.6.0 h1:HTuxyug8GyFbRkrffIpzNCSK4luc0TY3wzXvzIZhEXc= github.com/bmatcuk/doublestar/v4 v4.6.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA= -github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/caddyserver/certmagic v0.17.2 h1:o30seC1T/dBqBCNNGNHWwj2i5/I/FMjBbTAhjADP3nE= @@ -62,8 +110,14 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= @@ -110,30 +164,37 @@ github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaB github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf h1:NrF81UtW8gG2LBGkXFQFqlfNnvMt9WdB46sfdJY4oqc= github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8= -github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf h1:Ab5yBsD/dXhFmgf2hX7T/YYr+VK0Df7SrIxyNztT9YE= github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf/go.mod h1:+4SUDMvPlRMUPW5PlMTbxj3U5a4fWasBIbakUw7Kp6c= github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -143,19 +204,49 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= +github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc= +github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= +github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.3 h1:rz6kiC84sqNQoqrtulzaL/VERgkoCyB6WdEkc2ujzUc= +github.com/go-openapi/errors v0.20.3/go.mod h1:Z3FlZ4I8jEGxjUK+bugx3on2mIAk4txuAOhlsB1FSgk= +github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= +github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= +github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro= +github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= +github.com/go-openapi/runtime v0.25.0 h1:7yQTCdRbWhX8vnIjdzU8S00tBYf7Sg71EBeorlPHvhc= +github.com/go-openapi/runtime v0.25.0/go.mod h1:Ux6fikcHXyyob6LNWxtE96hWwjBPYF0DXgVFuMTneOs= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/spec v0.20.8 h1:ubHmXNY3FCIOinT8RNrrPfGc9t7I1qhPtdOGoG2AxRU= +github.com/go-openapi/spec v0.20.8/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= +github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= +github.com/go-openapi/strfmt v0.21.3 h1:xwhj5X6CjXEZZHMWy1zKJxvW9AfHC9pkyUjLvHtKG7o= +github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/validate v0.22.0 h1:b0QecH6VslW/TxtpKgzpO1SNG7GU2FsaqKdP1E2T50Y= +github.com/go-openapi/validate v0.22.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= -github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -163,10 +254,34 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-swagger/go-swagger v0.30.4 h1:cPrWLSXY6ZdcgfRicOj0lANg72TkTHz6uv/OlUdzO5U= +github.com/go-swagger/go-swagger v0.30.4/go.mod h1:YM5D5kR9c1ft3ynMXvDk2uo/7UZHKFEqKXcAL9f4Phc= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/goccy/go-json v0.8.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= -github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -184,10 +299,20 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -195,6 +320,8 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= @@ -211,8 +338,12 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= @@ -224,13 +355,31 @@ github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/tink/go v1.7.0 h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w= github.com/google/tink/go v1.7.0/go.mod h1:GAUOd+QE3pgj9q8VKIGTCP33c/B7eb4NhxLcgTJZStM= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -248,7 +397,7 @@ github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.16.2 h1:K4ev2ib4LdQETX5cSZBG0DVLk1jwGqSPXBjdah3veNs= +github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= @@ -265,15 +414,22 @@ github.com/hashicorp/go-version v1.5.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= +github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= @@ -323,7 +479,9 @@ github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0f github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -334,16 +492,19 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0= -github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -355,6 +516,7 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -362,8 +524,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lafriks/ttlcache/v3 v3.2.0 h1:F0+t8giTLeTfuEksG6hII57dowQzaRLM+k4bSWqV6Bc= github.com/lafriks/ttlcache/v3 v3.2.0/go.mod h1:oxu8nlxF496noT0VKBf2gDQWHA6VDjoGFnn4qw9wAac= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -378,8 +538,15 @@ github.com/libdns/libdns v0.2.1/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSO github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -394,8 +561,6 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -413,12 +578,22 @@ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/moby v20.10.24+incompatible h1:hjfxUufgeyrgolyaOWASyR9SvehpNcq/QHp/tx4VgsM= github.com/moby/moby v20.10.24+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= @@ -430,6 +605,7 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 h1:j2kD3MT1z4PXCiUllUJF9mWUESr9TWKS7iEKsQ/IipM= @@ -444,8 +620,11 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -472,18 +651,21 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/sftp v1.13.5 h1:a3RLUqkyjYRtBTZJZ1VRrKbN3zhuPLlUc3sphVz81go= github.com/pkg/sftp v1.13.5/go.mod h1:wHDZ0IZX6JcBYRK1TH9bcVq8G7TLpVHYIGJRFnmPfxg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -519,8 +701,12 @@ github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qq github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -536,9 +722,11 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= @@ -547,10 +735,20 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU= +github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -570,19 +768,26 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= +github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= +github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= +github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= +github.com/swaggo/swag v1.16.1 h1:fTNRhKstPKxcnoKsytm4sahr8FaYzUcT7i1/3nd/fBg= +github.com/swaggo/swag v1.16.1/go.mod h1:9/LMvHycG3NFHfR6LwvikHv5iFvmPADQ359cKikGxto= github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA= github.com/tevino/abool v1.2.0/go.mod h1:qc66Pna1RiIsPa7O4Egxxs9OqkuxDX55zznh9K07Tzg= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU= -github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -591,6 +796,11 @@ github.com/urfave/cli/v2 v2.25.3 h1:VJkt6wvEBOoSjPFQvOkv6iWIrsJyCrKGtCtxXWwmGeY= github.com/urfave/cli/v2 v2.25.3/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/xanzy/go-gitlab v0.83.0 h1:37p0MpTPNbsTMKX/JnmJtY8Ch1sFiJzVF342+RvZEGw= github.com/xanzy/go-gitlab v0.83.0/go.mod h1:5ryv+MnpZStBH8I/77HuQBsMbBGANtVpLWC15qOjWAw= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= @@ -600,7 +810,10 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= @@ -608,9 +821,19 @@ github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxt github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= +go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= +go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= +go.mongodb.org/mongo-driver v1.11.1 h1:QP0znIRTuL0jf1oBQoAoM0C6ZJfBK4kx0Uumtv1A7w8= +go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -623,8 +846,9 @@ go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -632,7 +856,6 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= @@ -641,36 +864,66 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53 h1:5llv2sWeaMSnA3w2kS57ouQQ4pudlXrR0dCgw51QK9o= golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= @@ -687,32 +940,66 @@ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/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-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= @@ -727,23 +1014,50 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -756,8 +1070,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= @@ -765,19 +1079,26 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -787,19 +1108,61 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -813,18 +1176,72 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -832,11 +1249,22 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -845,8 +1273,10 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= @@ -855,6 +1285,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= @@ -865,6 +1296,8 @@ gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 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= @@ -873,9 +1306,11 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -884,8 +1319,12 @@ gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.27.1 h1:Z6zUGQ1Vd10tJ+gHcNNNgkV5emCyW+v2XTmn+CLjSd0= k8s.io/api v0.27.1/go.mod h1:z5g/BpAiD+f6AArpqNjkY+cji8ueZDU/WV1jcj5Jk4E= k8s.io/apimachinery v0.27.1 h1:EGuZiLI95UQQcClhanryclaQE6xjg1Bts6/L3cD7zyc= @@ -1007,7 +1446,10 @@ modernc.org/tcl v1.8.13/go.mod h1:V+q/Ef0IJaNUSECieLU4o+8IScapxnMyFV6i/7uQlAY= modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.2.19/go.mod h1:+ZpP0pc4zz97eukOzW3xagV/lS82IpPN9NGG5pNF9vY= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= diff --git a/server/api/agent.go b/server/api/agent.go index 7fdeaff5e..30f366398 100644 --- a/server/api/agent.go +++ b/server/api/agent.go @@ -28,6 +28,16 @@ import ( "github.com/woodpecker-ci/woodpecker/server/store" ) +// GetAgents +// +// @Summary Get agent list +// @Router /agents [get] +// @Produce json +// @Success 200 {array} Agent +// @Tags Agents +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param page query int false "for response pagination, page offset number" default(1) +// @Param perPage query int false "for response pagination, max items per page" default(50) func GetAgents(c *gin.Context) { agents, err := store.FromContext(c).AgentList(session.Pagination(c)) if err != nil { @@ -37,6 +47,15 @@ func GetAgents(c *gin.Context) { c.JSON(http.StatusOK, agents) } +// GetAgent +// +// @Summary Get agent information +// @Router /agents/{agent} [get] +// @Produce json +// @Success 200 {object} Agent +// @Tags Agents +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param agent path int true "the agent's id" func GetAgent(c *gin.Context) { agentID, err := strconv.ParseInt(c.Param("agent"), 10, 64) if err != nil { @@ -52,6 +71,15 @@ func GetAgent(c *gin.Context) { c.JSON(http.StatusOK, agent) } +// GetAgentTasks +// +// @Summary Get agent tasks +// @Router /agents/{agent}/tasks [get] +// @Produce json +// @Success 200 {array} Task +// @Tags Agents +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param agent path int true "the agent's id" func GetAgentTasks(c *gin.Context) { agentID, err := strconv.ParseInt(c.Param("agent"), 10, 64) if err != nil { @@ -76,6 +104,16 @@ func GetAgentTasks(c *gin.Context) { c.JSON(http.StatusOK, tasks) } +// PatchAgent +// +// @Summary Update agent information +// @Router /agents/{agent} [patch] +// @Produce json +// @Success 200 {object} Agent +// @Tags Agents +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param agent path int true "the agent's id" +// @Param agentData body Agent true "the agent's data" func PatchAgent(c *gin.Context) { _store := store.FromContext(c) @@ -109,7 +147,15 @@ func PatchAgent(c *gin.Context) { c.JSON(http.StatusOK, agent) } -// PostAgent create a new agent with a random token so a new agent can connect to the server +// PostAgent +// +// @Summary Create a new agent with a random token so a new agent can connect to the server +// @Router /agents [post] +// @Produce json +// @Success 200 {object} Agent +// @Tags Agents +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param agent body Agent true "the agent's data (only 'name' and 'no_schedule' are read)" func PostAgent(c *gin.Context) { in := &model.Agent{} err := c.Bind(in) @@ -135,6 +181,15 @@ func PostAgent(c *gin.Context) { c.JSON(http.StatusOK, agent) } +// DeleteAgent +// +// @Summary Delete an agent +// @Router /agents/{agent} [delete] +// @Produce plain +// @Success 200 +// @Tags Agents +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param agent path int true "the agent's id" func DeleteAgent(c *gin.Context) { _store := store.FromContext(c) diff --git a/server/api/badge.go b/server/api/badge.go index bc0f5e4a1..9b44b7813 100644 --- a/server/api/badge.go +++ b/server/api/badge.go @@ -34,6 +34,15 @@ import ( "github.com/woodpecker-ci/woodpecker/server/store/types" ) +// GetBadge +// +// @Summary Get status badge, SVG format +// @Router /badges/{owner}/{name}/status.svg [get] +// @Produce image/svg+xml +// @Success 200 +// @Tags Badges +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" func GetBadge(c *gin.Context) { _store := store.FromContext(c) repo, err := _store.GetRepoName(c.Param("owner") + "/" + c.Param("name")) @@ -65,6 +74,18 @@ func GetBadge(c *gin.Context) { c.String(http.StatusOK, badges.Generate(pipeline)) } +// GetCC +// +// @Summary Provide pipeline status information to the CCMenu tool +// @Description CCMenu displays the pipeline status of projects on a CI server as an item in the Mac's menu bar. +// @Description More details on how to install, you can find at http://ccmenu.org/ +// @Description The response format adheres to CCTray v1 Specification, https://cctray.org/v1/ +// @Router /badges/{owner}/{name}/cc.xml [get] +// @Produce xml +// @Success 200 +// @Tags Badges +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" func GetCC(c *gin.Context) { _store := store.FromContext(c) repo, err := _store.GetRepoName(c.Param("owner") + "/" + c.Param("name")) diff --git a/server/api/cron.go b/server/api/cron.go index 78b39dac1..a98bb83d9 100644 --- a/server/api/cron.go +++ b/server/api/cron.go @@ -28,8 +28,17 @@ import ( "github.com/woodpecker-ci/woodpecker/server/store" ) -// GetCron gets a cron job by id from the database and writes -// to the response in json format. +// GetCron +// +// @Summary Get a cron job by id +// @Router /repos/{owner}/{name}/cron/{cron} [get] +// @Produce json +// @Success 200 {object} Cron +// @Tags Repository cron jobs +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param cron path string true "the cron job id" func GetCron(c *gin.Context) { repo := session.Repo(c) id, err := strconv.ParseInt(c.Param("cron"), 10, 64) @@ -46,7 +55,17 @@ func GetCron(c *gin.Context) { c.JSON(http.StatusOK, cron) } -// RunCron starts a cron job now. +// RunCron +// +// @Summary Start a cron job now +// @Router /repos/{owner}/{name}/cron/{cron} [post] +// @Produce json +// @Success 200 {object} Pipeline +// @Tags Repository cron jobs +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param cron path string true "the cron job id" func RunCron(c *gin.Context) { repo := session.Repo(c) _store := store.FromContext(c) @@ -77,7 +96,17 @@ func RunCron(c *gin.Context) { c.JSON(http.StatusOK, pl) } -// PostCron persists the cron job to the database. +// PostCron +// +// @Summary Persist/creat a cron job +// @Router /repos/{owner}/{name}/cron [post] +// @Produce json +// @Success 200 {object} Cron +// @Tags Repository cron jobs +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param cronJob body Cron true "the new cron job" func PostCron(c *gin.Context) { repo := session.Repo(c) user := session.User(c) @@ -124,7 +153,18 @@ func PostCron(c *gin.Context) { c.JSON(http.StatusOK, cron) } -// PatchCron updates the cron job in the database. +// PatchCron +// +// @Summary Update a cron job +// @Router /repos/{owner}/{name}/cron/{cron} [patch] +// @Produce json +// @Success 200 {object} Cron +// @Tags Repository cron jobs +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param cron path string true "the cron job id" +// @Param cronJob body Cron true "the cron job data" func PatchCron(c *gin.Context) { repo := session.Repo(c) user := session.User(c) @@ -183,8 +223,18 @@ func PatchCron(c *gin.Context) { c.JSON(http.StatusOK, cron) } -// GetCronList gets the cron job list from the database and writes -// to the response in json format. +// GetCronList +// +// @Summary Get the cron job list +// @Router /repos/{owner}/{name}/cron [get] +// @Produce json +// @Success 200 {array} Cron +// @Tags Repository cron jobs +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param page query int false "for response pagination, page offset number" default(1) +// @Param perPage query int false "for response pagination, max items per page" default(50) func GetCronList(c *gin.Context) { repo := session.Repo(c) list, err := store.FromContext(c).CronList(repo, session.Pagination(c)) @@ -195,7 +245,17 @@ func GetCronList(c *gin.Context) { c.JSON(http.StatusOK, list) } -// DeleteCron deletes the named cron job from the database. +// DeleteCron +// +// @Summary Delete a cron job by id +// @Router /repos/{owner}/{name}/cron/{cron} [delete] +// @Produce plain +// @Success 200 +// @Tags Repository cron jobs +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param cron path string true "the cron job id" func DeleteCron(c *gin.Context) { repo := session.Repo(c) id, err := strconv.ParseInt(c.Param("cron"), 10, 64) diff --git a/server/api/debug/debug.go b/server/api/debug/debug.go index 09c8e41a9..fa28055ad 100644 --- a/server/api/debug/debug.go +++ b/server/api/debug/debug.go @@ -20,63 +20,146 @@ import ( "github.com/gin-gonic/gin" ) -// IndexHandler will pass the call from /debug/pprof to pprof +// IndexHandler +// +// @Summary List available pprof profiles (HTML) +// @Description Only available, when server was started with WOODPECKER_LOG_LEVEL=debug +// @Router /debug/pprof [get] +// @Produce html +// @Success 200 +// @Tags Process profiling and debugging +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func IndexHandler() gin.HandlerFunc { return func(c *gin.Context) { pprof.Index(c.Writer, c.Request) } } -// HeapHandler will pass the call from /debug/pprof/heap to pprof +// HeapHandler +// +// @Summary Get pprof heap dump, a sampling of memory allocations of live objects +// @Description Only available, when server was started with WOODPECKER_LOG_LEVEL=debug +// @Router /debug/pprof/heap [get] +// @Produce plain +// @Success 200 +// @Tags Process profiling and debugging +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param gc query string false "You can specify gc=heap to run GC before taking the heap sample" default() func HeapHandler() gin.HandlerFunc { return func(c *gin.Context) { pprof.Handler("heap").ServeHTTP(c.Writer, c.Request) } } -// GoroutineHandler will pass the call from /debug/pprof/goroutine to pprof +// GoroutineHandler +// +// @Summary Get pprof stack traces of all current goroutines +// @Description Only available, when server was started with WOODPECKER_LOG_LEVEL=debug +// @Router /debug/pprof/goroutine [get] +// @Produce plain +// @Success 200 +// @Tags Process profiling and debugging +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param debug query int false "Use debug=2 as a query parameter to export in the same format as an un-recovered panic" default(1) func GoroutineHandler() gin.HandlerFunc { return func(c *gin.Context) { pprof.Handler("goroutine").ServeHTTP(c.Writer, c.Request) } } -// BlockHandler will pass the call from /debug/pprof/block to pprof +// BlockHandler +// +// @Summary Get pprof stack traces that led to blocking on synchronization primitives +// @Description Only available, when server was started with WOODPECKER_LOG_LEVEL=debug +// @Router /debug/pprof/block [get] +// @Produce plain +// @Success 200 +// @Tags Process profiling and debugging +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func BlockHandler() gin.HandlerFunc { return func(c *gin.Context) { pprof.Handler("block").ServeHTTP(c.Writer, c.Request) } } -// ThreadCreateHandler will pass the call from /debug/pprof/threadcreate to pprof +// ThreadCreateHandler +// +// @Summary Get pprof stack traces that led to the creation of new OS threads +// @Description Only available, when server was started with WOODPECKER_LOG_LEVEL=debug +// @Router /debug/pprof/threadcreate [get] +// @Produce plain +// @Success 200 +// @Tags Process profiling and debugging +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func ThreadCreateHandler() gin.HandlerFunc { return func(c *gin.Context) { pprof.Handler("threadcreate").ServeHTTP(c.Writer, c.Request) } } -// CmdlineHandler will pass the call from /debug/pprof/cmdline to pprof +// CmdlineHandler +// +// @Summary Get the command line invocation of the current program +// @Description Only available, when server was started with WOODPECKER_LOG_LEVEL=debug +// @Router /debug/pprof/cmdline [get] +// @Produce plain +// @Success 200 +// @Tags Process profiling and debugging +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func CmdlineHandler() gin.HandlerFunc { return func(c *gin.Context) { pprof.Cmdline(c.Writer, c.Request) } } -// ProfileHandler will pass the call from /debug/pprof/profile to pprof +// ProfileHandler +// +// @Summary Get pprof CPU profile +// @Description Only available, when server was started with WOODPECKER_LOG_LEVEL=debug +// @Description After you get the profile file, use the go tool pprof command to investigate the profile. +// @Router /debug/pprof/profile [get] +// @Produce plain +// @Success 200 +// @Tags Process profiling and debugging +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param seconds query int true "You can specify the duration in the seconds GET parameter." default (30) func ProfileHandler() gin.HandlerFunc { return func(c *gin.Context) { pprof.Profile(c.Writer, c.Request) } } -// SymbolHandler will pass the call from /debug/pprof/symbol to pprof +// SymbolHandler +// +// @Summary Get pprof program counters mapping to function names +// @Description Only available, when server was started with WOODPECKER_LOG_LEVEL=debug +// @Description Looks up the program counters listed in the request, +// @Description responding with a table mapping program counters to function names. +// @Description The requested program counters can be provided via GET + query parameters, +// @Description or POST + body parameters. Program counters shall be space delimited. +// @Router /debug/pprof/symbol [get] +// @Router /debug/pprof/symbol [post] +// @Produce plain +// @Success 200 +// @Tags Process profiling and debugging +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func SymbolHandler() gin.HandlerFunc { return func(c *gin.Context) { pprof.Symbol(c.Writer, c.Request) } } -// TraceHandler will pass the call from /debug/pprof/trace to pprof +// TraceHandler +// +// @Summary Get a trace of execution of the current program +// @Description Only available, when server was started with WOODPECKER_LOG_LEVEL=debug +// @Description After you get the profile file, use the go tool pprof command to investigate the profile. +// @Router /debug/pprof/trace [get] +// @Produce plain +// @Success 200 +// @Tags Process profiling and debugging +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param seconds query int true "You can specify the duration in the seconds GET parameter." default (30) func TraceHandler() gin.HandlerFunc { return func(c *gin.Context) { pprof.Trace(c.Writer, c.Request) diff --git a/server/api/global_secret.go b/server/api/global_secret.go index 49b4f0e91..0d78eb06e 100644 --- a/server/api/global_secret.go +++ b/server/api/global_secret.go @@ -24,8 +24,16 @@ import ( "github.com/woodpecker-ci/woodpecker/server/model" ) -// GetGlobalSecretList gets the global secret list from -// the database and writes to the response in json format. +// GetGlobalSecretList +// +// @Summary Get the global secret list +// @Router /secrets [get] +// @Produce json +// @Success 200 {array} Secret +// @Tags Secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param page query int false "for response pagination, page offset number" default(1) +// @Param perPage query int false "for response pagination, max items per page" default(50) func GetGlobalSecretList(c *gin.Context) { list, err := server.Config.Services.Secrets.GlobalSecretList(session.Pagination(c)) if err != nil { @@ -40,8 +48,15 @@ func GetGlobalSecretList(c *gin.Context) { c.JSON(http.StatusOK, list) } -// GetGlobalSecret gets the named global secret from the database -// and writes to the response in json format. +// GetGlobalSecret +// +// @Summary Get a global secret by name +// @Router /secrets/{secret} [get] +// @Produce json +// @Success 200 {object} Secret +// @Tags Secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param secret path string true "the secret's name" func GetGlobalSecret(c *gin.Context) { name := c.Param("secret") secret, err := server.Config.Services.Secrets.GlobalSecretFind(name) @@ -52,7 +67,15 @@ func GetGlobalSecret(c *gin.Context) { c.JSON(http.StatusOK, secret.Copy()) } -// PostGlobalSecret persists a global secret to the database. +// PostGlobalSecret +// +// @Summary Persist/create a global secret +// @Router /secrets [post] +// @Produce json +// @Success 200 {object} Secret +// @Tags Secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param secret body Secret true "the secret object data" func PostGlobalSecret(c *gin.Context) { in := new(model.Secret) if err := c.Bind(in); err != nil { @@ -77,7 +100,16 @@ func PostGlobalSecret(c *gin.Context) { c.JSON(http.StatusOK, secret.Copy()) } -// PatchGlobalSecret updates a global secret in the database. +// PatchGlobalSecret +// +// @Summary Update a global secret by name +// @Router /secrets/{secret} [patch] +// @Produce json +// @Success 200 {object} Secret +// @Tags Secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param secret path string true "the secret's name" +// @Param secretData body Secret true "the secret's data" func PatchGlobalSecret(c *gin.Context) { name := c.Param("secret") @@ -115,7 +147,15 @@ func PatchGlobalSecret(c *gin.Context) { c.JSON(http.StatusOK, secret.Copy()) } -// DeleteGlobalSecret deletes the named global secret from the database. +// DeleteGlobalSecret +// +// @Summary Delete a global secret by name +// @Router /secrets/{secret} [delete] +// @Produce plain +// @Success 200 +// @Tags Secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param secret path string true "the secret's name" func DeleteGlobalSecret(c *gin.Context) { name := c.Param("secret") if err := server.Config.Services.Secrets.GlobalSecretDelete(name); err != nil { diff --git a/server/api/hook.go b/server/api/hook.go index e6089d14e..51f8979c1 100644 --- a/server/api/hook.go +++ b/server/api/hook.go @@ -35,22 +35,55 @@ import ( var skipRe = regexp.MustCompile(`\[(?i:ci *skip|skip *ci)\]`) +// GetQueueInfo +// +// @Summary Get pipeline queue information +// @Description TODO: link the InfoT response object - this is blocked, until the `swaggo/swag` tool dependency is v1.18.12 or newer +// @Router /queue/info [get] +// @Produce json +// @Success 200 {object} map[string]string +// @Tags Pipeline queues +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func GetQueueInfo(c *gin.Context) { c.IndentedJSON(http.StatusOK, server.Config.Services.Queue.Info(c), ) } +// PauseQueue +// +// @Summary Pause a pipeline queue +// @Router /queue/pause [post] +// @Produce plain +// @Success 200 +// @Tags Pipeline queues +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func PauseQueue(c *gin.Context) { server.Config.Services.Queue.Pause() c.Status(http.StatusOK) } +// ResumeQueue +// +// @Summary Resume a pipeline queue +// @Router /queue/resume [post] +// @Produce plain +// @Success 200 +// @Tags Pipeline queues +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func ResumeQueue(c *gin.Context) { server.Config.Services.Queue.Resume() c.Status(http.StatusOK) } +// BlockTilQueueHasRunningItem +// +// @Summary Block til pipeline queue has a running item +// @Router /queue/norunningpipelines [get] +// @Produce plain +// @Success 200 +// @Tags Pipeline queues +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func BlockTilQueueHasRunningItem(c *gin.Context) { for { info := server.Config.Services.Queue.Info(c) @@ -61,7 +94,14 @@ func BlockTilQueueHasRunningItem(c *gin.Context) { c.Status(http.StatusOK) } -// PostHook start a pipeline triggered by a forges post webhook +// PostHook +// +// @Summary Incoming webhook from forge +// @Router /hook [post] +// @Produce plain +// @Success 200 +// @Tags System +// @Param hook body object true "the webhook payload; forge is automatically detected" func PostHook(c *gin.Context) { _store := store.FromContext(c) forge := server.Config.Services.Forge diff --git a/server/api/org.go b/server/api/org.go index e79a3ae31..90f409576 100644 --- a/server/api/org.go +++ b/server/api/org.go @@ -24,7 +24,15 @@ import ( "github.com/gin-gonic/gin" ) -// GetOrgPermissions returns the permissions of the current user in the given organization. +// GetOrgPermissions +// +// @Summary Get the permissions of the current user in the given organization +// @Router /orgs/{owner}/permissions [get] +// @Produce json +// @Success 200 {array} OrgPerm +// @Tags Organization permissions +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the owner's name" func GetOrgPermissions(c *gin.Context) { var ( err error diff --git a/server/api/org_secret.go b/server/api/org_secret.go index 16fcffca2..9f5d388df 100644 --- a/server/api/org_secret.go +++ b/server/api/org_secret.go @@ -24,8 +24,16 @@ import ( "github.com/woodpecker-ci/woodpecker/server/model" ) -// GetOrgSecret gets the named organization secret from the database -// and writes to the response in json format. +// GetOrgSecret +// +// @Summary Get the named organization secret +// @Router /orgs/{owner}/secrets/{secret} [get] +// @Produce json +// @Success 200 {object} Secret +// @Tags Organization secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the owner's name" +// @Param secret path string true "the secret's name" func GetOrgSecret(c *gin.Context) { var ( owner = c.Param("owner") @@ -39,8 +47,17 @@ func GetOrgSecret(c *gin.Context) { c.JSON(http.StatusOK, secret.Copy()) } -// GetOrgSecretList gets the organization secret list from -// the database and writes to the response in json format. +// GetOrgSecretList +// +// @Summary Get the organization secret list +// @Router /orgs/{owner}/secrets [get] +// @Produce json +// @Success 200 {array} Secret +// @Tags Organization secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the owner's name" +// @Param page query int false "for response pagination, page offset number" default(1) +// @Param perPage query int false "for response pagination, max items per page" default(50) func GetOrgSecretList(c *gin.Context) { owner := c.Param("owner") list, err := server.Config.Services.Secrets.OrgSecretList(owner, session.Pagination(c)) @@ -56,7 +73,16 @@ func GetOrgSecretList(c *gin.Context) { c.JSON(http.StatusOK, list) } -// PostOrgSecret persists an organization secret to the database. +// PostOrgSecret +// +// @Summary Persist/create an organization secret +// @Router /orgs/{owner}/secrets [post] +// @Produce json +// @Success 200 {object} Secret +// @Tags Organization secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the owner's name" +// @Param secretData body Secret true "the new secret" func PostOrgSecret(c *gin.Context) { owner := c.Param("owner") @@ -84,7 +110,17 @@ func PostOrgSecret(c *gin.Context) { c.JSON(http.StatusOK, secret.Copy()) } -// PatchOrgSecret updates an organization secret in the database. +// PatchOrgSecret +// +// @Summary Update an organization secret +// @Router /orgs/{owner}/secrets/{secret} [patch] +// @Produce json +// @Success 200 {object} Secret +// @Tags Organization secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the owner's name" +// @Param secret path string true "the secret's name" +// @Param secretData body Secret true "the update secret data" func PatchOrgSecret(c *gin.Context) { var ( owner = c.Param("owner") @@ -125,7 +161,16 @@ func PatchOrgSecret(c *gin.Context) { c.JSON(http.StatusOK, secret.Copy()) } -// DeleteOrgSecret deletes the named organization secret from the database. +// DeleteOrgSecret +// +// @Summary Delete the named secret from an organization +// @Router /orgs/{owner}/secrets/{secret} [delete] +// @Produce plain +// @Success 200 +// @Tags Organization secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the owner's name" +// @Param secret path string true "the secret's name" func DeleteOrgSecret(c *gin.Context) { var ( owner = c.Param("owner") diff --git a/server/api/pipeline.go b/server/api/pipeline.go index bd39af597..065fe4b1e 100644 --- a/server/api/pipeline.go +++ b/server/api/pipeline.go @@ -39,6 +39,17 @@ import ( "github.com/woodpecker-ci/woodpecker/server/store/types" ) +// CreatePipeline +// +// @Summary Run/trigger a pipelines +// @Router /repos/{owner}/{name}/pipelines [post] +// @Produce json +// @Success 200 {object} Pipeline +// @Tags Pipelines +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param options body PipelineOptions true "the options for the pipeline to run" func CreatePipeline(c *gin.Context) { _store := store.FromContext(c) repo := session.Repo(c) @@ -86,6 +97,18 @@ func createTmpPipeline(event model.WebhookEvent, commitSHA string, repo *model.R } } +// GetPipelines +// +// @Summary Get pipelines, current running and past ones +// @Router /repos/{owner}/{name}/pipelines [get] +// @Produce json +// @Success 200 {array} Pipeline +// @Tags Pipelines +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param page query int false "for response pagination, page offset number" default(1) +// @Param perPage query int false "for response pagination, max items per page" default(50) func GetPipelines(c *gin.Context) { repo := session.Repo(c) @@ -101,6 +124,17 @@ func GetPipelines(c *gin.Context) { c.JSON(http.StatusOK, pipelines) } +// GetPipeline +// +// @Summary Pipeline information by number +// @Router /repos/{owner}/{name}/pipelines/{number} [get] +// @Produce json +// @Success 200 {object} Pipeline +// @Tags Pipelines +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param number path int true "the number of the pipeline, OR 'latest'" func GetPipeline(c *gin.Context) { _store := store.FromContext(c) if c.Param("number") == "latest" { @@ -156,6 +190,19 @@ func GetPipelineLast(c *gin.Context) { c.JSON(http.StatusOK, pl) } +// GetPipelineLogs +// +// @Summary Log information per step +// @Router /repos/{owner}/{name}/logs/{number}/{pid}/{step} [get] +// @Produce plain +// @Success 200 +// @Tags Pipeline logs +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param number path int true "the number of the pipeline" +// @Param pid path int true "the pipeline id" +// @Param step path int true "the step name" func GetPipelineLogs(c *gin.Context) { _store := store.FromContext(c) repo := session.Repo(c) @@ -192,6 +239,18 @@ func GetPipelineLogs(c *gin.Context) { } } +// GetStepLogs +// +// @Summary Log information +// @Router /repos/{owner}/{name}/logs/{number}/{pid} [get] +// @Produce plain +// @Success 200 +// @Tags Pipeline logs +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param number path int true "the number of the pipeline" +// @Param pid path int true "the pipeline id" func GetStepLogs(c *gin.Context) { _store := store.FromContext(c) repo := session.Repo(c) @@ -227,6 +286,17 @@ func GetStepLogs(c *gin.Context) { } } +// GetPipelineConfig +// +// @Summary Pipeline configuration +// @Router /repos/{owner}/{name}/pipelines/{number}/config [get] +// @Produce json +// @Success 200 {array} Config +// @Tags Pipelines +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param number path int true "the number of the pipeline" func GetPipelineConfig(c *gin.Context) { _store := store.FromContext(c) repo := session.Repo(c) @@ -251,7 +321,17 @@ func GetPipelineConfig(c *gin.Context) { c.JSON(http.StatusOK, configs) } -// CancelPipeline cancels a pipeline +// CancelPipeline +// +// @Summary Cancels a pipeline +// @Router /repos/{owner}/{name}/pipelines/{number}/cancel [post] +// @Produce plain +// @Success 200 +// @Tags Pipelines +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param number path int true "the number of the pipeline" func CancelPipeline(c *gin.Context) { _store := store.FromContext(c) repo := session.Repo(c) @@ -271,7 +351,17 @@ func CancelPipeline(c *gin.Context) { } } -// PostApproval start pipelines in gated repos +// PostApproval +// +// @Summary Start pipelines in gated repos +// @Router /repos/{owner}/{name}/pipelines/{number}/approve [post] +// @Produce json +// @Success 200 {object} Pipeline +// @Tags Pipelines +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param number path int true "the number of the pipeline" func PostApproval(c *gin.Context) { var ( _store = store.FromContext(c) @@ -294,7 +384,17 @@ func PostApproval(c *gin.Context) { } } -// PostDecline decline pipelines in gated repos +// PostDecline +// +// @Summary Decline pipelines in gated repos +// @Router /repos/{owner}/{name}/pipelines/{number}/decline [post] +// @Produce json +// @Success 200 {object} Pipeline +// @Tags Pipelines +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param number path int true "the number of the pipeline" func PostDecline(c *gin.Context) { var ( _store = store.FromContext(c) @@ -317,6 +417,14 @@ func PostDecline(c *gin.Context) { } } +// GetPipelineQueue +// +// @Summary List pipeline queues +// @Router /pipelines [get] +// @Produce json +// @Success 200 {array} Feed +// @Tags Pipeline queues +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func GetPipelineQueue(c *gin.Context) { out, err := store.FromContext(c).GetPipelineQueue() if err != nil { @@ -326,7 +434,20 @@ func GetPipelineQueue(c *gin.Context) { c.JSON(http.StatusOK, out) } -// PostPipeline restarts a pipeline optional with altered event, deploy or environment +// PostPipeline +// +// @Summary Restart a pipeline +// @Description Restarts a pipeline optional with altered event, deploy or environment +// @Router /repos/{owner}/{name}/pipelines/{number} [post] +// @Produce json +// @Success 200 {object} Pipeline +// @Tags Pipelines +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param number path int true "the number of the pipeline" +// @Param event query string false "override the event type" +// @Param deploy_to query string false "override the target deploy value" func PostPipeline(c *gin.Context) { _store := store.FromContext(c) repo := session.Repo(c) @@ -396,6 +517,17 @@ func PostPipeline(c *gin.Context) { } } +// DeletePipelineLogs +// +// @Summary Deletes log +// @Router /repos/{owner}/{name}/logs/{number} [post] +// @Produce plain +// @Success 200 +// @Tags Pipeline logs +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param number path int true "the number of the pipeline" func DeletePipelineLogs(c *gin.Context) { _store := store.FromContext(c) diff --git a/server/api/registry.go b/server/api/registry.go index 368d184b3..0b86b3b45 100644 --- a/server/api/registry.go +++ b/server/api/registry.go @@ -24,8 +24,17 @@ import ( "github.com/woodpecker-ci/woodpecker/server/router/middleware/session" ) -// GetRegistry gets the name registry from the database and writes -// to the response in json format. +// GetRegistry +// +// @Summary Get a named registry +// @Router /repos/{owner}/{name}/registry/{registry} [get] +// @Produce json +// @Success 200 {object} Registry +// @Tags Repository registries +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param registry path string true "the registry name" func GetRegistry(c *gin.Context) { var ( repo = session.Repo(c) @@ -39,7 +48,17 @@ func GetRegistry(c *gin.Context) { c.JSON(200, registry.Copy()) } -// PostRegistry persists the registry to the database. +// PostRegistry +// +// @Summary Persist/create a registry +// @Router /repos/{owner}/{name}/registry [post] +// @Produce json +// @Success 200 {object} Registry +// @Tags Repository registries +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param registry body Registry true "the new registry data" func PostRegistry(c *gin.Context) { repo := session.Repo(c) @@ -67,7 +86,18 @@ func PostRegistry(c *gin.Context) { c.JSON(http.StatusOK, in.Copy()) } -// PatchRegistry updates the registry in the database. +// PatchRegistry +// +// @Summary Update a named registry +// @Router /repos/{owner}/{name}/registry/{registry} [patch] +// @Produce json +// @Success 200 {object} Registry +// @Tags Repository registries +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param registry path string true "the registry name" +// @Param registryData body Registry true "the attributes for the registry" func PatchRegistry(c *gin.Context) { var ( repo = session.Repo(c) @@ -110,8 +140,18 @@ func PatchRegistry(c *gin.Context) { c.JSON(http.StatusOK, in.Copy()) } -// GetRegistryList gets the registry list from the database and writes -// to the response in json format. +// GetRegistryList +// +// @Summary Get the registry list +// @Router /repos/{owner}/{name}/registry [get] +// @Produce json +// @Success 200 {array} Registry +// @Tags Repository registries +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param page query int false "for response pagination, page offset number" default(1) +// @Param perPage query int false "for response pagination, max items per page" default(50) func GetRegistryList(c *gin.Context) { repo := session.Repo(c) list, err := server.Config.Services.Registries.RegistryList(repo, session.Pagination(c)) @@ -127,7 +167,17 @@ func GetRegistryList(c *gin.Context) { c.JSON(http.StatusOK, list) } -// DeleteRegistry deletes the named registry from the database. +// DeleteRegistry +// +// @Summary Delete a named registry +// @Router /repos/{owner}/{name}/registry/{registry} [delete] +// @Produce plain +// @Success 200 +// @Tags Repository registries +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param registry path string true "the registry name" func DeleteRegistry(c *gin.Context) { var ( repo = session.Repo(c) diff --git a/server/api/repo.go b/server/api/repo.go index edc2b7cc5..266b6aec4 100644 --- a/server/api/repo.go +++ b/server/api/repo.go @@ -35,6 +35,16 @@ import ( "github.com/woodpecker-ci/woodpecker/shared/token" ) +// PostRepo +// +// @Summary Activate a repository +// @Router /repos/{owner}/{name} [post] +// @Produce json +// @Success 200 {object} Repo +// @Tags Repositories +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" func PostRepo(c *gin.Context) { forge := server.Config.Services.Forge _store := store.FromContext(c) @@ -134,6 +144,17 @@ func PostRepo(c *gin.Context) { c.JSON(http.StatusOK, repo) } +// PatchRepo +// +// @Summary Change a repository +// @Router /repos/{owner}/{name} [patch] +// @Produce json +// @Success 200 {object} Repo +// @Tags Repositories +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param repo body RepoPatch true "the repository's information" func PatchRepo(c *gin.Context) { _store := store.FromContext(c) repo := session.Repo(c) @@ -194,6 +215,16 @@ func PatchRepo(c *gin.Context) { c.JSON(http.StatusOK, repo) } +// ChownRepo +// +// @Summary Change a repository's owner, to the one holding the access token +// @Router /repos/{owner}/{name}/chown [post] +// @Produce json +// @Success 200 {object} Repo +// @Tags Repositories +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" func ChownRepo(c *gin.Context) { _store := store.FromContext(c) repo := session.Repo(c) @@ -208,15 +239,48 @@ func ChownRepo(c *gin.Context) { c.JSON(http.StatusOK, repo) } +// GetRepo +// +// @Summary Get repository information +// @Router /repos/{owner}/{name} [get] +// @Produce json +// @Success 200 {object} Repo +// @Tags Repositories +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" func GetRepo(c *gin.Context) { c.JSON(http.StatusOK, session.Repo(c)) } +// GetRepoPermissions +// +// @Summary Repository permission information +// @Description The repository permission, according to the used access token. +// @Router /repos/{owner}/{name}/permissions [get] +// @Produce json +// @Success 200 {object} Perm +// @Tags Repositories +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" func GetRepoPermissions(c *gin.Context) { perm := session.Perm(c) c.JSON(http.StatusOK, perm) } +// GetRepoBranches +// +// @Summary Get repository branches +// @Router /repos/{owner}/{name}/branches [get] +// @Produce json +// @Success 200 {array} string +// @Tags Repositories +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param page query int false "for response pagination, page offset number" default(1) +// @Param perPage query int false "for response pagination, max items per page" default(50) func GetRepoBranches(c *gin.Context) { repo := session.Repo(c) user := session.User(c) @@ -231,6 +295,18 @@ func GetRepoBranches(c *gin.Context) { c.JSON(http.StatusOK, branches) } +// GetRepoPullRequests +// +// @Summary List active pull requests +// @Router /repos/{owner}/{name}/pull_requests [get] +// @Produce json +// @Success 200 {array} PullRequest +// @Tags Repositories +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param page query int false "for response pagination, page offset number" default(1) +// @Param perPage query int false "for response pagination, max items per page" default(50) func GetRepoPullRequests(c *gin.Context) { repo := session.Repo(c) user := session.User(c) @@ -245,6 +321,16 @@ func GetRepoPullRequests(c *gin.Context) { c.JSON(http.StatusOK, prs) } +// DeleteRepo +// +// @Summary Delete a repository +// @Router /repos/{owner}/{name} [delete] +// @Produce json +// @Success 200 {object} Repo +// @Tags Repositories +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" func DeleteRepo(c *gin.Context) { remove, _ := strconv.ParseBool(c.Query("remove")) _store := store.FromContext(c) @@ -274,6 +360,16 @@ func DeleteRepo(c *gin.Context) { c.JSON(http.StatusOK, repo) } +// RepairRepo +// +// @Summary Repair a repository +// @Router /repos/{owner}/{name}/repair [post] +// @Produce plain +// @Success 200 +// @Tags Repositories +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" func RepairRepo(c *gin.Context) { forge := server.Config.Services.Forge _store := store.FromContext(c) @@ -336,6 +432,17 @@ func RepairRepo(c *gin.Context) { c.Writer.WriteHeader(http.StatusOK) } +// MoveRepo +// +// @Summary Move a repository to a new owner +// @Router /repos/{owner}/{name}/move [post] +// @Produce plain +// @Success 200 +// @Tags Repositories +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param to query string true "the username to move the repository to" func MoveRepo(c *gin.Context) { forge := server.Config.Services.Forge _store := store.FromContext(c) diff --git a/server/api/repo_secret.go b/server/api/repo_secret.go index 05553ab25..382d0eabd 100644 --- a/server/api/repo_secret.go +++ b/server/api/repo_secret.go @@ -25,8 +25,17 @@ import ( "github.com/woodpecker-ci/woodpecker/server/router/middleware/session" ) -// GetSecret gets the named secret from the database and writes -// to the response in json format. +// GetSecret +// +// @Summary Get a named secret +// @Router /repos/{owner}/{name}/secrets/{secretName} [get] +// @Produce json +// @Success 200 {object} Secret +// @Tags Repository secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param secretName path string true "the secret name" func GetSecret(c *gin.Context) { var ( repo = session.Repo(c) @@ -40,7 +49,17 @@ func GetSecret(c *gin.Context) { c.JSON(http.StatusOK, secret.Copy()) } -// PostSecret persists the secret to the database. +// PostSecret +// +// @Summary Persist/create a secret +// @Router /repos/{owner}/{name}/secrets [post] +// @Produce json +// @Success 200 {object} Secret +// @Tags Repository secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param secret body Secret true "the new secret" func PostSecret(c *gin.Context) { repo := session.Repo(c) @@ -68,7 +87,18 @@ func PostSecret(c *gin.Context) { c.JSON(http.StatusOK, secret.Copy()) } -// PatchSecret updates the secret in the database. +// PatchSecret +// +// @Summary Update a named secret +// @Router /repos/{owner}/{name}/secrets/{secretName} [patch] +// @Produce json +// @Success 200 {object} Secret +// @Tags Repository secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param secretName path string true "the secret name" +// @Param secret body Secret true "the secret itself" func PatchSecret(c *gin.Context) { var ( repo = session.Repo(c) @@ -109,8 +139,18 @@ func PatchSecret(c *gin.Context) { c.JSON(http.StatusOK, secret.Copy()) } -// GetSecretList gets the secret list from the database and writes -// to the response in json format. +// GetSecretList +// +// @Summary Get the secret list +// @Router /repos/{owner}/{name}/secrets [get] +// @Produce json +// @Success 200 {array} Secret +// @Tags Repository secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param page query int false "for response pagination, page offset number" default(1) +// @Param perPage query int false "for response pagination, max items per page" default(50) func GetSecretList(c *gin.Context) { repo := session.Repo(c) list, err := server.Config.Services.Secrets.SecretList(repo, session.Pagination(c)) @@ -126,7 +166,17 @@ func GetSecretList(c *gin.Context) { c.JSON(http.StatusOK, list) } -// DeleteSecret deletes the named secret from the database. +// DeleteSecret +// +// @Summary Delete a named secret +// @Router /repos/{owner}/{name}/secrets/{secretName} [delete] +// @Produce plain +// @Success 200 +// @Tags Repository secrets +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param owner path string true "the repository owner's name" +// @Param name path string true "the repository name" +// @Param secretName path string true "the secret name" func DeleteSecret(c *gin.Context) { var ( repo = session.Repo(c) diff --git a/server/api/signature_public_key.go b/server/api/signature_public_key.go index 9e4688407..f7bda1c05 100644 --- a/server/api/signature_public_key.go +++ b/server/api/signature_public_key.go @@ -24,6 +24,14 @@ import ( "github.com/woodpecker-ci/woodpecker/server" ) +// GetSignaturePublicKey +// +// @Summary Get server's signature public key +// @Router /signature/public-key [get] +// @Produce plain +// @Success 200 +// @Tags System +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func GetSignaturePublicKey(c *gin.Context) { b, err := x509.MarshalPKIXPublicKey(server.Config.Services.SignaturePublicKey) if err != nil { diff --git a/server/api/user.go b/server/api/user.go index 76657bff0..e55740172 100644 --- a/server/api/user.go +++ b/server/api/user.go @@ -28,10 +28,27 @@ import ( "github.com/woodpecker-ci/woodpecker/shared/token" ) +// GetSelf +// +// @Summary Returns the currently authenticated user. +// @Router /user [get] +// @Produce json +// @Success 200 {object} User +// @Tags User +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func GetSelf(c *gin.Context) { c.JSON(http.StatusOK, session.User(c)) } +// GetFeed +// +// @Summary A feed entry for a build. +// @Description Feed entries can be used to display information on the latest builds. +// @Router /user/feed [get] +// @Produce json +// @Success 200 {object} Feed +// @Tags User +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func GetFeed(c *gin.Context) { _store := store.FromContext(c) @@ -56,6 +73,15 @@ func GetFeed(c *gin.Context) { c.JSON(http.StatusOK, feed) } +// GetRepos +// +// @Summary Get user's repos +// @Description Retrieve the currently authenticated User's Repository list +// @Router /user/repos [get] +// @Produce json +// @Success 200 {array} Repo +// @Tags User +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func GetRepos(c *gin.Context) { _store := store.FromContext(c) _forge := server.Config.Services.Forge @@ -97,6 +123,14 @@ func GetRepos(c *gin.Context) { c.JSON(http.StatusOK, activeRepos) } +// PostToken +// +// @Summary Return the token of the current user as stringÂȘ +// @Router /user/token [post] +// @Produce plain +// @Success 200 +// @Tags User +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func PostToken(c *gin.Context) { user := session.User(c) tokenString, err := token.New(token.UserToken, user.Login).Sign(user.Hash) @@ -107,6 +141,15 @@ func PostToken(c *gin.Context) { c.String(http.StatusOK, tokenString) } +// DeleteToken +// +// @Summary Reset a token +// @Description Reset's the current personal access token of the user and returns a new one. +// @Router /user/token [delete] +// @Produce plain +// @Success 200 +// @Tags User +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) func DeleteToken(c *gin.Context) { _store := store.FromContext(c) diff --git a/server/api/users.go b/server/api/users.go index 6152cd734..f33157919 100644 --- a/server/api/users.go +++ b/server/api/users.go @@ -26,6 +26,17 @@ import ( "github.com/woodpecker-ci/woodpecker/server/store" ) +// GetUsers +// +// @Summary Get all users +// @Description Returns all registered, active users in the system. Requires admin rights. +// @Router /users [get] +// @Produce json +// @Success 200 {array} User +// @Tags Users +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param page query int false "for response pagination, page offset number" default(1) +// @Param perPage query int false "for response pagination, max items per page" default(50) func GetUsers(c *gin.Context) { users, err := store.FromContext(c).GetUserList(session.Pagination(c)) if err != nil { @@ -35,6 +46,16 @@ func GetUsers(c *gin.Context) { c.JSON(200, users) } +// GetUser +// +// @Summary Get a user +// @Description Returns a user with the specified login name. Requires admin rights. +// @Router /users/{login} [get] +// @Produce json +// @Success 200 {object} User +// @Tags Users +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param login path string true "the user's login name" func GetUser(c *gin.Context) { user, err := store.FromContext(c).GetUserLogin(c.Param("login")) if err != nil { @@ -44,6 +65,18 @@ func GetUser(c *gin.Context) { c.JSON(200, user) } +// PatchUser +// +// @Summary Change a user +// @Description Changes the data of an existing user. Requires admin rights. +// @Router /users/{login} [patch] +// @Produce json +// @Accept json +// @Success 200 {object} User +// @Tags Users +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param login path string true "the user's login name" +// @Param user body User true "the user's data" func PatchUser(c *gin.Context) { _store := store.FromContext(c) @@ -75,6 +108,16 @@ func PatchUser(c *gin.Context) { c.JSON(http.StatusOK, user) } +// PostUser +// +// @Summary Create a user +// @Description Creates a new user account with the specified external login. Requires admin rights. +// @Router /users [post] +// @Produce json +// @Success 200 {object} User +// @Tags Users +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param user body User true "the user's data" func PostUser(c *gin.Context) { in := &model.User{} err := c.Bind(in) @@ -101,6 +144,16 @@ func PostUser(c *gin.Context) { c.JSON(http.StatusOK, user) } +// DeleteUser +// +// @Summary Delete a user +// @Description Deletes the given user. Requires admin rights. +// @Router /users/{login} [delete] +// @Produce json +// @Success 200 {object} User +// @Tags Users +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param login path string true "the user's login name" func DeleteUser(c *gin.Context) { _store := store.FromContext(c) diff --git a/server/api/z.go b/server/api/z.go index 80ae496f9..181b62174 100644 --- a/server/api/z.go +++ b/server/api/z.go @@ -25,7 +25,15 @@ import ( "github.com/woodpecker-ci/woodpecker/version" ) -// Health endpoint returns a 500 if the server state is unhealthy. +// Health +// +// @Summary Health information +// @Description If everything is fine, just a 200 will be returned, a 500 signals server state is unhealthy. +// @Router /healthz [get] +// @Produce plain +// @Success 200 +// @Failure 500 +// @Tags System func Health(c *gin.Context) { if err := store.FromContext(c).Ping(); err != nil { c.String(http.StatusInternalServerError, err.Error()) @@ -34,7 +42,14 @@ func Health(c *gin.Context) { c.String(http.StatusOK, "") } -// Version endpoint returns the server version and build information. +// Version +// +// @Summary Get version +// @Description Endpoint returns the server version and build information. +// @Router /version [get] +// @Produce json +// @Success 200 {object} string{source=string,version=string} +// @Tags System func Version(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "source": "https://github.com/woodpecker-ci/woodpecker", @@ -42,14 +57,30 @@ func Version(c *gin.Context) { }) } -// LogLevel endpoint returns the current logging level +// LogLevel +// +// @Summary Current log level +// @Description Endpoint returns the current logging level. Requires admin rights. +// @Router /log-level [get] +// @Produce json +// @Success 200 {object} string{log-level=string} +// @Tags System func LogLevel(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "log-level": zerolog.GlobalLevel().String(), }) } -// SetLogLevel endpoint allows setting the logging level via API +// SetLogLevel +// +// @Summary Set log level +// @Description Endpoint sets the current logging level. Requires admin rights. +// @Router /log-level [post] +// @Produce json +// @Success 200 {object} string{log-level=string} +// @Tags System +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param log-level body string{log-level=string} true "the new log level, one of " func SetLogLevel(c *gin.Context) { logLevel := struct { LogLevel string `json:"log-level"` diff --git a/server/model/agent.go b/server/model/agent.go index 9ee3a1ad0..65278c21b 100644 --- a/server/model/agent.go +++ b/server/model/agent.go @@ -27,7 +27,7 @@ type Agent struct { Capacity int32 `json:"capacity"` Version string `json:"version"` NoSchedule bool `json:"no_schedule"` -} +} // @name Agent // TableName return database table name for xorm func (Agent) TableName() string { diff --git a/server/model/config.go b/server/model/config.go index e6ef8b6f8..c84c0f934 100644 --- a/server/model/config.go +++ b/server/model/config.go @@ -31,7 +31,7 @@ type Config struct { Hash string `json:"hash" xorm:"UNIQUE(s) 'config_hash'"` Name string `json:"name" xorm:"config_name"` Data []byte `json:"data" xorm:"config_data"` -} +} // @name Config // PipelineConfig is the n:n relation between Pipeline and Config type PipelineConfig struct { diff --git a/server/model/const.go b/server/model/const.go index 1496d49c1..3cda0b810 100644 --- a/server/model/const.go +++ b/server/model/const.go @@ -20,7 +20,7 @@ import ( "fmt" ) -type WebhookEvent string +type WebhookEvent string // @name WebhookEvent const ( EventPush WebhookEvent = "push" @@ -49,7 +49,7 @@ func ValidateWebhookEvent(s WebhookEvent) error { } // StatusValue represent pipeline states woodpecker know -type StatusValue string +type StatusValue string // @name StatusValue const ( StatusSkipped StatusValue = "skipped" @@ -64,7 +64,7 @@ const ( ) // SCMKind represent different version control systems -type SCMKind string +type SCMKind string // @name SCMKind const ( RepoGit SCMKind = "git" @@ -74,7 +74,7 @@ const ( ) // RepoVisibility represent to wat state a repo in woodpecker is visible to others -type RepoVisibility string +type RepoVisibility string // @name RepoVisibility const ( VisibilityPublic RepoVisibility = "public" diff --git a/server/model/cron.go b/server/model/cron.go index 0be5807a5..50e9a8b83 100644 --- a/server/model/cron.go +++ b/server/model/cron.go @@ -20,17 +20,16 @@ import ( "github.com/robfig/cron" ) -// swagger:model cron type Cron struct { ID int64 `json:"id" xorm:"pk autoincr"` Name string `json:"name" xorm:"UNIQUE(s) INDEX"` RepoID int64 `json:"repo_id" xorm:"repo_id UNIQUE(s) INDEX"` CreatorID int64 `json:"creator_id" xorm:"creator_id INDEX"` NextExec int64 `json:"next_exec"` - Schedule string `json:"schedule" xorm:"NOT NULL"` // @weekly, 3min, ... + Schedule string `json:"schedule" xorm:"NOT NULL"` // @weekly, 3min, ... Created int64 `json:"created_at" xorm:"created NOT NULL DEFAULT 0"` Branch string `json:"branch"` -} +} // @name Cron // TableName returns the database table name for xorm func (Cron) TableName() string { diff --git a/server/model/environ.go b/server/model/environ.go index 92670aa97..115e83381 100644 --- a/server/model/environ.go +++ b/server/model/environ.go @@ -35,7 +35,6 @@ type EnvironStore interface { } // Environ represents an environment variable. -// swagger:model environ type Environ struct { ID int64 `json:"id"` Name string `json:"name"` diff --git a/server/model/feed.go b/server/model/feed.go index 2b52fee01..12311efab 100644 --- a/server/model/feed.go +++ b/server/model/feed.go @@ -16,8 +16,6 @@ package model // Feed represents an item in the user's feed or timeline. -// -// swagger:model feed type Feed struct { Owner string `json:"owner" xorm:"feed_repo_owner"` Name string `json:"name" xorm:"feed_repo_name"` @@ -40,4 +38,4 @@ type Feed struct { Author string `json:"author,omitempty" xorm:"feed_pipeline_author"` Avatar string `json:"author_avatar,omitempty" xorm:"feed_pipeline_avatar"` Email string `json:"author_email,omitempty" xorm:"feed_pipeline_email"` -} +} // @name Feed diff --git a/server/model/perm.go b/server/model/perm.go index f139e76cf..d38bb1bb7 100644 --- a/server/model/perm.go +++ b/server/model/perm.go @@ -34,15 +34,15 @@ type Perm struct { Synced int64 `json:"synced" xorm:"perm_synced"` Created int64 `json:"created" xorm:"created"` Updated int64 `json:"updated" xorm:"updated"` -} +} // @name Perm // TableName return database table name for xorm func (Perm) TableName() string { return "perms" } -// OrgPerm defines a organization permission for an individual user. +// OrgPerm defines an organization permission for an individual user. type OrgPerm struct { Member bool `json:"member"` Admin bool `json:"admin"` -} +} // @name OrgPerm diff --git a/server/model/pipeline.go b/server/model/pipeline.go index 857bfc7e3..55b7ca897 100644 --- a/server/model/pipeline.go +++ b/server/model/pipeline.go @@ -15,7 +15,6 @@ package model -// swagger:model pipeline type Pipeline struct { ID int64 `json:"id" xorm:"pk autoincr 'pipeline_id'"` RepoID int64 `json:"-" xorm:"UNIQUE(s) INDEX 'pipeline_repo_id'"` @@ -52,7 +51,7 @@ type Pipeline struct { ChangedFiles []string `json:"changed_files,omitempty" xorm:"json 'changed_files'"` AdditionalVariables map[string]string `json:"variables,omitempty" xorm:"json 'additional_variables'"` PullRequestLabels []string `json:"pr_labels,omitempty" xorm:"json 'pr_labels'"` -} +} // @name Pipeline // TableName return database table name for xorm func (Pipeline) TableName() string { @@ -66,4 +65,4 @@ type UpdatePipelineStore interface { type PipelineOptions struct { Branch string `json:"branch"` Variables map[string]string `json:"variables"` -} +} // @name PipelineOptions diff --git a/server/model/pull_request.go b/server/model/pull_request.go index bdce4e9a3..e146baaef 100644 --- a/server/model/pull_request.go +++ b/server/model/pull_request.go @@ -3,4 +3,4 @@ package model type PullRequest struct { Index int64 `json:"index"` Title string `json:"title"` -} +} // @name PullRequest diff --git a/server/model/registry.go b/server/model/registry.go index fa4b708a6..cd93dc7df 100644 --- a/server/model/registry.go +++ b/server/model/registry.go @@ -51,7 +51,6 @@ type RegistryStore interface { } // Registry represents a docker registry with credentials. -// swagger:model registry type Registry struct { ID int64 `json:"id" xorm:"pk autoincr 'registry_id'"` RepoID int64 `json:"-" xorm:"UNIQUE(s) INDEX 'registry_repo_id'"` @@ -60,7 +59,7 @@ type Registry struct { Password string `json:"password" xorm:"TEXT 'registry_password'"` Token string `json:"token" xorm:"TEXT 'registry_token'"` Email string `json:"email" xorm:"varchar(500) 'registry_email'"` -} +} // @name Registry // Validate validates the registry information. func (r *Registry) Validate() error { diff --git a/server/model/repo.go b/server/model/repo.go index 97f8e9c12..c8c230639 100644 --- a/server/model/repo.go +++ b/server/model/repo.go @@ -21,8 +21,6 @@ import ( ) // Repo represents a repository. -// -// swagger:model repo type Repo struct { ID int64 `json:"id,omitempty" xorm:"pk autoincr 'repo_id'"` UserID int64 `json:"-" xorm:"repo_user_id"` @@ -48,7 +46,7 @@ type Repo struct { Perm *Perm `json:"-" xorm:"-"` CancelPreviousPipelineEvents []WebhookEvent `json:"cancel_previous_pipeline_events" xorm:"json 'cancel_previous_pipeline_events'"` NetrcOnlyTrusted bool `json:"netrc_only_trusted" xorm:"NOT NULL DEFAULT true 'netrc_only_trusted'"` -} +} // @name Repo // TableName return database table name for xorm func (Repo) TableName() string { @@ -109,7 +107,7 @@ type RepoPatch struct { AllowPull *bool `json:"allow_pr,omitempty"` CancelPreviousPipelineEvents *[]WebhookEvent `json:"cancel_previous_pipeline_events"` NetrcOnlyTrusted *bool `json:"netrc_only_trusted"` -} +} // @name RepoPatch type ForgeRemoteID string diff --git a/server/model/secret.go b/server/model/secret.go index a669fa8ae..fe7401edf 100644 --- a/server/model/secret.go +++ b/server/model/secret.go @@ -68,7 +68,6 @@ type SecretStore interface { } // Secret represents a secret variable, such as a password or token. -// swagger:model registry type Secret struct { ID int64 `json:"id" xorm:"pk autoincr 'secret_id'"` Owner string `json:"-" xorm:"NOT NULL DEFAULT '' UNIQUE(s) INDEX 'secret_owner'"` @@ -80,7 +79,7 @@ type Secret struct { Events []WebhookEvent `json:"event" xorm:"json 'secret_events'"` SkipVerify bool `json:"-" xorm:"secret_skip_verify"` Conceal bool `json:"-" xorm:"secret_conceal"` -} +} // @name Secret // TableName return database table name for xorm func (Secret) TableName() string { diff --git a/server/model/step.go b/server/model/step.go index 05fcc70ff..c6492f0e6 100644 --- a/server/model/step.go +++ b/server/model/step.go @@ -29,7 +29,6 @@ type StepStore interface { } // Step represents a process in the pipeline. -// swagger:model step type Step struct { ID int64 `json:"id" xorm:"pk autoincr 'step_id'"` PipelineID int64 `json:"pipeline_id" xorm:"UNIQUE(s) INDEX 'step_pipeline_id'"` @@ -46,7 +45,7 @@ type Step struct { Platform string `json:"platform,omitempty" xorm:"step_platform"` Environ map[string]string `json:"environ,omitempty" xorm:"json 'step_environ'"` Children []*Step `json:"children,omitempty" xorm:"-"` -} +} // @name Step type UpdateStepStore interface { StepUpdate(*Step) error diff --git a/server/model/task.go b/server/model/task.go index 0365ff3f6..030701cb7 100644 --- a/server/model/task.go +++ b/server/model/task.go @@ -35,7 +35,7 @@ type Task struct { RunOn []string `json:"run_on" xorm:"json 'task_run_on'"` DepStatus map[string]StatusValue `json:"dep_status" xorm:"json 'task_dep_status'"` AgentID int64 `json:"agent_id" xorm:"'agent_id'"` -} +} // @name Task // TableName return database table name for xorm func (Task) TableName() string { diff --git a/server/model/team.go b/server/model/team.go index e21489573..c53771277 100644 --- a/server/model/team.go +++ b/server/model/team.go @@ -15,8 +15,6 @@ package model // Team represents a team or organization in the forge. -// -// swagger:model user type Team struct { // Login is the username for this team. Login string `json:"login"` diff --git a/server/model/user.go b/server/model/user.go index bf8861911..05b665819 100644 --- a/server/model/user.go +++ b/server/model/user.go @@ -26,8 +26,6 @@ var reUsername = regexp.MustCompile("^[a-zA-Z0-9-_.]+$") var errUserLoginInvalid = errors.New("Invalid User Login") // User represents a registered user. -// -// swagger:model user type User struct { // the id for this user. // @@ -66,7 +64,7 @@ type User struct { // Hash is a unique token used to sign tokens. Hash string `json:"-" xorm:"UNIQUE varchar(500) 'user_hash'"` -} +} // @name User // TableName return database table name for xorm func (User) TableName() string { diff --git a/server/queue/queue.go b/server/queue/queue.go index 22667e3b3..c0a500479 100644 --- a/server/queue/queue.go +++ b/server/queue/queue.go @@ -29,7 +29,7 @@ type InfoT struct { Complete int `json:"completed_count"` } `json:"stats"` Paused bool `json:"paused"` -} +} // @name InfoT func (t *InfoT) String() string { var sb strings.Builder diff --git a/server/router/router.go b/server/router/router.go index 62b2ec48f..94d03d994 100644 --- a/server/router/router.go +++ b/server/router/router.go @@ -16,9 +16,14 @@ package router import ( "net/http" + "net/url" "github.com/gin-gonic/gin" "github.com/rs/zerolog/log" + swaggerfiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" + "github.com/woodpecker-ci/woodpecker/cmd/server/docs" + "github.com/woodpecker-ci/woodpecker/server" "github.com/woodpecker-ci/woodpecker/server/api" "github.com/woodpecker-ci/woodpecker/server/api/metrics" @@ -64,6 +69,18 @@ func Load(noRouteHandler http.HandlerFunc, middleware ...gin.HandlerFunc) http.H e.GET("/healthz", api.Health) apiRoutes(e) + setupSwaggerConfigAndRoutes(e) return e } + +func setupSwaggerConfigAndRoutes(e *gin.Engine) { + docs.SwaggerInfo.Host = getHost(server.Config.Server.Host) + docs.SwaggerInfo.BasePath = server.Config.Server.RootURL + "/api" + e.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler)) +} + +func getHost(s string) string { + parse, _ := url.Parse(s) + return parse.Host +} diff --git a/server/swagger/doc.go b/server/swagger/doc.go deleted file mode 100644 index 65010b6b1..000000000 --- a/server/swagger/doc.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2018 Drone.IO Inc. -// -// 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 classification Drone API. -// -// Schemes: http, https -// BasePath: /api -// Version: 1.0.0 -// -// Consumes: -// - application/json -// -// Produces: -// - application/json -// -// swagger:meta -package swagger - -//go:generate swagger generate spec -o files/swagger.json -//go:generate go-bindata -pkg swagger -o swagger_gen.go files/ diff --git a/server/swagger/files/swagger.yml b/server/swagger/files/swagger.yml deleted file mode 100644 index d5a60214b..000000000 --- a/server/swagger/files/swagger.yml +++ /dev/null @@ -1,991 +0,0 @@ -swagger: "2.0" -info: - version: 1.0.0 - title: Woodpecker API - license: - name: Creative Commons 4.0 International - url: "http://creativecommons.org/licenses/by/4.0/" - -host: "localhost:8080" -basePath: /api -schemes: - - http - - https -consumes: - - application/json -produces: - - application/json - -# -# Operation tags -# - -tags: - - name: Repos - - name: Builds - - name: User - - name: Users - -# -# Security Definitions -# - -security: - - accessToken: [] -securityDefinitions: - accessToken: - type: apiKey - in: query - name: access_token - -# -# Endpoint Definitions -# - -paths: - - # - # Repos Endpoint - # - - /repos/{owner}/{name}: - get: - parameters: - - name: owner - in: path - type: string - description: owner of the repository - - name: name - in: path - type: string - description: name of the repository - tags: - - Repos - summary: Get a repo - description: Retrieves the details of a repository. - security: - - accessToken: [] - responses: - 200: - schema: - $ref: "#/definitions/Repo" - 404: - description: | - Unable to find the repository. - - patch: - parameters: - - name: owner - in: path - type: string - description: owner of the repository - - name: name - in: path - type: string - description: name of the repository - - name: repo - in: body - description: The updated repository JSON - schema: - $ref: '#/definitions/Repo' - example: | - { - "timeout": 60, - "private": false, - "trusted": false, - "allow_pr": true - } - required: true - tags: - - Repos - summary: Updates a repo - description: Updates the specified repository. - security: - - accessToken: [] - responses: - 200: - schema: - $ref: "#/definitions/Repo" - 400: - description: | - Unable to update the repository in the database. - 404: - description: | - Unable to find the repository. - - post: - parameters: - - name: owner - in: path - type: string - description: owner of the repository - - name: name - in: path - type: string - description: name of the repository - tags: - - Repos - summary: Activates a repo - description: Activates a repository. - security: - - accessToken: [] - responses: - 200: - schema: - $ref: "#/definitions/Repo" - 400: - description: | - Unable to update the Repository record in the database - 403: - description: | - Unable to activate the Repository due to insufficient privileges - 404: - description: | - Unable to retrieve the Repository from the remote system (ie GitHub) - 409: - description: | - Unable to activate the Repository because it is already activate - 500: - description: | - Unable to activate the Repository due to an internal server error. This may indicate a problem adding hooks to the remote system (ie GitHub), generating SSH deployment keys, or persisting to the database. - - delete: - parameters: - - name: owner - in: path - type: string - description: owner of the repository - - name: name - in: path - type: string - description: name of the repository - tags: - - Repos - summary: Delete a repo - description: Permanently deletes a repository. It cannot be undone. - security: - - accessToken: [] - responses: - 200: - description: | - Successfully deleted the Repository - 400: - description: | - Unable to remove post-commit hooks from the remote system (ie GitHub) - 404: - description: | - Unable to find the Repository in the database - 500: - description: | - Unable to update the Repository record in the database - - - # - # Repos Param Encryption Endpoint - # TODO: properly add the input output schema - - /repos/{owner}/{name}/encrypt: - post: - parameters: - - name: owner - in: path - type: string - description: owner of the repository - - name: name - in: path - type: string - description: name of the repository - tags: - - Repos - summary: Encrypt repo secrets - description: Encrypts a Yaml file with secret environment variables for secure public storage. - security: - - accessToken: [] - responses: - 200: - description: The encrypted parameters. - 400: - description: | - Unable to encrypt the parameters. - 404: - description: | - Unable to find the repository. - - - # - # Builds Endpoint - # - - /repos/{owner}/{name}/builds: - get: - parameters: - - name: owner - in: path - type: string - description: owner of the repository - - name: name - in: path - type: string - description: name of the repository - tags: - - Builds - summary: Get recent builds - description: Returns recent builds for the repository based on name. - security: - - accessToken: [] - responses: - 200: - description: The recent builds. - schema: - type: array - items: - $ref: "#/definitions/Build" - 404: - description: | - Unable to find the Repository in the database - - - /repos/{owner}/{name}/builds/{number}: - get: - parameters: - - name: owner - in: path - type: string - description: owner of the repository - - name: name - in: path - type: string - description: name of the repository - - name: branch - in: query - type: string - description: name of the branch - required: false - - name: number - in: path - type: integer - description: sequential build number - tags: - - Builds - summary: Get the latest build - description: Returns the latest repository build. - security: - - accessToken: [] - responses: - 200: - description: The build. - schema: - $ref: "#/definitions/Build" - 404: - description: | - Unable to find the Repository or Build - - post: - parameters: - - name: owner - in: path - type: string - description: owner of the repository - - name: name - in: path - type: string - description: name of the repository - - name: number - in: path - type: integer - description: sequential build number - tags: - - Builds - summary: Restart a build - description: Restart the a build by number. - security: - - accessToken: [] - responses: - 200: - description: Successfully restarted the Pipeline. - schema: - $ref: "#/definitions/Build" - 404: - description: | - Unable to find the Repository or Build. - 409: - description: | - Cannot re-start a Build that is running. - - - # - # Jobs Endpoint - # - - /repos/{owner}/{name}/logs/{number}/{job}: - get: - parameters: - - name: owner - in: path - type: string - description: owner of the repository - - name: name - in: path - type: string - description: name of the repository - - name: number - in: path - type: integer - description: sequential build number - - name: job - in: path - type: integer - description: sequential job number - tags: - - Builds - summary: Get build logs - description: Returns the build logs for a specific job (build step). - produces: - - text/plain - security: - - accessToken: [] - responses: - 200: - description: The logs for the requested job. - 404: - description: | - Unable to find the repository, build or job. - - delete: - parameters: - - name: owner - in: path - type: string - description: owner of the repository - - name: name - in: path - type: string - description: name of the repository - - name: number - in: path - type: integer - description: sequential build number - - name: job - in: path - type: integer - description: sequential job number - tags: - - Builds - summary: Cancel a Job - description: Cancel the a build job by number. - security: - - accessToken: [] - responses: - 200: - description: Successfully canceled the Job - 404: - description: | - Unable to find the Repository or Job - 409: - description: | - Cannot cancel a Job that is already stopped - - - # - # User Endpoint - # - - /user: - get: - summary: Gets a user - description: Returns the currently authenticated user. - security: - - accessToken: [] - tags: - - User - responses: - 200: - description: The currently authenticated user. - schema: - $ref: "#/definitions/User" - patch: - summary: Updates a user - description: Updates the currently authenticated user. - tags: - - User - parameters: - - name: user - in: body - description: Updates to the user. - required: true - schema: - $ref: "#/definitions/User" - responses: - 200: - description: The updated user. - schema: - $ref: "#/definitions/User" - 400: - description: | - Unable to update the user in the database - - - # - # User Repos - # - - /user/repos: - get: - summary: Get user repos - description: | - Retrieve the currently authenticated User's Repository list - tags: - - User - responses: - 200: - schema: - type: array - items: - $ref: "#/definitions/Repo" - 400: - description: | - Unable to retrieve Repository list - - - # - # Users Endpoint - # - - /users: - get: - tags: - - Users - summary: Get all users - description: Returns all registered, active users in the system. - security: - - accessToken: [] - responses: - 200: - description: All registered users. - schema: - type: array - items: - $ref: "#/definitions/User" - - /users/{login}: - get: - parameters: - - name: login - in: path - type: string - description: user login - tags: - - Users - summary: Get a user - description: Returns a user with the specified login name. - security: - - accessToken: [] - responses: - 200: - description: Returns the user. - schema: - $ref: "#/definitions/User" - 404: - description: Cannot find user with matching login. - - post: - parameters: - - name: login - in: path - type: string - description: user login to activate - tags: - - Users - summary: Create a user - description: Creates a new user account with the specified external login. - security: - - accessToken: [] - responses: - 201: - description: Returns the created user. - schema: - $ref: "#/definitions/User" - 400: - description: | - Error inserting User into the database - - patch: - parameters: - - name: login - in: path - type: string - description: user login - - name: user - in: body - description: changes to the user - schema: - $ref: '#/definitions/User' - example: | - { - "email": "octocat@github.com", - "admin": false, - "active": true - } - required: true - - tags: - - Users - summary: Update a user - description: Updates an existing user account. - security: - - accessToken: [] - responses: - 200: - description: Returns the updated user. - schema: - $ref: "#/definitions/User" - 400: - description: | - Error updating the User in the database - - delete: - parameters: - - name: login - in: path - type: string - description: user login - tags: - - Users - summary: Delete a user - description: Deletes the user with the specified login name. - security: - - accessToken: [] - responses: - 204: - description: | - Successfully deleted the User - 400: - description: | - Error deleting the User from the database - 403: - description: | - Cannot delete your own User account - 404: - description: | - Cannot find the User - -# -# Schema Definitions -# - -definitions: - User: - description: The user account. - example: | - { - "id": 1, - "login": "octocat", - "email": "octocat@github.com", - "avatar_url": "http://www.gravatar.com/avatar/7194e8d48fa1d2b689f99443b767316c", - "admin": false, - "active": true - } - properties: - id: - description: The unique identifier for the account. - type: integer - format: int64 - login: - description: The login name for the account. - type: string - email: - description: The email address for the account. - type: string - avatar_url: - description: The url for the avatar image. - type: string - admin: - description: Whether the account has administrative privileges. - type: boolean - active: - description: Whether the account is currently active. - type: boolean - - Repo: - description: A version control repository. - example: | - { - "id": 1, - "scm": "git", - "owner": "octocat", - "name": "hello-world", - "full_name": "octocat/hello-world", - "avatar_url": "https://avatars.githubusercontent.com/u/2181346?v=3", - "link_url": "https://github.com/octocat/hello-world", - "clone_url": "https://github.com/octocat/hello-world.git", - "default_branch": "master", - "timeout": 60, - "private": false, - "trusted": false, - "allow_pr": true - } - properties: - id: - description: The unique identifier for the repository. - type: integer - format: int64 - scm: - description: | - The source control management being used. - - Currently this is either 'git' or 'hg' (Mercurial). - type: string - owner: - description: The owner of the repository. - type: string - name: - description: The name of the repository. - type: string - full_name: - description: | - The full name of the repository. - - This is created from the owner and name of the repository. - type: string - avatar_url: - description: The url for the avatar image. - type: string - link_url: - description: The link to view the repository. - type: string - clone_url: - description: The url used to clone the repository. - type: string - default_branch: - description: The default branch of the repository. - type: string - private: - description: Whether the repository is publicly visible. - type: boolean - trusted: - description: | - Whether the repository has trusted access for builds. - - If the repository is trusted then the host network can be used and - volumes can be created. - type: boolean - timeout: - description: The amount of time in minutes before the build is killed. - type: integer - x-dart-type: Duration - allow_pr: - description: Whether pull requests should trigger a build. - type: boolean - - Build: - description: A build for a repository. - example: | - { - "id": 1, - "number": 1, - "event": "push", - "status": "success", - "created_at": 1443677151, - "enqueued_at": 1443677151, - "started_at": 1443677151, - "finished_at": 1443677255, - "commit": "2deb7e0d0cbac357eeb110c8a2f2f32ce037e0d5", - "branch": "master", - "ref": "refs/heads/master", - "remote": "https://github.com/octocat/hello-world.git", - "message": "New line at end of file. --Signed off by Spaceghost", - "timestamp": 1443677255, - "author": "Spaceghost", - "author_avatar": "https://avatars0.githubusercontent.com/u/251370?v=3", - "author_email": "octocat@github.com", - "link_url": "https://github.com/octocat/hello-world/commit/762941318ee16e59dabbacb1b4049eec22f0d303", - "jobs": [ - { - "id": 1, - "number": 1, - "status": "success", - "enqueued_at": 1443677151, - "started_at": 1443677151, - "finished_at": 1443677255, - "exit_code": 0, - "environment": { "GO_VERSION": "1.4" } - }, - { - "id": 2, - "number": 2, - "status": "success", - "enqueued_at": 1443677151, - "started_at": 1443677151, - "finished_at": 1443677255, - "exit_code": 0, - "environment": { "GO_VERSION": "1.5" } - } - ] - } - properties: - id: - type: integer - format: int64 - number: - description: | - The build number. - - This number is specified within the context of the repository the build - belongs to and is unique within that. - type: integer - status: - description: The current status of the build. - $ref: '#definitions/BuildStatus' - created_at: - description: When the build request was received. - type: integer - format: int64 - x-dart-type: DateTime - enqueued_at: - description: When the build was enqueued. - type: integer - format: int64 - x-dart-type: DateTime - started_at: - description: When the build began execution. - type: integer - format: int64 - x-dart-type: DateTime - finished_at: - description: When the build was finished. - type: integer - format: int64 - x-dart-type: DateTime - deploy_to: - description: Where the deployment should go. - type: string - commit: - description: The commit for the build. - type: string - branch: - description: The branch the commit was pushed to. - type: string - message: - description: The commit message. - type: string - timestamp: - description: When the commit was created. - type: integer - format: int64 - x-dart-format: DateTime - ref: - description: The alias for the commit. - type: string - refspec: - description: The mapping from the local repository to a branch in the remote. - type: string - remote: - description: The remote repository. - type: string - author: - description: The login for the author of the commit. - type: string - author_avatar: - description: The avatar for the author of the commit. - type: string - author_email: - description: The email for the author of the commit. - type: string - link_url: - description: | - The link to view the repository. - - This link will point to the repository state associated with the - build's commit. - type: string - jobs: - description: | - The jobs associated with this build. - - A build will have multiple jobs if a matrix build was used or if a - rebuild was requested. - type: array - items: - $ref: "#/definitions/Job" - - BuildStatus: - description: The status of a build. - type: string - enum: - - success - - failure - - pending - - started - - error - - killed - x-enum-descriptions: - - The build was successful. - - The build failed. - - The build is pending execution. - - The build was started. - - There was an error running the build. - - The build was killed either manually or through a timeout. - - Job: - description: A single job being executed as part of a build. - example: | - { - "id": 1, - "number": 1, - "status": "success", - "enqueued_at": 1443677151, - "started_at": 1443677151, - "finished_at": 1443677255, - "exit_code": 0, - "environment": { "GO_VERSION": "1.4" } - } - properties: - id: - description: The unique identifier for the build. - type: integer - format: int64 - number: - description: | - The job number. - - This number is specified within the context of the build the job - belongs to and is unique within that. - type: integer - status: - description: The current status of the job. - $ref: '#definitions/BuildStatus' - exit_code: - description: The exit code for the build. - type: integer - enqueued_at: - description: When the job was enqueued. - type: integer - format: int64 - x-dart-type: DateTime - started_at: - description: When the job began execution. - type: integer - format: int64 - x-dart-type: DateTime - finished_at: - description: When the job finished execution. - type: integer - format: int64 - x-dart-type: DateTime - environment: - description: | - The environment that the job was run with. - - This is a map containing any values for matrix builds. - type: object - - Feed: - description: | - A feed entry for a build. - - Feed entries can be used to display information on the latest builds. - example: | - { - "owner": "octocat", - "name": "hello-world", - "full_name": "octocat/hello-world", - "number": 1, - "event": "push", - "status": "success", - "created_at": 1443677151, - "enqueued_at": 1443677151, - "started_at": 1443677151, - "finished_at": 1443677255, - "commit": "2deb7e0d0cbac357eeb110c8a2f2f32ce037e0d5", - "branch": "master", - "ref": "refs/heads/master", - "remote": "https://github.com/octocat/hello-world.git", - "message": "New line at end of file. --Signed off by Spaceghost", - "timestamp": 1443677255, - "author": "Spaceghost", - "author_avatar": "https://avatars0.githubusercontent.com/u/251370?v=3", - "author_email": "octocat@github.com", - "link_url": "https://github.com/octocat/hello-world/commit/762941318ee16e59dabbacb1b4049eec22f0d303", - } - properties: - owner: - description: The owner of the repository. - type: string - name: - description: The name of the repository. - type: string - full_name: - description: | - The full name of the repository. - - This is created from the owner and name of the repository. - type: string - number: - description: | - The build number. - - This number is specified within the context of the repository the build - belongs to and is unique within that. - type: integer - status: - description: The current status of the build. - $ref: '#definitions/BuildStatus' - created_at: - description: When the build request was received. - type: integer - format: int64 - x-dart-type: DateTime - enqueued_at: - description: When the build was enqueued. - type: integer - format: int64 - x-dart-type: DateTime - started_at: - description: When the build began execution. - type: integer - format: int64 - x-dart-type: DateTime - finished_at: - description: When the build was finished. - type: integer - format: int64 - x-dart-type: DateTime - commit: - description: The commit for the build. - type: string - branch: - description: The branch the commit was pushed to. - type: string - message: - description: The commit message. - type: string - timestamp: - description: When the commit was created. - type: integer - format: int64 - x-dart-format: DateTime - ref: - description: The alias for the commit. - type: string - refspec: - description: The mapping from the local repository to a branch in the remote. - type: string - remote: - description: The remote repository. - type: string - author: - description: The login for the author of the commit. - type: string - author_avatar: - description: The avatar for the author of the commit. - type: string - author_email: - description: The email for the author of the commit. - type: string - link_url: - description: | - The link to view the repository. - - This link will point to the repository state associated with the - build's commit. - type: string diff --git a/web/src/views/User.vue b/web/src/views/User.vue index 0f656493d..18da271bd 100644 --- a/web/src/views/User.vue +++ b/web/src/views/User.vue @@ -19,7 +19,10 @@
-

{{ $t('user.api_usage') }}

+
+

{{ $t('user.api_usage') }}

+ Swagger UI +
{{ usageWithCurl }}