diff --git a/.drone.sh b/.drone.sh index c9f8f73c..baf04bf7 100755 --- a/.drone.sh +++ b/.drone.sh @@ -12,6 +12,7 @@ GOOS=linux GOARCH=ppc64le go build -ldflags "-X main.version=${DRONE_TAG##v}" GOOS=linux GOARCH=arm go build -ldflags "-X main.version=${DRONE_TAG##v}" -o release/linux/arm/drone ./drone GOOS=windows GOARCH=amd64 go build -ldflags "-X main.version=${DRONE_TAG##v}" -o release/windows/amd64/drone.exe ./drone GOOS=darwin GOARCH=amd64 go build -ldflags "-X main.version=${DRONE_TAG##v}" -o release/darwin/amd64/drone ./drone +GOOS=darwin GOARCH=arm64 go build -ldflags "-X main.version=${DRONE_TAG##v}" -o release/darwin/arm64/drone ./drone # tar binary files prior to upload tar -cvzf release/drone_linux_amd64.tar.gz -C release/linux/amd64 drone @@ -20,6 +21,7 @@ tar -cvzf release/drone_linux_ppc64le.tar.gz -C release/linux/ppc64le drone tar -cvzf release/drone_linux_arm.tar.gz -C release/linux/arm drone tar -cvzf release/drone_windows_amd64.tar.gz -C release/windows/amd64 drone.exe tar -cvzf release/drone_darwin_amd64.tar.gz -C release/darwin/amd64 drone +tar -cvzf release/drone_darwin_arm64.tar.gz -C release/darwin/arm64 drone # generate shas for tar files sha256sum release/*.tar.gz > release/drone_checksums.txt diff --git a/.drone.yml b/.drone.yml index b66df095..9b688e76 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,43 +1,69 @@ kind: pipeline -type: docker +type: vm name: default +pool: + use: ubuntu + steps: +- name: test + image: golang:1.18 + commands: + - go test ./... + - name: build - image: golang:1.13 + image: golang:1.18 commands: - - sh .drone.sh + - sh .drone.sh + depends_on: + - test - name: publish_latest image: plugins/docker settings: - repo: drone/cli + repo: tphoney/cli username: from_secret: docker_username password: from_secret: docker_password auto_tag: true + auto_tag_suffix: linux-amd64 when: event: [push, tag] + depends_on: + - build -- name: publish_alpine - image: plugins/docker +- name: release + image: plugins/github-release settings: - repo: drone/cli - username: - from_secret: docker_username - password: - from_secret: docker_password - auto_tag: true - auto_tag_suffix: alpine - dockerfile: Dockerfile.alpine + files: + - release/drone_*.tar.gz + - release/drone_checksums.txt + api_key: + from_secret: github_token when: - event: [push, tag] + event: tag + depends_on: + - build +--- + +kind: pipeline +type: vm +name: arm + +pool: + use: ubuntu_arm64 + +steps: +- name: build + image: golang:1.18 + commands: + - sh .drone.sh - name: publish_linux_arm image: plugins/docker settings: - repo: drone/cli + repo: tphoney/cli username: from_secret: docker_username password: @@ -45,13 +71,16 @@ steps: auto_tag: true auto_tag_suffix: linux-arm dockerfile: Dockerfile.linux.arm + platform: linux/arm/v7 when: event: [push, tag] + depends_on: + - build - name: publish_linux_arm64 image: plugins/docker settings: - repo: drone/cli + repo: tphoney/cli username: from_secret: docker_username password: @@ -59,30 +88,57 @@ steps: auto_tag: true auto_tag_suffix: linux-arm64 dockerfile: Dockerfile.linux.arm64 + platform: linux/arm64 when: event: [push, tag] + depends_on: + - build - name: publish_linux_ppc64le image: plugins/docker settings: - repo: drone/cli + repo: tphoney/cli username: from_secret: docker_username password: from_secret: docker_password auto_tag: true auto_tag_suffix: linux-ppc64le + platform: linux/ppc64le dockerfile: Dockerfile.linux.ppc64le when: event: [push, tag] + depends_on: + - build + +depends_on: + - default + + +--- + +kind: pipeline +type: vm +name: manifest + +pool: + use: ubuntu + +steps: + - name: manifest + image: plugins/manifest + settings: + auto_tag: true + ignore_missing: true + spec: docker/manifest.tmpl + username: + from_secret: docker_username + password: + from_secret: docker_password + when: + event: [push, tag] + +depends_on: + - default + - arm -- name: release - image: plugins/github-release - settings: - files: - - release/drone_*.tar.gz - - release/drone_checksums.txt - api_key: - from_secret: github_token - when: - event: tag diff --git a/.github_changelog_generator b/.github_changelog_generator new file mode 100644 index 00000000..5848d3ca --- /dev/null +++ b/.github_changelog_generator @@ -0,0 +1 @@ +since-tag=v1.3.0 diff --git a/.gitignore b/.gitignore index 9252a88d..59ba9d82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ drone/drone release .env +.vscode \ No newline at end of file diff --git a/BUILDING b/BUILDING index fcc0c73a..0c66f18a 100644 --- a/BUILDING +++ b/BUILDING @@ -1,5 +1,5 @@ 1. Clone the repository -2. Install go 1.13 or later with Go modules enabled +2. Install go 1.16 or later with Go modules enabled 3. Install binaries to $GOPATH/bin go install ./... diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..794a18c9 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,129 @@ +# Changelog + +## [1.7.0](https://github.com/harness/drone-cli/tree/1.7.0) (2023-01-24) + +[Full Changelog](https://github.com/harness/drone-cli/compare/v1.6.2...1.7.0) + +**Implemented enhancements:** + +- Add support for jpath in jsonnet [\#224](https://github.com/harness/drone-cli/pull/224) ([rhiaxion](https://github.com/rhiaxion)) + +## [v1.6.2](https://github.com/harness/drone-cli/tree/v1.6.2) (2022-11-24) + +[Full Changelog](https://github.com/harness/drone-cli/compare/v1.6.1...v1.6.2) + +**Fixed bugs:** + +- fix: use right parameter name for secrets-file [\#226](https://github.com/harness/drone-cli/pull/226) ([kameshsampath](https://github.com/kameshsampath)) + +**Merged pull requests:** + +- \(maint\) prep v1.6.2 [\#227](https://github.com/harness/drone-cli/pull/227) ([tphoney](https://github.com/tphoney)) + +## [v1.6.1](https://github.com/harness/drone-cli/tree/v1.6.1) (2022-10-21) + +[Full Changelog](https://github.com/harness/drone-cli/compare/v1.6.0...v1.6.1) + +**Fixed bugs:** + +- \(fix\) add secret file to compiler in exec [\#222](https://github.com/harness/drone-cli/pull/222) ([tphoney](https://github.com/tphoney)) + +**Merged pull requests:** + +- \(maint\) release prep 1.6.1 & go tidy [\#223](https://github.com/harness/drone-cli/pull/223) ([tphoney](https://github.com/tphoney)) + +## [v1.6.0](https://github.com/harness/drone-cli/tree/v1.6.0) (2022-10-19) + +[Full Changelog](https://github.com/harness/drone-cli/compare/v1.5.0...v1.6.0) + +**Implemented enhancements:** + +- \(drone-372\) use the modern docker runner for exec, upgrade deps [\#216](https://github.com/harness/drone-cli/pull/216) ([tphoney](https://github.com/tphoney)) +- \(feat\) start migration from drone-yaml dependency. use docker compiler for lint [\#210](https://github.com/harness/drone-cli/pull/210) ([tphoney](https://github.com/tphoney)) + +**Fixed bugs:** + +- fix: use .drone.yml as default pipeline file [\#219](https://github.com/harness/drone-cli/pull/219) ([kameshsampath](https://github.com/kameshsampath)) +- \(fix\): add labels for tooling to query containers [\#218](https://github.com/harness/drone-cli/pull/218) ([kameshsampath](https://github.com/kameshsampath)) + +**Merged pull requests:** + +- \(maint\) v1.6.0 release prep [\#221](https://github.com/harness/drone-cli/pull/221) ([tphoney](https://github.com/tphoney)) +- add community information [\#213](https://github.com/harness/drone-cli/pull/213) ([mrsantons](https://github.com/mrsantons)) + +## [v1.5.0](https://github.com/harness/drone-cli/tree/v1.5.0) (2022-01-04) + +[Full Changelog](https://github.com/harness/drone-cli/compare/v1.4.0...v1.5.0) + +**Implemented enhancements:** + +- Update README.md [\#205](https://github.com/harness/drone-cli/pull/205) ([tphoney](https://github.com/tphoney)) +- \(dron-124\) Add new command for build incomplete V2 [\#204](https://github.com/harness/drone-cli/pull/204) ([tphoney](https://github.com/tphoney)) + +**Fixed bugs:** + +- update libaries with vulnerabilies [\#208](https://github.com/harness/drone-cli/pull/208) ([eoinmcafee00](https://github.com/eoinmcafee00)) +- fixes issue where template info command wasn't working [\#203](https://github.com/harness/drone-cli/pull/203) ([eoinmcafee00](https://github.com/eoinmcafee00)) +- Update go-jsonnet to version v0.17.0 [\#202](https://github.com/harness/drone-cli/pull/202) ([hjkatz](https://github.com/hjkatz)) + +**Merged pull requests:** + +- release prep v1.5 [\#211](https://github.com/harness/drone-cli/pull/211) ([eoinmcafee00](https://github.com/eoinmcafee00)) + +## [v1.4.0](https://github.com/harness/drone-cli/tree/v1.4.0) (2021-09-08) + +[Full Changelog](https://github.com/harness/drone-cli/compare/v1.3.3...v1.4.0) + +**Implemented enhancements:** + +- provides ability to update auto-cancel-running flag on repo [\#198](https://github.com/harness/drone-cli/pull/198) ([eoinmcafee00](https://github.com/eoinmcafee00)) + +**Fixed bugs:** + +- \(fix\) fix multi-docs/lists in starlark [\#200](https://github.com/harness/drone-cli/pull/200) ([tphoney](https://github.com/tphoney)) + +**Merged pull requests:** + +- \(maint\) release-v1.4.0 prep [\#201](https://github.com/harness/drone-cli/pull/201) ([tphoney](https://github.com/tphoney)) + +## [v1.3.3](https://github.com/harness/drone-cli/tree/v1.3.3) (2021-08-26) + +[Full Changelog](https://github.com/harness/drone-cli/compare/v1.3.2...v1.3.3) + +**Fixed bugs:** + +- Fix `--stream` combined with `--format` for `jsonnet` [\#195](https://github.com/harness/drone-cli/pull/195) ([julienduchesne](https://github.com/julienduchesne)) + +**Merged pull requests:** + +- \(maint\) release prep v1.3.3 [\#197](https://github.com/harness/drone-cli/pull/197) ([tphoney](https://github.com/tphoney)) + +## [v1.3.2](https://github.com/harness/drone-cli/tree/v1.3.2) (2021-08-25) + +[Full Changelog](https://github.com/harness/drone-cli/compare/v1.3.1...v1.3.2) + +**Fixed bugs:** + +- \(fix\) re-enable format option for jsonnet command [\#193](https://github.com/harness/drone-cli/pull/193) ([tphoney](https://github.com/tphoney)) + +**Merged pull requests:** + +- \(maint\) release prep for v1.3.2 [\#194](https://github.com/harness/drone-cli/pull/194) ([tphoney](https://github.com/tphoney)) + +## [v1.3.1](https://github.com/harness/drone-cli/tree/v1.3.1) (2021-08-20) + +[Full Changelog](https://github.com/harness/drone-cli/compare/v1.3.0...v1.3.1) + +**Fixed bugs:** + +- Defect/permission template [\#191](https://github.com/harness/drone-cli/pull/191) ([eoinmcafee00](https://github.com/eoinmcafee00)) +- \(DRON-113\) use ghodss/yaml for yaml printing [\#189](https://github.com/harness/drone-cli/pull/189) ([tphoney](https://github.com/tphoney)) +- fixes issue were cli required an additional parameter in order to com… [\#188](https://github.com/harness/drone-cli/pull/188) ([eoinmcafee00](https://github.com/eoinmcafee00)) + +**Merged pull requests:** + +- release prep v1.3.1 [\#192](https://github.com/harness/drone-cli/pull/192) ([eoinmcafee00](https://github.com/eoinmcafee00)) + + + +\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* diff --git a/Dockerfile b/Dockerfile index 1489f55e..2e3746b8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,9 @@ -FROM drone/ca-certs +FROM amd64/alpine:3.17 as alpine +RUN apk add -U --no-cache ca-certificates + +FROM amd64/alpine:3.17 +ENV GODEBUG netdns=go +COPY --from=alpine /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY release/linux/amd64/drone /bin/ diff --git a/Dockerfile.alpine b/Dockerfile.alpine deleted file mode 100644 index 3f91a127..00000000 --- a/Dockerfile.alpine +++ /dev/null @@ -1,7 +0,0 @@ -FROM alpine:3.7 - -RUN apk add --no-cache ca-certificates - -COPY release/linux/amd64/drone /bin/ - -ENTRYPOINT ["/bin/drone"] diff --git a/Dockerfile.linux.arm b/Dockerfile.linux.arm index 1091c583..75e059c7 100644 --- a/Dockerfile.linux.arm +++ b/Dockerfile.linux.arm @@ -1,4 +1,11 @@ -FROM drone/ca-certs +FROM arm32v7/alpine:3.12 as alpine +RUN apk add -U --no-cache ca-certificates + + +FROM arm32v7/alpine:3.12 + +ENV GODEBUG netdns=go +COPY --from=alpine /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY release/linux/arm/drone /bin/ diff --git a/Dockerfile.linux.arm64 b/Dockerfile.linux.arm64 index 1ce230f1..f31a295d 100644 --- a/Dockerfile.linux.arm64 +++ b/Dockerfile.linux.arm64 @@ -1,4 +1,11 @@ -FROM drone/ca-certs +FROM arm64v8/alpine:3.12 as alpine +RUN apk add -U --no-cache ca-certificates + + +FROM arm64v8/alpine:3.12 + +ENV GODEBUG netdns=go +COPY --from=alpine /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY release/linux/arm64/drone /bin/ diff --git a/Dockerfile.linux.ppc64le b/Dockerfile.linux.ppc64le index 783b51cc..a038016c 100644 --- a/Dockerfile.linux.ppc64le +++ b/Dockerfile.linux.ppc64le @@ -1,4 +1,9 @@ -FROM drone/ca-certs +FROM ppc64le/alpine:3.17 as alpine +RUN apk add -U --no-cache ca-certificates + +FROM ppc64le/alpine:3.17 +ENV GODEBUG netdns=go +COPY --from=alpine /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY release/linux/ppc64le/drone /bin/ diff --git a/README.md b/README.md index d98da53e..9a0b8422 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,34 @@ Command line client for the Drone continuous integration server. -Documentation:
-https://docs.drone.io/cli +Documentation: https://docs.drone.io/cli -Technical Support:
-https://discourse.drone.io +## Release procedure + +Run the changelog generator. + +```BASH +docker run -it --rm -v "$(pwd)":/usr/local/src/your-app githubchangeloggenerator/github-changelog-generator -u harness -p drone-cli -t +``` + +You can generate a token by logging into your GitHub account and going to Settings -> Personal access tokens. + +Next we tag the PR's with the fixes or enhancements labels. If the PR does not fufil the requirements, do not add a label. + +Run the changelog generator again with the future version according to semver. + +```BASH +docker run -it --rm -v "$(pwd)":/usr/local/src/your-app githubchangeloggenerator/github-changelog-generator -u harness -p drone-cli -t --future-release v1.0.0 +``` + +Create your pull request for the release. Get it merged then tag the release. + +## Community and Support +[Harness Community Slack](https://join.slack.com/t/harnesscommunity/shared_invite/zt-y4hdqh7p-RVuEQyIl5Hcx4Ck8VCvzBw) - Join the #drone slack channel to connect with our engineers and other users running Drone CI. + +[Harness Community Forum](https://community.harness.io/) - Ask questions, find answers, and help other users. + +[Report or Track A Bug](https://community.harness.io/c/bugs/17) - Find a bug? Please report in our forum under Drone Bugs. Please provide screenshots and steps to reproduce. + +[Events](https://www.meetup.com/harness/) - Keep up to date with Drone events and check out previous events [here](https://www.youtube.com/watch?v=Oq34ImUGcHA&list=PLXsYHFsLmqf3zwelQDAKoVNmLeqcVsD9o). -Bug Tracker:
-https://discourse.drone.io/c/bugs diff --git a/docker/manifest.tmpl b/docker/manifest.tmpl new file mode 100644 index 00000000..e44bd551 --- /dev/null +++ b/docker/manifest.tmpl @@ -0,0 +1,35 @@ +image: drone/cli:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}} +{{#if build.tags}} +tags: +{{#each build.tags}} + - {{this}} +{{/each}} +{{/if}} +manifests: + - + image: drone/cli:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64 + platform: + architecture: amd64 + os: linux + - + image: drone/cli:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}alpine-amd64 + platform: + architecture: amd64 + os: linux + - + image: drone/cli:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm + platform: + architecture: arm + os: linux + variant: v6 + - + image: drone/cli:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64 + platform: + architecture: arm64 + os: linux + variant: v8 + - + image: drone/cli:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-ppc64le + platform: + architecture: ppc64le + os: linux diff --git a/drone/build/build.go b/drone/build/build.go index 92d40c17..36e2b500 100644 --- a/drone/build/build.go +++ b/drone/build/build.go @@ -18,5 +18,6 @@ var Command = cli.Command{ buildPromoteCmd, buildRollbackCmd, buildQueueCmd, + buildQueueV2Cmd, }, } diff --git a/drone/build/build_queue_v2.go b/drone/build/build_queue_v2.go new file mode 100644 index 00000000..456f2cb8 --- /dev/null +++ b/drone/build/build_queue_v2.go @@ -0,0 +1,88 @@ +package build + +import ( + "os" + "text/template" + + "github.com/drone/drone-cli/drone/internal" + "github.com/drone/funcmap" + "github.com/urfave/cli" +) + +var buildQueueV2Cmd = cli.Command{ + Name: "queue-v2", + Usage: "show build queue", + ArgsUsage: "", + Action: buildQueueV2, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "format", + Usage: "format output", + Value: tmplQueueV2Status, + }, + cli.StringFlag{ + Name: "repo", + Usage: "repo filter", + }, + }, +} + +func buildQueueV2(c *cli.Context) error { + client, err := internal.NewClient(c) + if err != nil { + return err + } + + instances, err := client.IncompleteV2() + if err != nil { + return err + } + + tmpl, err := template.New("_").Funcs(funcmap.Funcs).Parse(c.String("format") + "\n") + if err != nil { + return err + } + + slug := c.String("repo") + + for _, instance := range instances { + if slug != "" && instance.RepoSlug != slug { + continue + } + templateErr := tmpl.Execute(os.Stdout, instance) + if templateErr != nil { + return templateErr + } + } + return nil +} + +// template for build queue v2 information +var tmplQueueV2Status = "\x1b[33m{{ .RepoSlug }}#{{ .BuildNumber }} \x1b[0m" + ` +Repo Namespace: {{ .RepoNamespace }} +Repo Name: {{ .RepoName }} +Repo Slug: {{ .RepoSlug }} +Build Number: {{ .BuildNumber }} +Build Author: {{ .BuildAuthor }} +Build Author Name : {{ .BuildAuthorName }} +Build Author Email: {{ .BuildAuthorEmail }} +Build Author Avatar : {{ .BuildAuthorAvatar }} +Build Sender: {{ .BuildSender }} +Build Started: {{ .BuildStarted | time }} +Build Finished: {{ .BuildFinished | time}} +Build Created: {{ .BuildCreated | time}} +Build Updated: {{ .BuildUpdated | time }} +Stage Name: {{ .StageName }} +Stage Kind: {{ .StageKind }} +Stage Type: {{ .StageType }} +Stage Status: {{ .StageStatus }} +Stage Machine: {{ .StageMachine }} +Stage OS: {{ .StageOS }} +Stage Arch: {{ .StageArch }} +Stage Variant: {{ .StageVariant }} +Stage Kernel: {{ .StageKernel }} +Stage Limit: {{ .StageLimit }} +Stage Limit Repo: {{ .StageLimitRepo }} +Stage Started: {{ .StageStarted | time }} +Stage Stopped: {{ .StageStopped | time }} +` diff --git a/drone/convert/convert.go b/drone/convert/convert.go index d9afa7b6..98159b06 100644 --- a/drone/convert/convert.go +++ b/drone/convert/convert.go @@ -1,19 +1,15 @@ package convert import ( - "bytes" - "io" "io/ioutil" - "os" - "github.com/drone/drone-yaml/yaml/converter" "github.com/urfave/cli" ) // Command exports the convert command. var Command = cli.Command{ Name: "convert", - Usage: "convert legacy format", + Usage: " convert legacy format", ArgsUsage: "", Action: convert, Flags: []cli.Flag{ @@ -30,20 +26,9 @@ func convert(c *cli.Context) error { path = ".drone.yml" } - raw, err := ioutil.ReadFile(path) + _, err := ioutil.ReadFile(path) if err != nil { return err } - - res, err := converter.Convert(raw, converter.Metadata{Filename: path}) - if err != nil { - return err - } - - if c.Bool("save") { - return ioutil.WriteFile(path, res, 0644) - } - - _, err = io.Copy(os.Stderr, bytes.NewReader(res)) return err } diff --git a/drone/cron/cron.go b/drone/cron/cron.go index d8cf9de9..a044d4d9 100644 --- a/drone/cron/cron.go +++ b/drone/cron/cron.go @@ -10,7 +10,9 @@ var Command = cli.Command{ cronListCmd, cronInfoCmd, cronCreateCmd, + cronDeleteCmd, cronDisableCmd, cronEnableCmd, + cronExecCmd, }, } diff --git a/drone/cron/cron_exec.go b/drone/cron/cron_exec.go new file mode 100644 index 00000000..4f2c5187 --- /dev/null +++ b/drone/cron/cron_exec.go @@ -0,0 +1,35 @@ +package cron + +import ( + "errors" + + "github.com/drone/drone-cli/drone/internal" + "github.com/urfave/cli" +) + +var cronExecCmd = cli.Command{ + Name: "exec", + Usage: "trigger cron job", + ArgsUsage: "[repo/name] [cronjob]", + Action: cronExec, +} + +func cronExec(c *cli.Context) error { + slug := c.Args().First() + owner, name, err := internal.ParseRepo(slug) + if err != nil { + return err + } + + client, err := internal.NewClient(c) + if err != nil { + return err + } + + cron := c.Args().Get(1) + if cron == "" { + return errors.New("missing cronjob name") + } + + return client.CronExec(owner, name, cron) +} diff --git a/drone/cron/cron_rm.go b/drone/cron/cron_rm.go new file mode 100644 index 00000000..403c3f53 --- /dev/null +++ b/drone/cron/cron_rm.go @@ -0,0 +1,28 @@ +package cron + +import ( + "github.com/drone/drone-cli/drone/internal" + "github.com/urfave/cli" +) + +var cronDeleteCmd = cli.Command{ + Name: "rm", + Usage: "deletes a cronjob", + ArgsUsage: "[repo/name] [cronjob]", + Action: cronDelete, +} + +func cronDelete(c *cli.Context) error { + slug := c.Args().First() + owner, name, err := internal.ParseRepo(slug) + if err != nil { + return err + } + client, err := internal.NewClient(c) + if err != nil { + return err + } + cron := c.Args().Get(1) + client.CronDelete(owner, name, cron) + return client.CronDelete(owner, name, cron) +} diff --git a/drone/exec/env.go b/drone/exec/env.go index 3d284e5f..de627bc5 100644 --- a/drone/exec/env.go +++ b/drone/exec/env.go @@ -63,15 +63,3 @@ func prefixedEnviron(environ []string) map[string]string { } return envs } - -// helper function combines one or more maps of environment -// variables into a single map. -func combineEnviron(env ...map[string]string) map[string]string { - c := map[string]string{} - for _, e := range env { - for k, v := range e { - c[k] = v - } - } - return c -} diff --git a/drone/exec/exec.go b/drone/exec/exec.go index 3768d1de..b40b8eed 100644 --- a/drone/exec/exec.go +++ b/drone/exec/exec.go @@ -2,35 +2,38 @@ package exec import ( "context" - "errors" + "encoding/json" "fmt" "io/ioutil" "log" - "net/url" "os" - "strconv" + "strings" "time" - "github.com/drone/envsubst" + "github.com/drone-runners/drone-runner-docker/engine" + "github.com/drone-runners/drone-runner-docker/engine/compiler" + "github.com/drone-runners/drone-runner-docker/engine/linter" + "github.com/drone-runners/drone-runner-docker/engine/resource" - "github.com/drone/drone-runtime/engine" - "github.com/drone/drone-runtime/engine/docker" - "github.com/drone/drone-runtime/runtime" - "github.com/drone/drone-runtime/runtime/term" - "github.com/drone/drone-yaml/yaml" - "github.com/drone/drone-yaml/yaml/compiler" - "github.com/drone/drone-yaml/yaml/compiler/transform" - "github.com/drone/drone-yaml/yaml/converter" - "github.com/drone/drone-yaml/yaml/linter" + "github.com/drone/drone-go/drone" + "github.com/drone/envsubst" + "github.com/drone/runner-go/environ" + "github.com/drone/runner-go/environ/provider" + "github.com/drone/runner-go/labels" + "github.com/drone/runner-go/logger" + "github.com/drone/runner-go/manifest" + "github.com/drone/runner-go/pipeline" + "github.com/drone/runner-go/pipeline/runtime" + "github.com/drone/runner-go/pipeline/streamer/console" + "github.com/drone/runner-go/registry" + "github.com/drone/runner-go/secret" "github.com/drone/signal" - "github.com/joho/godotenv" - "github.com/mattn/go-colorable" - "github.com/mattn/go-isatty" + "github.com/sirupsen/logrus" "github.com/urfave/cli" ) -var tty = isatty.IsTerminal(os.Stdout.Fd()) +var nocontext = context.Background() // Command exports the exec command. var Command = cli.Command{ @@ -67,6 +70,10 @@ var Command = cli.Command{ Name: "trusted", Usage: "build is trusted", }, + cli.BoolTFlag{ + Name: "pretty", + Usage: "enable pretty printing", + }, cli.DurationFlag{ Name: "timeout", Usage: "build timeout", @@ -80,9 +87,9 @@ var Command = cli.Command{ Name: "network", Usage: "external networks", }, - cli.StringSliceFlag{ + cli.StringFlag{ Name: "registry", - Usage: "registry", + Usage: "registry file", }, cli.StringFlag{ Name: "secret-file", @@ -103,10 +110,7 @@ var Command = cli.Command{ "plugins/heroku", }, }, - - // // netrc parameters - // cli.StringFlag{ Name: "netrc-username", }, @@ -116,11 +120,7 @@ var Command = cli.Command{ cli.StringFlag{ Name: "netrc-machine", }, - - // // trigger parameters - // - cli.StringFlag{ Name: "branch", Usage: "branch name", @@ -133,14 +133,14 @@ var Command = cli.Command{ Name: "instance", Usage: "instance hostname (e.g. drone.company.com)", }, - cli.StringFlag{ - Name: "ref", - Usage: "git reference", - }, - cli.StringFlag{ - Name: "sha", - Usage: "git sha", - }, + // cli.StringFlag{ + // Name: "ref", + // Usage: "git reference", + // }, NOT NEEDED + // cli.StringFlag{ + // Name: "sha", + // Usage: "git sha", + // }, cli.StringFlag{ Name: "repo", Usage: "git repository name (e.g. octocat/hello-world)", @@ -152,215 +152,239 @@ var Command = cli.Command{ }, } -func exec(c *cli.Context) error { - file := c.Args().First() - if file == "" { - file = ".drone.yml" - } +func exec(cliContext *cli.Context) error { + // lets do our mapping from CLI flags to an execCommand struct + commy := mapOldToExecCommand(cliContext) - data, err := ioutil.ReadFile(file) + rawsource, err := ioutil.ReadFile(commy.Source) if err != nil { return err } + envs := environ.Combine( + getEnv(cliContext), + environ.System(commy.System), + environ.Repo(commy.Repo), + environ.Build(commy.Build), + environ.Stage(commy.Stage), + environ.Link(commy.Repo, commy.Build, commy.System), + commy.Build.Params, + ) - environ := getEnv(c) - dataS, err := envsubst.Eval(string(data), func(name string) string { - return environ[name] - }) + // string substitution function ensures that string + // replacement variables are escaped and quoted if they + // contain newlines. + subf := func(k string) string { + v := envs[k] + if strings.Contains(v, "\n") { + v = fmt.Sprintf("%q", v) + } + return v + } + + // evaluates string replacement expressions and returns an + // update configuration. + config, err := envsubst.Eval(string(rawsource), subf) if err != nil { return err } - // this code is temporarily in place to detect and convert - // the legacy yaml configuration file to the new format. - dataS, err = converter.ConvertString(dataS, converter.Metadata{ - Filename: file, - Ref: c.String("ref"), - }) + // parse and lint the configuration. + manifest, err := manifest.ParseString(config) if err != nil { return err } - manifest, err := yaml.ParseString(dataS) + // a configuration can contain multiple pipelines. + // get a specific pipeline resource for execution. + if commy.Stage.Name == "" { + fmt.Println("No stage specified, assuming 'default'") + } + + res, err := resource.Lookup(commy.Stage.Name, manifest) + if err != nil { + return fmt.Errorf("Stage '%s' not found in build file : %s", commy.Stage.Name, err) + } + + // lint the pipeline and return an error if any + // linting rules are broken + lint := linter.New() + err = lint.Lint(res, commy.Repo) if err != nil { return err } - var pipeline *yaml.Pipeline - filter := c.String("pipeline") - for _, resource := range manifest.Resources { - v, ok := resource.(*yaml.Pipeline) - if !ok { - continue - } + // compile the pipeline to an intermediate representation. + comp := &compiler.Compiler{ + Environ: provider.Static(commy.Environ), + Labels: commy.Labels, + Resources: commy.Resources, + Tmate: commy.Tmate, + Privileged: append(commy.Privileged, compiler.Privileged...), + Networks: commy.Networks, + Volumes: commy.Volumes, + Secret: secret.StaticVars(commy.Secrets), + Registry: registry.Combine( + registry.File(commy.Config), + ), + } - if v.Type != "" && v.Type != "docker" { - return fmt.Errorf("pipeline type (%s) is not supported with 'drone exec'", v.Type) + // when running a build locally cloning is always + // disabled in favor of mounting the source code + // from the current working directory. + if !commy.Clone { + pwd, _ := os.Getwd() + comp.Mount = pwd + //Add the new labels that helps looking up the step containers + //by names + if comp.Labels == nil { + comp.Labels = make(map[string]string) } + comp.Labels["io.drone.desktop.pipeline.dir"] = pwd - if filter == "" || filter == v.Name { - pipeline = v - break - } - } - if pipeline == nil { - return errors.New("cannot find pipeline") } - trusted := c.Bool("trusted") - err = linter.Lint(pipeline, trusted) - if err != nil { - return err + args := runtime.CompilerArgs{ + Pipeline: res, + Manifest: manifest, + Build: commy.Build, + Netrc: commy.Netrc, + Repo: commy.Repo, + Stage: commy.Stage, + System: commy.System, + Secret: secret.StaticVars(commy.Secrets), } + spec := comp.Compile(nocontext, args).(*engine.Spec) - // the user has the option to disable the git clone - // if the pipeline is being executed on the local - // codebase. - if c.Bool("clone") == false { - pipeline.Clone.Disable = true + //As the Compiler does not add labels for Steps adding few here + for i, step := range spec.Steps { + step.Labels = labels.Combine(step.Labels, + map[string]string{ + "io.drone.step.name": step.Name, + "io.drone.step.number": fmt.Sprint(i), + }) } - comp := new(compiler.Compiler) - comp.PrivilegedFunc = compiler.DindFunc( - c.StringSlice("privileged"), - ) - comp.SkipFunc = compiler.SkipFunc( - compiler.SkipData{ - Branch: environ["DRONE_BRANCH"], - Event: environ["DRONE_EVENT"], - Instance: environ["DRONE_SYSTEM_HOST"], - Ref: environ["DRONE_COMMIT_REF"], - Repo: environ["DRONE_REPO"], - Target: environ["DRONE_DEPLOY_TO"], - }, - ) - transforms := []func(*engine.Spec){ - transform.Include( - c.StringSlice("include"), - ), - transform.Exclude( - c.StringSlice("exclude"), - ), - transform.ResumeAt( - c.String("resume-at"), - ), - transform.WithAuths( - toRegistry( - c.StringSlice("registry"), - ), - ), - transform.WithEnviron( - readParams( - c.String("env-file"), - ), - ), - transform.WithEnviron(environ), - transform.WithLables(nil), - transform.WithLimits(0, 0), - transform.WithNetrc( - c.String("netrc-machine"), - c.String("netrc-username"), - c.String("netrc-password"), - ), - transform.WithNetworks( - c.StringSlice("network"), - ), - transform.WithProxy(), - transform.WithSecrets( - readParams( - c.String("secret-file"), - ), - ), - transform.WithVolumeSlice( - c.StringSlice("volume"), - ), + // include only steps that are in the include list, + // if the list in non-empty. + if len(commy.Include) > 0 { + I: + for _, step := range spec.Steps { + if step.Name == "clone" { + continue + } + for _, name := range commy.Include { + if step.Name == name { + continue I + } + } + step.RunPolicy = runtime.RunNever + } } - if c.Bool("clone") == false { - pwd, _ := os.Getwd() - comp.WorkspaceMountFunc = compiler.MountHostWorkspace - comp.WorkspaceFunc = compiler.CreateHostWorkspace(pwd) + // exclude steps that are in the exclude list, if the list in non-empty. + if len(commy.Exclude) > 0 { + E: + for _, step := range spec.Steps { + if step.Name == "clone" { + continue + } + for _, name := range commy.Exclude { + if step.Name == name { + step.RunPolicy = runtime.RunNever + continue E + } + } + } } - comp.TransformFunc = transform.Combine(transforms...) - ir := comp.Compile(pipeline) - - ctx, cancel := context.WithTimeout( - context.Background(), - c.Duration("timeout"), - ) - ctx = signal.WithContext(ctx) - defer cancel() + // resume at a specific step + if cliContext.String("resume-at") != "" { + for _, step := range spec.Steps { + if step.Name == cliContext.String("resume-at") { + break + } + if step.Name == "clone" { + continue + } + for _, name := range commy.Exclude { + if step.Name == name { + step.RunPolicy = runtime.RunNever + continue + } + } + } + } + // create a step object for each pipeline step. + for _, step := range spec.Steps { + if step.RunPolicy == runtime.RunNever { + continue + } - // creates a docker-based engine. eventually we will - // include the kubernetes and vmware fusion engines. - engine, err := docker.NewEnv() - if err != nil { - return err + commy.Stage.Steps = append(commy.Stage.Steps, &drone.Step{ + StageID: commy.Stage.ID, + Number: len(commy.Stage.Steps) + 1, + Name: step.Name, + Status: drone.StatusPending, + ErrIgnore: step.ErrPolicy == runtime.ErrIgnore, + }) } - // creates a hook to print the step output to stdout, - // with per-step color coding if a tty. - hooks := &runtime.Hook{} - hooks.BeforeEach = func(s *runtime.State) error { - s.Step.Envs["CI_BUILD_STATUS"] = "success" - s.Step.Envs["CI_BUILD_STARTED"] = strconv.FormatInt(s.Runtime.Time, 10) - s.Step.Envs["CI_BUILD_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10) - s.Step.Envs["DRONE_BUILD_STATUS"] = "success" - s.Step.Envs["DRONE_BUILD_STARTED"] = strconv.FormatInt(s.Runtime.Time, 10) - s.Step.Envs["DRONE_BUILD_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10) + // configures the pipeline timeout. + timeout := time.Duration(commy.Repo.Timeout) * time.Minute + ctx, cancel := context.WithTimeout(nocontext, timeout) + defer cancel() - s.Step.Envs["CI_JOB_STATUS"] = "success" - s.Step.Envs["CI_JOB_STARTED"] = strconv.FormatInt(s.Runtime.Time, 10) - s.Step.Envs["CI_JOB_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10) - s.Step.Envs["DRONE_JOB_STATUS"] = "success" - s.Step.Envs["DRONE_JOB_STARTED"] = strconv.FormatInt(s.Runtime.Time, 10) - s.Step.Envs["DRONE_JOB_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10) + // listen for operating system signals and cancel execution when received. + ctx = signal.WithContextFunc(ctx, func() { + println("received signal, terminating process") + cancel() + }) - if s.Runtime.Error != nil { - s.Step.Envs["CI_BUILD_STATUS"] = "failure" - s.Step.Envs["CI_JOB_STATUS"] = "failure" - s.Step.Envs["DRONE_BUILD_STATUS"] = "failure" - s.Step.Envs["DRONE_JOB_STATUS"] = "failure" - } - return nil + state := &pipeline.State{ + Build: commy.Build, + Stage: commy.Stage, + Repo: commy.Repo, + System: commy.System, } - hooks.GotLine = term.WriteLine(os.Stdout) - if tty { - hooks.GotLine = term.WriteLinePretty( - colorable.NewColorableStdout(), - ) + // enable debug logging + logrus.SetLevel(logrus.WarnLevel) + if commy.Debug { + logrus.SetLevel(logrus.DebugLevel) } + if commy.Trace { + logrus.SetLevel(logrus.TraceLevel) + } + logger.Default = logger.Logrus( + logrus.NewEntry( + logrus.StandardLogger(), + ), + ) - return runtime.New( - runtime.WithEngine(engine), - runtime.WithConfig(ir), - runtime.WithHooks(hooks), - ).Run(ctx) -} + engine, err := engine.NewEnv(engine.Opts{}) + if err != nil { + return err + } -// helper function converts a slice of urls to a slice -// of docker registry credentials. -func toRegistry(items []string) []*engine.DockerAuth { - auths := []*engine.DockerAuth{} - for _, item := range items { - uri, err := url.Parse(item) - if err != nil { - continue // skip invalid - } - user := uri.User.Username() - pass, _ := uri.User.Password() - uri.User = nil - auths = append(auths, &engine.DockerAuth{ - Address: uri.String(), - Username: user, - Password: pass, - }) + err = runtime.NewExecer( + pipeline.NopReporter(), + console.New(commy.Pretty), + pipeline.NopUploader(), + engine, + commy.Procs, + ).Exec(ctx, spec, state) + + if err != nil { + dump(state) + return err + } + switch state.Stage.Status { + case drone.StatusError, drone.StatusFailing, drone.StatusKilled: + os.Exit(1) } - return auths + return nil } -// helper function reads secrets from a key-value file. -func readParams(path string) map[string]string { - data, _ := godotenv.Read(path) - return data +func dump(v interface{}) { + enc := json.NewEncoder(os.Stdout) + enc.SetIndent("", " ") + _ = enc.Encode(v) } diff --git a/drone/exec/flags.go b/drone/exec/flags.go new file mode 100644 index 00000000..88d9c419 --- /dev/null +++ b/drone/exec/flags.go @@ -0,0 +1,114 @@ +// Copyright 2019 Drone.IO Inc. All rights reserved. +// Use of this source code is governed by the Polyform License +// that can be found in the LICENSE file. + +package exec + +import ( + "strings" + + "github.com/drone-runners/drone-runner-docker/engine/compiler" + "github.com/drone/drone-go/drone" + "github.com/joho/godotenv" + "github.com/urfave/cli" +) + +// Flags maps +type Flags struct { + Build *drone.Build + Netrc *drone.Netrc + Repo *drone.Repo + Stage *drone.Stage + System *drone.System +} + +type execCommand struct { + *Flags + + Source string + Include []string + Exclude []string + Privileged []string + Networks []string + Volumes map[string]string + Environ map[string]string + Labels map[string]string + Secrets map[string]string + Resources compiler.Resources + Tmate compiler.Tmate + Clone bool + Config string + Pretty bool + Procs int64 + Debug bool + Trace bool + Dump bool + PublicKey string + PrivateKey string +} + +func mapOldToExecCommand(input *cli.Context) *execCommand { + pipelineFile := input.Args().First() + if pipelineFile == "" { + pipelineFile = ".drone.yml" + } + return &execCommand{ + Flags: &Flags{ + Build: &drone.Build{ + Event: input.String("event"), + Ref: input.String("ref"), + Deploy: input.String("deploy-to"), + Target: input.String("branch"), + }, + Repo: &drone.Repo{ + Trusted: input.Bool("trusted"), + Timeout: int64(input.Duration("timeout").Seconds()), + Branch: input.String("branch"), + Name: input.String("name"), + }, + Stage: &drone.Stage{ + Name: input.String("pipeline"), + }, + Netrc: &drone.Netrc{ + Machine: input.String("netrc-machine"), + Login: input.String("netrc-username"), + Password: input.String("netrc-password"), + }, + System: &drone.System{ + Host: input.String("instance"), + }, + }, + Source: pipelineFile, + Include: input.StringSlice("include"), + Exclude: input.StringSlice("exclude"), + Clone: input.Bool("clone"), + Networks: input.StringSlice("network"), + Environ: readParams(input.String("env-file")), + Volumes: withVolumeSlice(input.StringSlice("volume")), + Secrets: readParams(input.String("secret-file")), + Config: input.String("registry"), + Privileged: input.StringSlice("privileged"), + Pretty: input.BoolT("pretty"), + } +} + +// WithVolumeSlice is a transform function that adds a set of global volumes to the container that are defined in --volume=host:container format. +func withVolumeSlice(volumes []string) (to map[string]string) { + to = map[string]string{} + for _, s := range volumes { + parts := strings.Split(s, ":") + if len(parts) != 2 { + continue + } + key := parts[0] + val := parts[1] + to[key] = val + } + return to +} + +// helper function reads secrets from a key-value file. +func readParams(path string) map[string]string { + data, _ := godotenv.Read(path) + return data +} diff --git a/drone/exec/_backup/exec.go b/drone/execold/_backup/exec.go similarity index 100% rename from drone/exec/_backup/exec.go rename to drone/execold/_backup/exec.go diff --git a/drone/exec/_backup/line.go b/drone/execold/_backup/line.go similarity index 100% rename from drone/exec/_backup/line.go rename to drone/execold/_backup/line.go diff --git a/drone/execold/env.go b/drone/execold/env.go new file mode 100644 index 00000000..3db3091e --- /dev/null +++ b/drone/execold/env.go @@ -0,0 +1,77 @@ +package execold + +import ( + "os" + "strings" + + "github.com/urfave/cli" +) + +func getEnv(c *cli.Context) map[string]string { + env := prefixedEnviron( + os.Environ(), + ) + if c.IsSet("branch") { + v := c.String("branch") + env["DRONE_BRANCH"] = v + env["DRONE_COMMIT_BRANCH"] = v + env["DRONE_TARGET_BRANCH"] = v + } + if c.IsSet("event") { + v := c.String("event") + env["DRONE_EVENT"] = v + } + if c.IsSet("instance") { + v := c.String("instance") + env["DRONE_SYSTEM_HOST"] = v + env["DRONE_SYSTEM_HOSTNAME"] = v + } + if c.IsSet("ref") { + v := c.String("ref") + env["DRONE_COMMIT_REF"] = v + } + if c.IsSet("sha") { + v := c.String("sha") + env["DRONE_COMMIT_SHA"] = v + } + if c.IsSet("repo") { + v := c.String("repo") + env["DRONE_REPO"] = v + } + if c.IsSet("deploy-to") { + v := c.String("deploy-to") + env["DRONE_DEPLOY_TO"] = v + } + return env +} + +// helper function returns all environment variables +// prefixed with DRONE_. +func prefixedEnviron(environ []string) map[string]string { + envs := map[string]string{} + for _, env := range environ { + if !strings.HasPrefix(env, "DRONE_") { + continue + } + parts := strings.SplitN(env, "=", 2) + if len(parts) != 2 { + continue + } + key := parts[0] + val := parts[1] + envs[key] = val + } + return envs +} + +// helper function combines one or more maps of environment +// variables into a single map. +func combineEnviron(env ...map[string]string) map[string]string { + c := map[string]string{} + for _, e := range env { + for k, v := range e { + c[k] = v + } + } + return c +} diff --git a/drone/execold/exec.go b/drone/execold/exec.go new file mode 100644 index 00000000..32953df0 --- /dev/null +++ b/drone/execold/exec.go @@ -0,0 +1,367 @@ +package execold + +import ( + "context" + "errors" + "fmt" + "io/ioutil" + "log" + "net/url" + "os" + "strconv" + "time" + + "github.com/drone/envsubst" + + "github.com/drone/drone-runtime/engine" + "github.com/drone/drone-runtime/engine/docker" + "github.com/drone/drone-runtime/runtime" + "github.com/drone/drone-runtime/runtime/term" + "github.com/drone/drone-yaml/yaml" + "github.com/drone/drone-yaml/yaml/compiler" + "github.com/drone/drone-yaml/yaml/compiler/transform" + "github.com/drone/drone-yaml/yaml/converter" + "github.com/drone/drone-yaml/yaml/linter" + "github.com/drone/signal" + + "github.com/joho/godotenv" + "github.com/mattn/go-colorable" + "github.com/mattn/go-isatty" + "github.com/urfave/cli" +) + +var tty = isatty.IsTerminal(os.Stdout.Fd()) + +// Command exports the exec command. +var Command = cli.Command{ + Name: "exec_old", + Usage: "(deprecated) execute a local build", + Hidden: true, + ArgsUsage: "[path/to/.drone.yml]", + Action: func(c *cli.Context) { + if err := exec(c); err != nil { + log.Fatalln(err) + } + }, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "pipeline", + Usage: "Name of the pipeline to execute", + }, + cli.StringSliceFlag{ + Name: "include", + Usage: "Name of steps to include", + }, + cli.StringSliceFlag{ + Name: "exclude", + Usage: "Name of steps to exclude", + }, + cli.StringFlag{ + Name: "resume-at", + Usage: "Name of start to resume at", + }, + cli.BoolFlag{ + Name: "clone", + Usage: "enable the clone step", + }, + cli.BoolFlag{ + Name: "trusted", + Usage: "build is trusted", + }, + cli.DurationFlag{ + Name: "timeout", + Usage: "build timeout", + Value: time.Hour, + }, + cli.StringSliceFlag{ + Name: "volume", + Usage: "build volumes", + }, + cli.StringSliceFlag{ + Name: "network", + Usage: "external networks", + }, + cli.StringSliceFlag{ + Name: "registry", + Usage: "registry", + }, + cli.StringFlag{ + Name: "secret-file", + Usage: "secret file, define values that can be used with from_secret", + }, + cli.StringFlag{ + Name: "env-file", + Usage: "env file", + }, + cli.StringSliceFlag{ + Name: "privileged", + Usage: "privileged plugins", + Value: &cli.StringSlice{ + "plugins/docker", + "plugins/acr", + "plugins/ecr", + "plugins/gcr", + "plugins/heroku", + }, + }, + + // + // netrc parameters + // + cli.StringFlag{ + Name: "netrc-username", + }, + cli.StringFlag{ + Name: "netrc-password", + }, + cli.StringFlag{ + Name: "netrc-machine", + }, + + // + // trigger parameters + // + + cli.StringFlag{ + Name: "branch", + Usage: "branch name", + }, + cli.StringFlag{ + Name: "event", + Usage: "build event name (push, pull_request, etc)", + }, + cli.StringFlag{ + Name: "instance", + Usage: "instance hostname (e.g. drone.company.com)", + }, + cli.StringFlag{ + Name: "ref", + Usage: "git reference", + }, + cli.StringFlag{ + Name: "sha", + Usage: "git sha", + }, + cli.StringFlag{ + Name: "repo", + Usage: "git repository name (e.g. octocat/hello-world)", + }, + cli.StringFlag{ + Name: "deploy-to", + Usage: "deployment target (e.g. production)", + }, + }, +} + +func exec(c *cli.Context) error { + file := c.Args().First() + if file == "" { + file = ".drone.yml" + } + + data, err := ioutil.ReadFile(file) + if err != nil { + return err + } + + environ := getEnv(c) + dataS, err := envsubst.Eval(string(data), func(name string) string { + return environ[name] + }) + if err != nil { + return err + } + + // this code is temporarily in place to detect and convert + // the legacy yaml configuration file to the new format. + dataS, err = converter.ConvertString(dataS, converter.Metadata{ + Filename: file, + Ref: c.String("ref"), + }) + if err != nil { + return err + } + + manifest, err := yaml.ParseString(dataS) + if err != nil { + return err + } + + var pipeline *yaml.Pipeline + filter := c.String("pipeline") + for _, resource := range manifest.Resources { + v, ok := resource.(*yaml.Pipeline) + if !ok { + continue + } + + if v.Type != "" && v.Type != "docker" { + return fmt.Errorf("pipeline type (%s) is not supported with 'drone exec'", v.Type) + } + + if filter == "" || filter == v.Name { + pipeline = v + break + } + } + if pipeline == nil { + return errors.New("cannot find pipeline") + } + + trusted := c.Bool("trusted") + err = linter.Lint(pipeline, trusted) + if err != nil { + return err + } + + // the user has the option to disable the git clone + // if the pipeline is being executed on the local + // codebase. + if c.Bool("clone") == false { + pipeline.Clone.Disable = true + } + + comp := new(compiler.Compiler) + comp.PrivilegedFunc = compiler.DindFunc( + c.StringSlice("privileged"), + ) + comp.SkipFunc = compiler.SkipFunc( + compiler.SkipData{ + Branch: environ["DRONE_BRANCH"], + Event: environ["DRONE_EVENT"], + Instance: environ["DRONE_SYSTEM_HOST"], + Ref: environ["DRONE_COMMIT_REF"], + Repo: environ["DRONE_REPO"], + Target: environ["DRONE_DEPLOY_TO"], + }, + ) + transforms := []func(*engine.Spec){ + transform.Include( + c.StringSlice("include"), + ), + transform.Exclude( + c.StringSlice("exclude"), + ), + transform.ResumeAt( + c.String("resume-at"), + ), + transform.WithAuths( + toRegistry( + c.StringSlice("registry"), + ), + ), + transform.WithEnviron( + readParams( + c.String("env-file"), + ), + ), + transform.WithEnviron(environ), + transform.WithLables(nil), + transform.WithLimits(0, 0), + transform.WithNetrc( + c.String("netrc-machine"), + c.String("netrc-username"), + c.String("netrc-password"), + ), + transform.WithNetworks( + c.StringSlice("network"), + ), + transform.WithProxy(), + transform.WithSecrets( + readParams( + c.String("secret-file"), + ), + ), + transform.WithVolumeSlice( + c.StringSlice("volume"), + ), + } + if c.Bool("clone") == false { + pwd, _ := os.Getwd() + comp.WorkspaceMountFunc = compiler.MountHostWorkspace + comp.WorkspaceFunc = compiler.CreateHostWorkspace(pwd) + } + comp.TransformFunc = transform.Combine(transforms...) + ir := comp.Compile(pipeline) + + ctx, cancel := context.WithTimeout( + context.Background(), + c.Duration("timeout"), + ) + ctx = signal.WithContext(ctx) + defer cancel() + + // creates a docker-based engine. eventually we will + // include the kubernetes and vmware fusion engines. + engine, err := docker.NewEnv() + if err != nil { + return err + } + + // creates a hook to print the step output to stdout, + // with per-step color coding if a tty. + hooks := &runtime.Hook{} + hooks.BeforeEach = func(s *runtime.State) error { + s.Step.Envs["CI_BUILD_STATUS"] = "success" + s.Step.Envs["CI_BUILD_STARTED"] = strconv.FormatInt(s.Runtime.Time, 10) + s.Step.Envs["CI_BUILD_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10) + s.Step.Envs["DRONE_BUILD_STATUS"] = "success" + s.Step.Envs["DRONE_BUILD_STARTED"] = strconv.FormatInt(s.Runtime.Time, 10) + s.Step.Envs["DRONE_BUILD_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10) + + s.Step.Envs["CI_JOB_STATUS"] = "success" + s.Step.Envs["CI_JOB_STARTED"] = strconv.FormatInt(s.Runtime.Time, 10) + s.Step.Envs["CI_JOB_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10) + s.Step.Envs["DRONE_JOB_STATUS"] = "success" + s.Step.Envs["DRONE_JOB_STARTED"] = strconv.FormatInt(s.Runtime.Time, 10) + s.Step.Envs["DRONE_JOB_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10) + + if s.Runtime.Error != nil { + s.Step.Envs["CI_BUILD_STATUS"] = "failure" + s.Step.Envs["CI_JOB_STATUS"] = "failure" + s.Step.Envs["DRONE_BUILD_STATUS"] = "failure" + s.Step.Envs["DRONE_JOB_STATUS"] = "failure" + } + return nil + } + + hooks.GotLine = term.WriteLine(os.Stdout) + if tty { + hooks.GotLine = term.WriteLinePretty( + colorable.NewColorableStdout(), + ) + } + + return runtime.New( + runtime.WithEngine(engine), + runtime.WithConfig(ir), + runtime.WithHooks(hooks), + ).Run(ctx) +} + +// helper function converts a slice of urls to a slice +// of docker registry credentials. +func toRegistry(items []string) []*engine.DockerAuth { + auths := []*engine.DockerAuth{} + for _, item := range items { + uri, err := url.Parse(item) + if err != nil { + continue // skip invalid + } + user := uri.User.Username() + pass, _ := uri.User.Password() + uri.User = nil + auths = append(auths, &engine.DockerAuth{ + Address: uri.String(), + Username: user, + Password: pass, + }) + } + return auths +} + +// helper function reads secrets from a key-value file. +func readParams(path string) map[string]string { + data, _ := godotenv.Read(path) + return data +} diff --git a/drone/execold/flags.go b/drone/execold/flags.go new file mode 100644 index 00000000..1e79341b --- /dev/null +++ b/drone/execold/flags.go @@ -0,0 +1,82 @@ +// Copyright 2019 Drone.IO Inc. All rights reserved. +// Use of this source code is governed by the Polyform License +// that can be found in the LICENSE file. + +package execold + +import ( + "github.com/drone-runners/drone-runner-docker/engine/compiler" + "github.com/drone/drone-go/drone" + "github.com/urfave/cli" +) + +// Flags maps +type Flags struct { + Build *drone.Build + Netrc *drone.Netrc + Repo *drone.Repo + Stage *drone.Stage + System *drone.System +} + +type execCommand struct { + *Flags + + Source string + Include []string + Exclude []string + Privileged []string + Networks []string + Volumes map[string]string + Environ map[string]string + Labels map[string]string + Secrets map[string]string + Resources compiler.Resources + Tmate compiler.Tmate + Clone bool + Config string + Pretty bool + Procs int64 + Debug bool + Trace bool + Dump bool + PublicKey string + PrivateKey string +} + +func mapOldToExecCommand(input *cli.Context) (returnVal *execCommand) { + returnVal = &execCommand{ + Flags: &Flags{ + Build: &drone.Build{ + Event: input.String("event"), + Ref: input.String("ref"), + Deploy: input.String("deploy-to"), + }, + Repo: &drone.Repo{ + Trusted: input.Bool("trusted"), + Timeout: int64(input.Int("timeout")), + Branch: input.String("branch"), + Name: input.String("name"), + }, + Stage: &drone.Stage{ + Name: input.String("pipeline"), + }, + Netrc: &drone.Netrc{ + Machine: input.String("netrc-machine"), + Login: input.String("netrc-username"), + Password: input.String("netrc-password"), + }, + System: &drone.System{ + Host: input.String("instance"), + }, + }, + Source: input.Args().First(), + Include: input.StringSlice("include"), + Exclude: input.StringSlice("exclude"), + Clone: input.Bool("clone"), + Networks: input.StringSlice("network"), + Privileged: input.StringSlice("privileged"), + } + + return returnVal +} diff --git a/drone/format/format.go b/drone/format/format.go index eeb6232a..9d2cbc20 100644 --- a/drone/format/format.go +++ b/drone/format/format.go @@ -6,16 +6,15 @@ import ( "io/ioutil" "os" - "github.com/drone/drone-yaml/yaml" - "github.com/drone/drone-yaml/yaml/pretty" "github.com/urfave/cli" ) // Command exports the fmt command. var Command = cli.Command{ Name: "fmt", - Usage: "format the yaml file", + Usage: " format the yaml file", ArgsUsage: "", + Hidden: true, Action: format, Flags: []cli.Flag{ cli.BoolFlag{ @@ -30,18 +29,11 @@ func format(c *cli.Context) error { if path == "" { path = ".drone.yml" } - - manifest, err := yaml.ParseFile(path) - if err != nil { - return err - } - - buf := new(bytes.Buffer) - pretty.Print(buf, manifest) - + out, _ := ioutil.ReadFile(path) + buf := bytes.NewBuffer(out) if c.Bool("save") { return ioutil.WriteFile(path, buf.Bytes(), 0644) } - _, err = io.Copy(os.Stderr, buf) + _, err := io.Copy(os.Stderr, buf) return err } diff --git a/drone/jsonnet/jsonnet.go b/drone/jsonnet/jsonnet.go index 72d8225d..2418dd12 100644 --- a/drone/jsonnet/jsonnet.go +++ b/drone/jsonnet/jsonnet.go @@ -7,15 +7,14 @@ import ( "io/ioutil" "log" "os" + "path/filepath" "strings" - "github.com/drone/drone-yaml/yaml" - "github.com/drone/drone-yaml/yaml/pretty" "github.com/fatih/color" + "github.com/ghodss/yaml" "github.com/google/go-jsonnet" "github.com/urfave/cli" ) - // Command exports the jsonnet command. var Command = cli.Command{ Name: "jsonnet", @@ -57,21 +56,45 @@ var Command = cli.Command{ Name: "extVar, V", Usage: "Pass extVars to Jsonnet (can be specified multiple times)", }, + cli.StringSliceFlag{ + Name: "jpath, J", + Usage: "Specify an additional library search dir (right-most wins)", + }, }, } func generate(c *cli.Context) error { - source := c.String("source") + result, err := convert( + c.String("source"), + c.Bool("string"), + c.Bool("format"), + c.Bool("stream"), + c.StringSlice("extVar"), + c.StringSlice("jpath"), + ) + if err != nil { + return err + } + + // the user can optionally write the yaml to stdout. This is useful for debugging purposes without mutating an existing file. + if c.Bool("stdout") { + io.WriteString(os.Stdout, result) + return nil + } + target := c.String("target") + return ioutil.WriteFile(target, []byte(result), 0644) +} +func convert(source string, stringOutput bool, format bool, stream bool, vars []string, jpath []string) (string, error) { data, err := ioutil.ReadFile(source) if err != nil { - return err + return "", err } vm := jsonnet.MakeVM() vm.MaxStack = 500 - vm.StringOutput = c.Bool("string") + vm.StringOutput = stringOutput vm.ErrorFormatter.SetMaxStackTraceSize(20) vm.ErrorFormatter.SetColorFormatter( color.New(color.FgRed).Fprintf, @@ -80,54 +103,62 @@ func generate(c *cli.Context) error { // register native functions RegisterNativeFuncs(vm) + jsonnetPath := filepath.SplitList(os.Getenv("JSONNET_PATH")) + jsonnetPath = append(jsonnetPath, jpath...) + vm.Importer(&jsonnet.FileImporter{ + JPaths: jsonnetPath, + }) + // extVars - vars := c.StringSlice("extVar") for _, v := range vars { name, value, err := getVarVal(v) if err != nil { - return err + return "", err } vm.ExtVar(name, value) } + formatDoc := func(doc []byte) ([]byte, error) { + // enable yaml output + if format { + formatted, yErr := yaml.JSONToYAML(doc) + if yErr != nil { + return nil, fmt.Errorf("failed to convert to YAML: %v", yErr) + } + return formatted, nil + } + return doc, nil + } + buf := new(bytes.Buffer) - if c.Bool("stream") { + if stream { docs, err := vm.EvaluateSnippetStream(source, string(data)) if err != nil { - return err + return "", err } for _, doc := range docs { + formatted, err := formatDoc([]byte(doc)) + if err != nil { + return "", err + } + buf.WriteString("---") buf.WriteString("\n") - buf.WriteString(doc) + buf.Write(formatted) } } else { result, err := vm.EvaluateSnippet(source, string(data)) if err != nil { - return err + return "", err } - buf.WriteString(result) - } - - // enable yaml formatting with --format - if c.Bool("format") { - manifest, err := yaml.Parse(buf) + formatted, err := formatDoc([]byte(result)) if err != nil { - return err + return "", err } - buf.Reset() - pretty.Print(buf, manifest) - } - - // the user can optionally write the yaml to stdout. This - // is useful for debugging purposes without mutating an - // existing file. - if c.Bool("stdout") { - io.Copy(os.Stdout, buf) - return nil + buf.Write(formatted) } - return ioutil.WriteFile(target, buf.Bytes(), 0644) + return buf.String(), nil } // https://github.com/google/go-jsonnet/blob/master/cmd/jsonnet/cmd.go#L149 diff --git a/drone/jsonnet/jsonnet_test.go b/drone/jsonnet/jsonnet_test.go new file mode 100644 index 00000000..54b66b0e --- /dev/null +++ b/drone/jsonnet/jsonnet_test.go @@ -0,0 +1,45 @@ +package jsonnet + +import ( + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestConvert(t *testing.T) { + testcases := []struct { + name string + jsonnetFile, yamlFile string + stringOutput, format, stream bool + extVars []string + jpath []string + }{ + { + name: "Stream + Format", + jsonnetFile: "stream_format.jsonnet", + yamlFile: "stream_format.yaml", + format: true, stream: true, + }, + { + name: "Jsonnet Path", + jsonnetFile: "stream_format.jsonnet", + yamlFile: "stream_format.yaml", + format: true, stream: true, + jpath: []string{"/path/to/jsonnet/lib"}, + }, + } + + for _, tc := range testcases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + expected, err := os.ReadFile(filepath.Join("./testdata", tc.yamlFile)) + assert.NoError(t, err) + + result, err := convert(filepath.Join("./testdata", tc.jsonnetFile), tc.stringOutput, tc.format, tc.stream, tc.extVars, tc.jpath) + assert.NoError(t, err) + assert.Equal(t, string(expected), result) + }) + } +} diff --git a/drone/jsonnet/testdata/stream_format.jsonnet b/drone/jsonnet/testdata/stream_format.jsonnet new file mode 100644 index 00000000..3252c6c7 --- /dev/null +++ b/drone/jsonnet/testdata/stream_format.jsonnet @@ -0,0 +1,27 @@ +local pipeline(name) = + { + kind: 'pipeline', + type: 'docker', + name: name, + platform: { + os: 'linux', + arch: 'amd64', + }, + steps: [ + { + name: 'test', + image: 'golang:1.16', + commands: ['go test ./...'], + }, + { + name: 'build', + image: 'golang:1.16', + commands: ['go build ./...'], + }, + ], + }; + +[ + pipeline('first'), + pipeline('second'), +] diff --git a/drone/jsonnet/testdata/stream_format.yaml b/drone/jsonnet/testdata/stream_format.yaml new file mode 100644 index 00000000..1728a3f4 --- /dev/null +++ b/drone/jsonnet/testdata/stream_format.yaml @@ -0,0 +1,32 @@ +--- +kind: pipeline +name: first +platform: + arch: amd64 + os: linux +steps: +- commands: + - go test ./... + image: golang:1.16 + name: test +- commands: + - go build ./... + image: golang:1.16 + name: build +type: docker +--- +kind: pipeline +name: second +platform: + arch: amd64 + os: linux +steps: +- commands: + - go test ./... + image: golang:1.16 + name: test +- commands: + - go build ./... + image: golang:1.16 + name: build +type: docker diff --git a/drone/lint/lint.go b/drone/lint/lint.go index 1c3bcfa6..015c8a2c 100644 --- a/drone/lint/lint.go +++ b/drone/lint/lint.go @@ -1,15 +1,22 @@ package lint import ( - "github.com/drone/drone-yaml/yaml" - "github.com/drone/drone-yaml/yaml/linter" + "fmt" + "io/ioutil" + "strings" + + "github.com/drone-runners/drone-runner-docker/engine/linter" + "github.com/drone-runners/drone-runner-docker/engine/resource" + "github.com/drone/drone-go/drone" + "github.com/drone/envsubst" + "github.com/drone/runner-go/manifest" "github.com/urfave/cli" ) // Command exports the linter command. var Command = cli.Command{ Name: "lint", - Usage: "lint the yaml file", + Usage: "lint the yaml file, checks for yaml errors", ArgsUsage: "", Action: lint, Flags: []cli.Flag{ @@ -20,22 +27,77 @@ var Command = cli.Command{ }, } +type Flags struct { + Build drone.Build + Netrc drone.Netrc + Repo drone.Repo + Stage drone.Stage + System drone.System +} + func lint(c *cli.Context) error { + f := new(Flags) + f.Repo.Trusted = c.Bool("trusted") + var envs map[string]string + path := c.Args().First() if path == "" { path = ".drone.yml" } - manifest, err := yaml.ParseFile(path) + rawSource, err := ioutil.ReadFile(path) if err != nil { return err } - - for _, resource := range manifest.Resources { - if err := linter.Lint(resource, c.Bool("trusted")); err != nil { - return err + // string substitution function ensures that string replacement variables are escaped and quoted if they contain newlines. + subf := func(k string) string { + v := envs[k] + if strings.Contains(v, "\n") { + v = fmt.Sprintf("%q", v) + } + return v + } + // evaluates string replacement expressions and returns an update configuration. + config, err := envsubst.Eval(string(rawSource), subf) + if err != nil { + return err + } + // parse into manifests + inputManifests, err := manifest.ParseString(config) + if err != nil { + return err + } + for _, iter := range inputManifests.Resources { + if iter.GetType() == "docker" { + resource, err := resource.Lookup(iter.GetName(), inputManifests) + if err != nil { + return err + } + // lint the resource and return an error if any linting rules are broken + lint := linter.New() + err = lint.Lint(resource, &f.Repo) + if err != nil { + return err + } + } + } + // now we can check the pipeline dependencies + // get a list of all the pipelines + allStages := map[string]struct{}{} + for _, iter := range inputManifests.Resources { + allStages[iter.GetName()] = struct{}{} + } + // we need to parse the file again into raw resources to access the dependencies + inputRawResources, err := manifest.ParseRawFile(path) + if err != nil { + return err + } + for _, iter := range inputRawResources { + for _, dep := range iter.Deps { + if _, ok := allStages[dep]; !ok { + return fmt.Errorf("Pipeline stage '%s' declares invalid dependency '%s'", iter.Name, dep) + } } } - return nil } diff --git a/drone/main.go b/drone/main.go index 36cf7177..9cbfe770 100644 --- a/drone/main.go +++ b/drone/main.go @@ -10,6 +10,7 @@ import ( "github.com/drone/drone-cli/drone/cron" "github.com/drone/drone-cli/drone/encrypt" "github.com/drone/drone-cli/drone/exec" + "github.com/drone/drone-cli/drone/execold" "github.com/drone/drone-cli/drone/format" "github.com/drone/drone-cli/drone/info" "github.com/drone/drone-cli/drone/jsonnet" @@ -81,6 +82,7 @@ func main() { log.Command, encrypt.Command, exec.Command, + execold.Command, info.Command, repo.Command, user.Command, diff --git a/drone/plugins/secret/get.go b/drone/plugins/secret/get.go index 7d006479..f6c0bd6d 100644 --- a/drone/plugins/secret/get.go +++ b/drone/plugins/secret/get.go @@ -2,7 +2,6 @@ package secret import ( "context" - "github.com/drone/drone-cli/drone/internal" "github.com/drone/drone-go/drone" "github.com/drone/drone-go/plugin/secret" @@ -56,7 +55,7 @@ var secretFindCmd = cli.Command{ cli.StringFlag{ Name: "secret", Usage: "plugin secret", - EnvVar: "DRONE_SECRET_SECRET", + EnvVar: "DRONE_SECRET_SECRET, DRONE_SECRET_PLUGIN_TOKEN", }, cli.StringFlag{ Name: "ssl-skip-verify", diff --git a/drone/repo/repo_info.go b/drone/repo/repo_info.go index b78eded7..db1a42ce 100644 --- a/drone/repo/repo_info.go +++ b/drone/repo/repo_info.go @@ -56,4 +56,7 @@ Private: {{ .Private }} Trusted: {{ .Trusted }} Protected: {{ .Protected }} Remote: {{ .HTTPURL }} +CancelRunning: {{ .CancelRunning }} +CancelPulls: {{ .CancelPulls }} +CancelPush: {{ .CancelPush }} ` diff --git a/drone/repo/repo_update.go b/drone/repo/repo_update.go index 5374f092..4ff1fd36 100644 --- a/drone/repo/repo_update.go +++ b/drone/repo/repo_update.go @@ -52,6 +52,10 @@ var repoUpdateCmd = cli.Command{ Name: "auto-cancel-pushes", Usage: "automatically cancel pending push builds", }, + cli.BoolFlag{ + Name: "auto-cancel-running", + Usage: "automatically cancel running builds if newer commit pushed", + }, cli.StringFlag{ Name: "config", Usage: "repository configuration path (e.g. .drone.yml)", @@ -80,18 +84,19 @@ func repoUpdate(c *cli.Context) error { } var ( - visibility = c.String("visibility") - config = c.String("config") - timeout = c.Duration("timeout") - trusted = c.Bool("trusted") - throttle = c.Int64("throttle") - protected = c.Bool("protected") - ignoreForks = c.Bool("ignore-forks") - ignorePulls = c.Bool("ignore-pull-requests") - cancelPulls = c.Bool("auto-cancel-pull-requests") - cancelPush = c.Bool("auto-cancel-pushes") - buildCounter = c.Int64("build-counter") - unsafe = c.Bool("unsafe") + visibility = c.String("visibility") + config = c.String("config") + timeout = c.Duration("timeout") + trusted = c.Bool("trusted") + throttle = c.Int64("throttle") + protected = c.Bool("protected") + ignoreForks = c.Bool("ignore-forks") + ignorePulls = c.Bool("ignore-pull-requests") + cancelPulls = c.Bool("auto-cancel-pull-requests") + cancelPush = c.Bool("auto-cancel-pushes") + cancelRunning = c.Bool("auto-cancel-running") + buildCounter = c.Int64("build-counter") + unsafe = c.Bool("unsafe") ) patch := new(drone.RepoPatch) @@ -123,6 +128,9 @@ func repoUpdate(c *cli.Context) error { if c.IsSet("auto-cancel-pushes") { patch.CancelPush = &cancelPush } + if c.IsSet("auto-cancel-running") { + patch.CancelRunning = &cancelRunning + } if c.IsSet("visibility") { switch visibility { case "public", "private", "internal": diff --git a/drone/sign/sign.go b/drone/sign/sign.go index 7c9728c6..b4991f62 100644 --- a/drone/sign/sign.go +++ b/drone/sign/sign.go @@ -1,11 +1,15 @@ package sign import ( + "bufio" + "bytes" "fmt" + "io" "io/ioutil" + "strings" + "github.com/buildkite/yaml" "github.com/drone/drone-cli/drone/internal" - "github.com/drone/drone-yaml/yaml/signer" "github.com/urfave/cli" ) @@ -55,9 +59,131 @@ func format(c *cli.Context) error { return nil } - data, err = signer.WriteTo(data, hmac) + data, err = writeTo(data, hmac) if err != nil { return err } return ioutil.WriteFile(path, data, 0644) } + +// Resource enums. +const ( + KindCron = "cron" + KindPipeline = "pipeline" + KindRegistry = "registry" + KindSecret = "secret" + KindSignature = "signature" +) + +type ( + // Manifest is a collection of Drone resources. + Manifest struct { + Resources []Resource + } + + // Resource represents a Drone resource. + Resource interface { + // GetVersion returns the resource version. + GetVersion() string + + // GetKind returns the resource kind. + GetKind() string + } + + // RawResource is a raw encoded resource with the + // resource kind and type extracted. + RawResource struct { + Version string + Kind string + Type string + Data []byte `yaml:"-"` + } + + resource struct { + Version string + Kind string `json:"kind"` + Type string `json:"type"` + } +) + +func writeTo(data []byte, hmac string) ([]byte, error) { + res, err := parseRawBytes(data) + return upsert(res, hmac), err +} + +func parseRawBytes(b []byte) ([]*RawResource, error) { + return parseRaw( + bytes.NewReader(b), + ) +} + +func parseRaw(r io.Reader) ([]*RawResource, error) { + const newline = '\n' + var resources []*RawResource + var resource *RawResource + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := scanner.Text() + if isSeparator(line) { + resource = nil + } + if resource == nil { + resource = &RawResource{} + resources = append(resources, resource) + } + if isSeparator(line) { + continue + } + if isTerminator(line) { + break + } + if scanner.Err() == io.EOF { + break + } + resource.Data = append( + resource.Data, + line..., + ) + resource.Data = append( + resource.Data, + newline, + ) + } + for _, resource := range resources { + err := yaml.Unmarshal(resource.Data, resource) + if err != nil { + return nil, err + } + } + return resources, nil +} + +func upsert(res []*RawResource, hmac string) []byte { + var buf bytes.Buffer + for _, r := range res { + if r.Kind != KindSignature { + buf.WriteString("---") + buf.WriteByte('\n') + buf.Write(r.Data) + } + } + buf.WriteString("---") + buf.WriteByte('\n') + buf.WriteString("kind: signature") + buf.WriteByte('\n') + buf.WriteString("hmac: " + hmac) + buf.WriteByte('\n') + buf.WriteByte('\n') + buf.WriteString("...") + buf.WriteByte('\n') + return buf.Bytes() +} + +func isSeparator(s string) bool { + return strings.HasPrefix(s, "---") +} + +func isTerminator(s string) bool { + return strings.HasPrefix(s, "...") +} diff --git a/drone/starlark/starlark.go b/drone/starlark/starlark.go index aff0c798..63ff2b01 100644 --- a/drone/starlark/starlark.go +++ b/drone/starlark/starlark.go @@ -9,9 +9,7 @@ import ( "log" "os" - "github.com/drone/drone-yaml/yaml" - "github.com/drone/drone-yaml/yaml/pretty" - + "github.com/ghodss/yaml" "github.com/urfave/cli" "go.starlark.net/starlark" "go.starlark.net/starlarkstruct" @@ -41,7 +39,7 @@ var Command = cli.Command{ Usage: "target file", Value: ".drone.yml", }, - cli.BoolTFlag{ + cli.BoolFlag{ Name: "format", Usage: "Write output as formatted YAML", }, @@ -111,6 +109,18 @@ var Command = cli.Command{ Name: "build.title", Usage: "build title", }, + cli.StringFlag{ + Name: "build.link", + Usage: "build link", + }, + cli.StringFlag{ + Name: "build.environment", + Usage: "build environment", + }, + cli.BoolTFlag{ + Name: "build.debug", + Usage: "debug build", + }, }, } @@ -159,6 +169,9 @@ func generate(c *cli.Context) error { "commit": starlark.String(c.String("build.commit")), "message": starlark.String(c.String("build.message")), "title": starlark.String(c.String("build.title")), + "link": starlark.String(c.String("build.link")), + "environment": starlark.String(c.String("build.environment")), + "debug": starlark.Bool(c.Bool("build.debug")), } args := starlark.Tuple([]starlark.Value{ @@ -180,13 +193,24 @@ func generate(c *cli.Context) error { switch v := mainVal.(type) { case *starlark.List: for i := 0; i < v.Len(); i++ { + tmpBuf := new(bytes.Buffer) item := v.Index(i) - buf.WriteString("---\n") - err = writeJSON(buf, item) + tmpBuf.WriteString("---\n") + err = writeJSON(tmpBuf, item) if err != nil { return err } - buf.WriteString("\n") + tmpBuf.WriteString("\n") + if c.Bool("format") { + yml, yErr := yaml.JSONToYAML(tmpBuf.Bytes()) + if yErr != nil { + return fmt.Errorf("failed to convert to YAML: %v", yErr) + } + tmpBuf.Reset() + tmpBuf.WriteString("---\n") + tmpBuf.Write(yml) + } + buf.Write(tmpBuf.Bytes()) } case *starlark.Dict: buf.WriteString("---\n") @@ -194,30 +218,18 @@ func generate(c *cli.Context) error { if err != nil { return err } + if c.BoolT("format") { + yml, yErr := yaml.JSONToYAML(buf.Bytes()) + if yErr != nil { + return fmt.Errorf("failed to convert to YAML: %v", yErr) + } + buf.Reset() + buf.Write(yml) + } default: return fmt.Errorf("invalid return type (got a %s)", mainVal.Type()) } - - // if the user disables pretty printing, the yaml is printed - // to the console or written to the file in json format. - if c.BoolT("format") == false { - if c.Bool("stdout") { - io.Copy(os.Stdout, buf) - return nil - } - return ioutil.WriteFile(target, buf.Bytes(), 0644) - } - - manifest, err := yaml.Parse(buf) - if err != nil { - return err - } - buf.Reset() - pretty.Print(buf, manifest) - - // the user can optionally write the yaml to stdout. This - // is useful for debugging purposes without mutating an - // existing file. + // the user can optionally write the to stdout. This is useful for debugging purposes without mutating an existing file. if c.Bool("stdout") { io.Copy(os.Stdout, buf) return nil diff --git a/drone/template/template_add.go b/drone/template/template_add.go index 8231a1e5..f4f20b5c 100644 --- a/drone/template/template_add.go +++ b/drone/template/template_add.go @@ -7,6 +7,7 @@ import ( "github.com/drone/drone-cli/drone/internal" "github.com/drone/drone-go/drone" + "github.com/urfave/cli" ) @@ -36,16 +37,18 @@ func templateCreate(c *cli.Context) error { if err != nil { return err } + + namespace := c.String("namespace") + if namespace == "" { + return errors.New("missing namespace") + } + template := &drone.Template{ - Namespace: c.String("namespace"), - Name: c.String("name"), + Name: c.String("name"), } if template.Name == "" { - return errors.New("Missing template name") - } - if template.Namespace == "" { - return errors.New("Missing namespace") + return errors.New("missing template name") } if strings.HasPrefix(c.String("data"), "@") { @@ -56,6 +59,6 @@ func templateCreate(c *cli.Context) error { } template.Data = string(out) } - _, err = client.TemplateCreate(template) + _, err = client.TemplateCreate(namespace, template) return err } diff --git a/drone/template/template_info.go b/drone/template/template_info.go index 8e1a26ee..909e033d 100644 --- a/drone/template/template_info.go +++ b/drone/template/template_info.go @@ -61,6 +61,6 @@ func templateInfo(c *cli.Context) error { return tmpl.Execute(os.Stdout, templates) } -var tmplTemplateInfoList = "\x1b[33m{{ .Name }} \x1b[0m" + "\x1b [33m{{ .Namespace }} \x1b[0m" + ` +var tmplTemplateInfoList = "\x1b[33m{{ .Name }} \x1b[0m" + ` Data: {{ .Data }} ` diff --git a/drone/template/template_set.go b/drone/template/template_set.go index 2109df01..f66c0b7d 100644 --- a/drone/template/template_set.go +++ b/drone/template/template_set.go @@ -1,11 +1,13 @@ package template import ( + "errors" "io/ioutil" "strings" "github.com/drone/drone-cli/drone/internal" "github.com/drone/drone-go/drone" + "github.com/urfave/cli" ) @@ -35,9 +37,14 @@ func templateUpdate(c *cli.Context) error { if err != nil { return err } + + namespace := c.String("namespace") + if namespace == "" { + return errors.New("missing namespace") + } + template := &drone.Template{ - Name: c.String("name"), - Namespace: c.String("namespace"), + Name: c.String("name"), } if strings.HasPrefix(c.String("data"), "@") { path := strings.TrimPrefix(c.String("data"), "@") @@ -47,6 +54,6 @@ func templateUpdate(c *cli.Context) error { } template.Data = string(out) } - _, err = client.TemplateUpdate(template.Namespace, template.Name, template) + _, err = client.TemplateUpdate(namespace, template.Name, template) return err } diff --git a/go.mod b/go.mod index 8c72fb04..702903fd 100644 --- a/go.mod +++ b/go.mod @@ -1,26 +1,75 @@ module github.com/drone/drone-cli -go 1.13 +go 1.18 replace github.com/docker/docker => github.com/docker/engine v17.12.0-ce-rc1.0.20200309214505-aa6a9891b09c+incompatible require ( - github.com/docker/go-units v0.3.3 - github.com/drone/drone-go v1.6.1-0.20210601150845-c0e5325523a6 - github.com/drone/drone-runtime v1.1.1-0.20200623162453-61e33e2cab5d - github.com/drone/drone-yaml v0.0.0-20190729072335-70fa398b3560 - github.com/drone/envsubst v1.0.1 - github.com/drone/funcmap v0.0.0-20190918184546-d4ef6e88376d + github.com/buildkite/yaml v2.1.0+incompatible + github.com/docker/go-units v0.4.0 + github.com/drone-runners/drone-runner-docker v1.8.2 + github.com/drone/drone-go v1.7.1 + github.com/drone/drone-runtime v1.1.0 + github.com/drone/drone-yaml v1.2.3 + github.com/drone/envsubst v1.0.3 + github.com/drone/funcmap v0.0.0-20211123105308-29742f68a7d1 + github.com/drone/runner-go v1.12.0 github.com/drone/signal v1.0.0 - github.com/fatih/color v1.9.0 - github.com/google/go-jsonnet v0.16.0 + github.com/fatih/color v1.13.0 + github.com/ghodss/yaml v1.0.0 + github.com/google/go-jsonnet v0.18.0 github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1 - github.com/joho/godotenv v1.3.0 - github.com/mattn/go-colorable v0.1.4 - github.com/mattn/go-isatty v0.0.11 - github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 - github.com/urfave/cli v1.20.0 - go.starlark.net v0.0.0-20201118183435-e55f603d8c79 - golang.org/x/net v0.0.0-20190603091049-60506f45cf65 - golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890 + github.com/joho/godotenv v1.4.0 + github.com/mattn/go-colorable v0.1.12 + github.com/mattn/go-isatty v0.0.14 + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 + github.com/sirupsen/logrus v1.9.0 + github.com/stretchr/testify v1.8.0 + github.com/urfave/cli v1.22.9 + go.starlark.net v0.0.0-20221020143700-22309ac47eac + golang.org/x/net v0.7.0 + golang.org/x/oauth2 v0.4.0 +) + +require ( + github.com/gorilla/mux v1.8.0 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect +) + +require ( + docker.io/go-docker v1.0.0 // indirect + github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e // indirect + github.com/Microsoft/go-winio v0.5.2 // indirect + github.com/bmatcuk/doublestar v1.1.1 // indirect + github.com/containerd/containerd v1.6.18 // indirect + github.com/coreos/go-semver v0.3.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9 // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/docker/docker v1.13.1 // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/natessilva/dag v0.0.0-20180124060714-7194b8dcc5c4 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/russross/blackfriday/v2 v2.0.1 // indirect + github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + github.com/vinzenz/yaml v0.0.0-20170920082545-91409cdd725d // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.5.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect + google.golang.org/grpc v1.53.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + sigs.k8s.io/yaml v1.2.0 // indirect ) diff --git a/go.sum b/go.sum index 81b6cf20..19531a02 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,15 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +docker.io/go-docker v1.0.0 h1:VdXS/aNYQxyA9wdLD5z8Q8Ro688/hG8HzKxYVEVbE6s= docker.io/go-docker v1.0.0/go.mod h1:7tiAn5a0LFmjbPDbyTPOaTTOuG1ZRNXdPA6RvKY+fpY= +github.com/99designs/basicauth-go v0.0.0-20160802081356-2a93ba0f464d/go.mod h1:3cARGAK9CfW3HoxCy1a0G4TKrdiKke8ftOMEOHyySYs= github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e h1:rl2Aq4ZODqTDkeSqQBy+fzpZPamacO1Srp8zq7jf2Sc= github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e/go.mod h1:Xa6lInWHNQnuWoF0YPSsx+INFA9qk7/7pTjwb3PInkY= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Microsoft/go-winio v0.4.11 h1:zoIOcVf0xPN1tnMVbTtEdI+P8OofVk3NObnwOQ6nK2Q= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= @@ -19,181 +22,297 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 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/containerd/containerd v1.3.4 h1:3o0smo5SKY7H6AJCmJhsnCjR2/V2T8VmiHt7seN2/kI= github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= +github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9 h1:74lLNRzvsdIlkTgfDSMuaPjBr4cf6k7pwQQANm/yLKU= +github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9/go.mod h1:GgB8SF9nRG+GqaDtLcwJZsQFhcogVCJ79j4EdT0c2V4= github.com/docker/distribution v0.0.0-20170726174610-edc3ab29cdff/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/engine v17.12.0-ce-rc1.0.20200309214505-aa6a9891b09c+incompatible h1:hx8H7MbcmXUXAmphQuA/XB7CfSzX4DRrNuHFvfK9aIQ= github.com/docker/engine v17.12.0-ce-rc1.0.20200309214505-aa6a9891b09c+incompatible/go.mod h1:3CPr2caMgTHxxIAZgEMd3uLYPDlRvPqCpyeRf6ncPcY= -github.com/docker/go-connections v0.3.0 h1:3lOnM9cSzgGwx8VfK/NGOW5fLQ0GjIlCkaktF+n1M6o= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/drone/drone-go v1.5.0 h1:4rM74O3Xd6SnkdRIidlwwhVAPs4dXvcdVCgGvkrqL1M= -github.com/drone/drone-go v1.5.0/go.mod h1:fxCf9jAnXDZV1yDr0ckTuWd1intvcQwfJmTRpTZ1mXg= -github.com/drone/drone-go v1.6.1-0.20210601150845-c0e5325523a6 h1:mLEgDgep0et7hQCm76xH3xkuMAQb92JYT+0HKQk/loM= -github.com/drone/drone-go v1.6.1-0.20210601150845-c0e5325523a6/go.mod h1:fxCf9jAnXDZV1yDr0ckTuWd1intvcQwfJmTRpTZ1mXg= -github.com/drone/drone-runtime v1.0.7-0.20190729070836-38f28a11afe8/go.mod h1:+osgwGADc/nyl40J0fdsf8Z09bgcBZXvXXnLOY48zYs= -github.com/drone/drone-runtime v1.1.1-0.20200623162453-61e33e2cab5d h1:P5HI/Y9hARTZ3F3EKs0kYijhjXZWQRQHYn1neTi0pWM= -github.com/drone/drone-runtime v1.1.1-0.20200623162453-61e33e2cab5d/go.mod h1:4/2QToW5+HGD0y1sTw7X35W1f7YINS14UfDY4isggT8= -github.com/drone/drone-yaml v0.0.0-20190729072335-70fa398b3560 h1:3QL4NnDpGtaXpgI9eNd6N2k5WK8W388CzD67ZTuuZQg= -github.com/drone/drone-yaml v0.0.0-20190729072335-70fa398b3560/go.mod h1:rCLISp/rqZ50s6G4nKsm971tRSzolxzqqXfgjDqPYoE= -github.com/drone/envsubst v1.0.1 h1:NOOStingM2sbBwsIUeQkKUz8ShwCUzmqMxWrpXItfPE= -github.com/drone/envsubst v1.0.1/go.mod h1:bkZbnc/2vh1M12Ecn7EYScpI4YGYU0etwLJICOWi8Z0= -github.com/drone/funcmap v0.0.0-20190918184546-d4ef6e88376d h1:/IO7UVVu191Jc0DajV4cDVoO+91cuppvgxg2MZl+AXI= -github.com/drone/funcmap v0.0.0-20190918184546-d4ef6e88376d/go.mod h1:Hph0/pT6ZxbujnE1Z6/08p5I0XXuOsppqF6NQlGOK0E= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/drone-runners/drone-runner-docker v1.8.2 h1:F7+39FSyzEUqLXYMvTdTGBhCS79ODDIhw3DQeF5GYT8= +github.com/drone-runners/drone-runner-docker v1.8.2/go.mod h1:JR3pZeVZKKpkbTajiq0YtAx9WutkODdVKZGNR83kEwE= +github.com/drone/drone-go v1.7.1 h1:ZX+3Rs8YHUSUQ5mkuMLmm1zr1ttiiE2YGNxF3AnyDKw= +github.com/drone/drone-go v1.7.1/go.mod h1:fxCf9jAnXDZV1yDr0ckTuWd1intvcQwfJmTRpTZ1mXg= +github.com/drone/drone-runtime v1.0.7-0.20190729202838-87c84080f4a1/go.mod h1:+osgwGADc/nyl40J0fdsf8Z09bgcBZXvXXnLOY48zYs= +github.com/drone/drone-runtime v1.1.0 h1:IsKbwiLY6+ViNBzX0F8PERJVZZcEJm9rgxEh3uZP5IE= +github.com/drone/drone-runtime v1.1.0/go.mod h1:+osgwGADc/nyl40J0fdsf8Z09bgcBZXvXXnLOY48zYs= +github.com/drone/drone-yaml v1.2.3 h1:SWzLmzr8ARhbtw1WsVDENa8WFY2Pi9l0FVMfafVUWz8= +github.com/drone/drone-yaml v1.2.3/go.mod h1:QsqliFK8nG04AHFN9tTn9XJomRBQHD4wcejWW1uz/10= +github.com/drone/envsubst v1.0.2/go.mod h1:bkZbnc/2vh1M12Ecn7EYScpI4YGYU0etwLJICOWi8Z0= +github.com/drone/envsubst v1.0.3 h1:PCIBwNDYjs50AsLZPYdfhSATKaRg/FJmDc2D6+C2x8g= +github.com/drone/envsubst v1.0.3/go.mod h1:N2jZmlMufstn1KEqvbHjw40h1KyTmnVzHcSc9bFiJ2g= +github.com/drone/funcmap v0.0.0-20211123105308-29742f68a7d1 h1:E8hjIYiEyI+1S2XZSLpMkqT9V8+YMljFNBWrFpuVM3A= +github.com/drone/funcmap v0.0.0-20211123105308-29742f68a7d1/go.mod h1:Hph0/pT6ZxbujnE1Z6/08p5I0XXuOsppqF6NQlGOK0E= +github.com/drone/runner-go v1.12.0 h1:zUjDj9ylsJ4n4Mvy4znddq/Z4EBzcUXzTltpzokKtgs= +github.com/drone/runner-go v1.12.0/go.mod h1:vu4pPPYDoeN6vdYQAY01GGGsAIW4aLganJNaa8Fx8zE= github.com/drone/signal v1.0.0 h1:NrnM2M/4yAuU/tXs6RP1a1ZfxnaHwYkd0kJurA1p6uI= github.com/drone/signal v1.0.0/go.mod h1:S8t92eFT0g4WUgEc/LxG+LCuiskpMNsG0ajAMGnyZpc= 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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gogo/protobuf v0.0.0-20170307180453-100ba4e88506 h1:zDlw+wgyXdfkRuvFCdEDUiPLmZp2cvf/dWHazY0a5VM= github.com/gogo/protobuf v0.0.0-20170307180453-100ba4e88506/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -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/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 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +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= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +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.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +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-jsonnet v0.16.0 h1:Nb4EEOp+rdeGGyB1rQ5eisgSAqrTnhf9ip+X6lzZbY0= -github.com/google/go-jsonnet v0.16.0/go.mod h1:sOcuej3UW1vpPTZOr8L7RQimqai1a57bt5j22LzGZCw= +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.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-jsonnet v0.18.0 h1:/6pTy6g+Jh1a1I2UMoAODkqELFiVIdOxbNwv0DDzoOg= +github.com/google/go-jsonnet v0.18.0/go.mod h1:C3fTzyVJDslXdiTqw/bTFk7vSGyCtH3MGRbDfvEwGd0= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1 h1:9Xm8CKtMZIXgcopfdWk/qZ1rt0HjMgfMR9nxxSeK6vk= github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1/go.mod h1:zuHl3Hh+e9P6gmBPvcqR1HjkaWHC/csgyskg6IaFKFo= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/natessilva/dag v0.0.0-20180124060714-7194b8dcc5c4 h1:dnMxwus89s86tI8rcGVp2HwZzlz7c5o92VOy7dSckBQ= github.com/natessilva/dag v0.0.0-20180124060714-7194b8dcc5c4/go.mod h1:cojhOHk1gbMeklOyDP2oKKLftefXoJreOQGOrXk+Z38= -github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/petar/GoLLRB v0.0.0-20130427215148-53be0d36a84c/go.mod h1:HUpKUBZnpzkdx0kD/+Yfuft+uD3zHGtXF/XJB14TUr4= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 h1:49lOXmGaUpV9Fz3gd7TFZY106KVlPVa5jcYD1gaQf98= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/urfave/cli v1.22.9 h1:cv3/KhXGBGjEXLC4bH0sLuJ9BewaAbpk5oyMOveu4pw= +github.com/urfave/cli v1.22.9/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vinzenz/yaml v0.0.0-20170920082545-91409cdd725d h1:3wDi6J5APMqaHBVPuVd7RmHD2gRTfqbdcVSpCNoUWtk= github.com/vinzenz/yaml v0.0.0-20170920082545-91409cdd725d/go.mod h1:mb5taDqMnJiZNRQ3+02W2IFG+oEz1+dTuCXkp4jpkfo= -go.starlark.net v0.0.0-20201118183435-e55f603d8c79 h1:JPjLPz44y2N9mkzh2N344kTk1Y4/V4yJAjTrXGmzv8I= -go.starlark.net v0.0.0-20201118183435-e55f603d8c79/go.mod h1:5YFcFnRptTN+41758c2bMPiqpGg4zBfYji1IQz8wNFk= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.starlark.net v0.0.0-20221020143700-22309ac47eac h1:gBO5Qfcw5V9404yzsu2FEIsxK/u2mBNTNogK0uIoVhk= +go.starlark.net v0.0.0-20221020143700-22309ac47eac/go.mod h1:kIVgS18CjmEC3PqMd5kaJSGEifyV/CeB9x506ZJ1Vbk= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +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/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890 h1:uESlIz09WIHT2I+pasSXcpLYqYK8wHcdCetU3VuMBJE= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= 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-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= 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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181005133103-4497e2df6f9e/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.3.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.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= -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-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +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.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +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.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -203,3 +322,5 @@ k8s.io/apimachinery v0.0.0-20181201231028-18a5ff3097b4/go.mod h1:ccL7Eh7zubPUSh9 k8s.io/client-go v9.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/klog v0.1.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=