├── .editorconfig ├── .github └── workflows │ ├── go.yml │ └── goreleaser.yml ├── .gitignore ├── .gitmodules ├── .golangci.yml ├── .goreleaser.yml ├── .travis.yml ├── LICENSE.md ├── Makefile ├── README.md ├── go.mod ├── go.sum ├── goreleaser.yml ├── main.go ├── makeshellfn.sh ├── scripts └── build-site.sh ├── shell_equinoxio.go ├── shell_godownloader.go ├── shell_raw.go ├── shellfn.go ├── source.go ├── tree └── github.com │ ├── ValeLint │ └── vale.yaml │ ├── akupila │ └── gitprompt.yaml │ ├── caarlos0 │ ├── bandep.yaml │ ├── clone-org.yaml │ ├── fork-cleaner.yaml │ ├── github-vacations.yaml │ ├── karmahub.yaml │ ├── name-generator.yaml │ ├── org-stats.yaml │ └── svu.yaml │ ├── client9 │ ├── csstool.yaml │ └── misspell.yaml │ ├── crazy-max │ └── travis-wait-enhanced.yml │ ├── docwhat │ ├── chronic.yaml │ └── go-importd.yaml │ ├── fat0troll │ └── yapusher.yaml │ ├── getantibody │ └── antibody.yaml │ ├── gohugoio │ └── hugo.yaml │ ├── golangci │ └── golangci-lint.yaml │ ├── gopinath-langote │ └── 1build.yaml │ ├── goreleaser │ ├── goreleaser.yaml │ └── nfpm.yaml │ ├── haya14busa │ └── xtag.yaml │ ├── ianwalter │ └── gotime.yaml │ ├── k8spin │ └── k8spin_cli.yaml │ ├── kira │ └── node-prune.yaml │ ├── markbates │ └── refresh.yml │ ├── mschneider82 │ └── sharecmd.yaml │ ├── mvdan │ └── sh.yaml │ ├── pantheon-systems │ └── autotag.yaml │ ├── reviewdog │ └── reviewdog.yaml │ ├── ryantking │ └── rudder.yml │ ├── serverless │ └── event-gateway.yaml │ ├── syntaqx │ ├── serve.yaml │ └── swarm-api.yaml │ ├── tdewolff │ └── minify.yaml │ ├── twpayne │ └── chezmoi.yaml │ └── wio │ └── wio.yaml ├── treewalk.go └── www ├── .gitignore ├── config.toml ├── content ├── add-your-project.md ├── introduction.md └── projects.md ├── data └── .gitignore ├── layouts └── page │ └── projects.html └── static └── favicon.ico /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_size = 4 7 | indent_style = tab 8 | end_of_line = lf 9 | trim_trailing_whitespace = true 10 | 11 | [*.yml] 12 | indent_size = 2 13 | indent_style = space -------------------------------------------------------------------------------- /.github/workflows/go.yml: -------------------------------------------------------------------------------- 1 | name: Go 2 | on: [push] 3 | jobs: 4 | build: 5 | name: Build 6 | runs-on: ubuntu-latest 7 | steps: 8 | 9 | - name: Set up Go 1.13 10 | uses: actions/setup-go@v1 11 | with: 12 | go-version: 1.13 13 | id: go 14 | 15 | - name: Check out code into the Go module directory 16 | uses: actions/checkout@v1 17 | 18 | - name: Get dependencies 19 | run: make setup 20 | 21 | - name: Build 22 | run: make ci 23 | -------------------------------------------------------------------------------- /.github/workflows/goreleaser.yml: -------------------------------------------------------------------------------- 1 | name: goreleaser 2 | 3 | on: 4 | create: 5 | tags: 6 | - v*.*.* 7 | 8 | jobs: 9 | goreleaser: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@master 14 | - name: Set up Go 1.13 15 | id: go 16 | uses: actions/setup-go@v1 17 | with: 18 | go-version: 1.13 19 | - name: Get dependencies 20 | run: make setup 21 | - name: Build 22 | run: make ci 23 | - name: Run GoReleaser 24 | uses: goreleaser/goreleaser-action@v1 25 | with: 26 | version: latest 27 | args: release --rm-dist 28 | env: 29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bin/ 2 | godownloader 3 | vendor/ 4 | shlib/ 5 | tmp/ 6 | dist/ 7 | treeout 8 | coverage.txt 9 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "www/themes/hugo-apex-theme"] 2 | path = www/themes/hugo-apex-theme 3 | url = https://github.com/caarlos0/hugo-apex-theme.git 4 | -------------------------------------------------------------------------------- /.golangci.yml: -------------------------------------------------------------------------------- 1 | linters: 2 | disable: 3 | - goerr113 4 | -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | # This is an example goreleaser.yaml file with some sane defaults. 2 | # Make sure to check the documentation at http://goreleaser.com 3 | before: 4 | hooks: 5 | # you may remove this if you don't use vgo 6 | - go mod tidy 7 | # you may remove this if you don't need go generate 8 | - go generate ./... 9 | builds: 10 | - env: 11 | - CGO_ENABLED=0 12 | goos: 13 | - linux 14 | - darwin 15 | goarch: 16 | - amd64 17 | archives: 18 | - replacements: 19 | darwin: Darwin 20 | linux: Linux 21 | windows: Windows 22 | 386: i386 23 | amd64: x86_64 24 | checksum: 25 | name_template: 'checksums.txt' 26 | snapshot: 27 | name_template: "{{ .Tag }}-next" 28 | changelog: 29 | sort: asc 30 | filters: 31 | exclude: 32 | - '^docs:' 33 | - '^test:' 34 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | dist: trusty 2 | language: go 3 | go: 1.13.x 4 | 5 | env: 6 | - GO111MODULE=on 7 | 8 | install: make setup 9 | 10 | addons: 11 | apt: 12 | sources: 13 | - debian-sid 14 | 15 | script: make ci 16 | 17 | notifications: 18 | email: false 19 | 20 | deploy: 21 | provider: pages 22 | skip_cleanup: true 23 | github_token: $GITHUB_TOKEN 24 | local_dir: www/public 25 | target_branch: master 26 | repo: goreleaser/goinstall 27 | verbose: true 28 | fqdn: install.goreleaser.com 29 | on: 30 | branch: master 31 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Nick Galbreath 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | SOURCE_FILES?=./... 2 | TEST_PATTERN?=. 3 | TEST_OPTIONS?= 4 | OS=$(shell uname -s) 5 | 6 | export PATH := ./bin:$(PATH) 7 | export GO111MODULE := on 8 | # enable consistent Go 1.12/1.13 GOPROXY behavior. 9 | export GOPROXY = https://proxy.golang.org 10 | 11 | 12 | setup: ## Install all the build and lint dependencies 13 | mkdir -p bin 14 | curl -sfL https://install.goreleaser.com/github.com/goreleaser/goreleaser.sh | sh 15 | curl -sfL https://install.goreleaser.com/github.com/gohugoio/hugo.sh | sh 16 | curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh 17 | ifeq ($(OS), Darwin) 18 | curl -sfL -o ./bin/shellcheck https://github.com/caarlos0/shellcheck-docker/releases/download/v0.4.6/shellcheck_darwin 19 | else 20 | curl -sfL -o ./bin/shellcheck https://github.com/caarlos0/shellcheck-docker/releases/download/v0.4.6/shellcheck 21 | endif 22 | chmod +x ./bin/shellcheck 23 | go mod download 24 | .PHONY: setup 25 | 26 | install: build ## build and install 27 | go install . 28 | 29 | test: ## Run all the tests 30 | go test $(TEST_OPTIONS) -failfast -race -coverpkg=./... -covermode=atomic -coverprofile=coverage.txt $(SOURCE_FILES) -run $(TEST_PATTERN) -timeout=2m 31 | 32 | cover: test ## Run all the tests and opens the coverage report 33 | go tool cover -html=coverage.txt 34 | 35 | fmt: ## gofmt and goimports all go files 36 | find . -name '*.go' -not -wholename './vendor/*' | while read -r file; do gofmt -w -s "$$file"; goimports -w "$$file"; done 37 | 38 | lint: ## Run all the linters 39 | ./bin/golangci-lint run --enable-all --disable wsl ./... 40 | 41 | precommit: lint ## Run precommit hook 42 | 43 | ci: build lint test ## travis-ci entrypoint 44 | git diff . 45 | ./bin/goreleaser --snapshot --rm-dist 46 | 47 | build: hooks ## Build a beta version of goreleaser 48 | go build 49 | ./scripts/build-site.sh 50 | 51 | .DEFAULT_GOAL := build 52 | 53 | generate: ## regenerate shell code from client9/shlib 54 | ./makeshellfn.sh > shellfn.go 55 | 56 | .PHONY: ci help generate clean 57 | 58 | clean: ## clean up everything 59 | go clean ./... 60 | rm -f godownloader 61 | rm -rf ./bin ./dist ./vendor 62 | git gc --aggressive 63 | 64 | hooks: 65 | echo "make lint" > .git/hooks/pre-commit 66 | chmod +x .git/hooks/pre-commit 67 | 68 | # Absolutely awesome: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html 69 | help: 70 | @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' 71 | 72 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Warning: this is no longer actively maintained. 2 | 3 | See [#161](https://github.com/goreleaser/godownloader/issues/161) for details. 4 | 5 | -------- 6 | 7 |

8 | GoReleaser Logo 9 |

GoDownloader

10 |

Download Go binaries as fast and easily as possible.

11 |

12 | Software License 13 | Travis 14 | Go Report Card 15 | Go Doc 16 | Powered By: GoReleaser 17 |

18 |

19 | 20 | --- 21 | 22 | This is the inverse of [goreleaser](https://github.com/goreleaser/goreleaser). The goreleaser YAML file is read and creates a custom shell script that can download the right package and the right version for the existing machine. 23 | 24 | If you use goreleaser already, this will create scripts suitable for "curl bash" style downloads. 25 | 26 | * Run godownloader on your `goreleaser.yaml` file 27 | * Add the `godownloader.sh` file to your repo 28 | * Tell your users to use https://raw.githubusercontent.com/YOU/YOURAPP/master/godownloader.sh to install 29 | 30 | This is also useful in CI/CD systems such as [travis-ci.org](https://travis-ci.org). 31 | 32 | * Much faster then 'go get' (sometimes up to 100x) 33 | * Make sure your local environment (macOS) and the CI environment (Linux) are using the exact same versions of your go binaries. 34 | 35 | ## CI/CD Example 36 | 37 | Let's say you are using [hugo](https://gohugo.io), the static website generator, with [travis-ci](https://travis-ci.org). 38 | 39 | Your old `.travis.yml` file might have 40 | 41 | ```yaml 42 | install: 43 | - go get github.com/gohugoio/hugo 44 | ``` 45 | 46 | This can take up to 30 seconds! 47 | 48 | Hugo doesn't have (yet) a `godownloader.sh` file. So we will make our own: 49 | 50 | ``` 51 | # create a godownloader script 52 | godownloader --repo=gohugoio/hugo > ./godownloader-hugo.sh 53 | ``` 54 | 55 | and add `godownloader-hugo.sh` to your GitHub repo. Edit your `.travis.yml` as such 56 | 57 | ```yaml 58 | install: 59 | - ./godownloader-hugo.sh v0.37.1 60 | ``` 61 | 62 | Without a version number, GitHub is queried to get the latest version number. 63 | 64 | ```yaml 65 | install: 66 | - ./godownloader-hugo.sh 67 | ``` 68 | 69 | Typical download time is 0.3 seconds, or 100x improvement. 70 | 71 | Your new `hugo` binary is in `./bin`, so change your Makefie or scripts to use `./bin/hugo`. 72 | 73 | The default installation directory can be changed with the `-b` flag or the `BINDIR` environment variable. 74 | 75 | ## Notes on Functionality 76 | 77 | * Only GitHub Releases are supported right now. 78 | * Checksums are checked. 79 | * Binares are installed using `tar.gz` or `zip`. 80 | * No OS-specific installs such as homebrew, deb, rpm. Everything is installed locally via a `tar.gz` or `zip`. Typically OS installs are done differently anyways (e.g. brew, apt-get, yum, etc). 81 | 82 | ## Experimental support 83 | 84 | Some people do not use Goreleaser (why!), so there is experimental support for the following alterative distributions. 85 | 86 | ### "naked" releases on GitHub 87 | 88 | A naked release is just the raw binary put on GitHub releases. Limited support can be done by 89 | 90 | ```bash 91 | ./goreleaser -source raw -repo [owner/repo] -exe [name] -nametpl [tpl] 92 | ``` 93 | 94 | Where `exe` is the final binary name, and `tpl` is the same type of name template that Goreleaser uses. 95 | 96 | An example repo is at [mvdan/sh](https://github.com/mvdan/sh/releases). Note how the repo `sh` is different than the binary `shfmt`. 97 | 98 | ### Equinox.io 99 | 100 | [Equinox.io](https://equinox.io) is a really interesting platform. Take a look. 101 | 102 | There is no API, so godownloader screen scrapes to figure out the latest release. Likewise, checksums are not verified. 103 | 104 | ```bash 105 | ./goreleaser -source equinoxio -repo [owner/repo] 106 | ``` 107 | 108 | While Equinox.io supports the concept of different release channels, only the `stable` channel is supported by godownloader. 109 | 110 | ## Yes, it's true. 111 | 112 | It's a go program that reads a YAML file that uses a template to make a posix shell script. 113 | 114 | ## Other Resources and Inspiration 115 | 116 | Other applications have written custom shell downloaders and installers: 117 | 118 | ### golang/dep 119 | 120 | The [golang/dep](https://github.com/golang/dep) package manager has a nice downloader, [install.sh](https://github.com/golang/dep/blob/master/install.sh). Their trick to extract a version number from GitHub Releases is excellent: 121 | 122 | ```sh 123 | $(echo "${LATEST_RELEASE}" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//' ) 124 | ``` 125 | 126 | This is probably based on [masterminds/glide](https://github.com/Masterminds/glide) and its installer at https://glide.sh/get 127 | 128 | ### kubernetes/helm 129 | 130 | [kubernetes/helm](https://github.com/kubernetes/helm) is a "tool for managing Kubernetes charts. Charts are packages of pre-configured Kubernetes resources." 131 | 132 | It has a [get script](https://github.com/kubernetes/helm/blob/master/scripts/get). Of note is that it won't re-install if the desired version is already present. 133 | 134 | ### chef 135 | 136 | [Chef](https://www.chef.io) has the one of the most complete installers at https://omnitruck.chef.io/install.sh. In particular it has support for 137 | 138 | * Support for solaris and aix, and some other less common platforms 139 | * python or perl as installers if curl or wget isn't present 140 | * http proxy support 141 | 142 | ### Caddy 143 | 144 | [Caddy](https://caddyserver.com) is "the HTTP/2 web server with automatic HTTPS" and a NGINX replacement. It has a clever installer at https://getcaddy.com. Of note is GPG signature verification. 145 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/goreleaser/godownloader 2 | 3 | go 1.13 4 | 5 | require ( 6 | github.com/apex/log v1.1.1 7 | github.com/client9/codegen v0.0.0-20180316044450-92480ce66a06 8 | github.com/goreleaser/goreleaser v0.123.1 9 | github.com/pkg/errors v0.8.1 10 | gopkg.in/alecthomas/kingpin.v2 v2.2.6 11 | gopkg.in/yaml.v2 v2.2.7 12 | ) 13 | 14 | // TODO: remove this when https://github.com/google/rpmpack/pull/33 gets merged in. 15 | replace github.com/google/rpmpack => github.com/caarlos0/rpmpack v0.0.0-20191106130752-24a815bfaee0 16 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 4 | cloud.google.com/go v0.39.0 h1:UgQP9na6OTfp4dsAiz/eFpFA1C6tPdH5wiRdi19tuMw= 5 | cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= 6 | code.gitea.io/sdk/gitea v0.0.0-20191013013401-e41e9ea72caa h1:KgpwNF1StxPXMfCD9M++jvCUPUqHPAbuvQn1q3sWtqw= 7 | code.gitea.io/sdk/gitea v0.0.0-20191013013401-e41e9ea72caa/go.mod h1:8IxkM1gyiwEjfO0m47bcmr3u3foR15+LoVub43hCHd0= 8 | contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= 9 | contrib.go.opencensus.io/exporter/ocagent v0.5.0 h1:TKXjQSRS0/cCDrP7KvkgU6SmILtF/yV2TOs/02K/WZQ= 10 | contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= 11 | contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= 12 | contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= 13 | contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= 14 | github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= 15 | github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= 16 | github.com/Azure/azure-pipeline-go v0.1.9 h1:u7JFb9fFTE6Y/j8ae2VK33ePrRqJqoCM/IWkQdAZ+rg= 17 | github.com/Azure/azure-pipeline-go v0.1.9/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= 18 | github.com/Azure/azure-pipeline-go v0.2.1 h1:OLBdZJ3yvOn2MezlWvbrBMTEUQC72zAftRZOMdj5HYo= 19 | github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= 20 | github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= 21 | github.com/Azure/azure-sdk-for-go v30.1.0+incompatible h1:HyYPft8wXpxMd0kfLtXo6etWcO+XuPbLkcgx9g2cqxU= 22 | github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= 23 | github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= 24 | github.com/Azure/azure-storage-blob-go v0.6.0 h1:SEATKb3LIHcaSIX+E6/K4kJpwfuozFEsmt5rS56N6CE= 25 | github.com/Azure/azure-storage-blob-go v0.6.0/go.mod h1:oGfmITT1V6x//CswqY2gtAHND+xIP64/qL7a5QJix0Y= 26 | github.com/Azure/azure-storage-blob-go v0.8.0 h1:53qhf0Oxa0nOjgbDeeYPUeyiNmafAFEY95rZLK0Tj6o= 27 | github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= 28 | github.com/Azure/go-autorest v12.0.0+incompatible h1:N+VqClcomLGD/sHb3smbSYYtNMgKpVV3Cd5r5i8z6bQ= 29 | github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= 30 | github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 31 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 32 | github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190605020000-c4ba1fdf4d36/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= 33 | github.com/Masterminds/semver/v3 v3.0.1 h1:2kKm5lb7dKVrt5TYUiAavE6oFc1cFT0057UVGT+JqLk= 34 | github.com/Masterminds/semver/v3 v3.0.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= 35 | github.com/Masterminds/semver/v3 v3.0.2 h1:tRi7ENs+AaOUCH+j6qwNQgPYfV26dX3JNonq+V4mhqc= 36 | github.com/Masterminds/semver/v3 v3.0.2/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= 37 | github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= 38 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= 39 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 40 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= 41 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 42 | github.com/apex/log v1.1.1 h1:BwhRZ0qbjYtTob0I+2M+smavV0kOC8XgcnGZcyL9liA= 43 | github.com/apex/log v1.1.1/go.mod h1:Ls949n1HFtXfbDcjiTTFQqkVUrte0puoIBfO3SVgwOA= 44 | github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= 45 | github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= 46 | github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= 47 | github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= 48 | github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= 49 | github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= 50 | github.com/aws/aws-sdk-go v1.25.11 h1:wUivbsVOH3LpHdC3Rl5i+FLHfg4sOmYgv4bvHe7+/Pg= 51 | github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= 52 | github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= 53 | github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4pJSv7WO+VECIWUQ7OJYSoTrMh4= 54 | github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= 55 | github.com/caarlos0/ctrlc v1.0.0 h1:2DtF8GSIcajgffDFJzyG15vO+1PuBWOMUdFut7NnXhw= 56 | github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= 57 | github.com/caarlos0/rpmpack v0.0.0-20191106130752-24a815bfaee0 h1:fu2MaDpxqcwVkF/5Y4DzzYAUmiJXVy1cDn1uDkQ+Cgs= 58 | github.com/caarlos0/rpmpack v0.0.0-20191106130752-24a815bfaee0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= 59 | github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e h1:V9a67dfYqPLAvzk5hMQOXYJlZ4SLIXgyKIE+ZiHzgGQ= 60 | github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= 61 | github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e h1:hHg27A0RSSp2Om9lubZpiMgVbvn39bsUmW9U5h0twqc= 62 | github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= 63 | github.com/census-instrumentation/opencensus-proto v0.2.0 h1:LzQXZOgg4CQfE6bFvXGM30YZL1WW/M337pXml+GrcZ4= 64 | github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 65 | github.com/client9/codegen v0.0.0-20180316044450-92480ce66a06 h1:x/TfIAFPmw3HSSSdKZ+5vLkFc6wb/poWaCjvx7EfyBM= 66 | github.com/client9/codegen v0.0.0-20180316044450-92480ce66a06/go.mod h1:0dAq5Nmtdj83U88SlJDUdNCgsCbTWKDHlybtYzEenI0= 67 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 68 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 69 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 70 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 71 | github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= 72 | github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= 73 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 74 | github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= 75 | github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= 76 | github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= 77 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 78 | github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= 79 | github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= 80 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 81 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 82 | github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= 83 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 84 | github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 85 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= 86 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 87 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 88 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 89 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 90 | github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= 91 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 92 | github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= 93 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 94 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 95 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 96 | github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= 97 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 98 | github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= 99 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 100 | github.com/google/go-github/v28 v28.1.1 h1:kORf5ekX5qwXO2mGzXXOjMe/g6ap8ahVe0sBEulhSxo= 101 | github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= 102 | github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= 103 | github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= 104 | github.com/google/go-replayers/grpcreplay v0.1.0 h1:eNb1y9rZFmY4ax45uEEECSa8fsxGRU+8Bil52ASAwic= 105 | github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= 106 | github.com/google/go-replayers/httpreplay v0.1.0 h1:AX7FUb4BjrrzNvblr/OlgwrmFiep6soj5K2QSDW7BGk= 107 | github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= 108 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 109 | github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible h1:xmapqc1AyLoB+ddYT6r04bD9lIjlOqGaREovi0SzFaE= 110 | github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 111 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 112 | github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= 113 | github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= 114 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 115 | github.com/google/wire v0.3.0 h1:imGQZGEVEHpje5056+K+cgdO72p0LQv2xIIFXNGUf60= 116 | github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= 117 | github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= 118 | github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= 119 | github.com/googleapis/gax-go/v2 v2.0.4 h1:hU4mGcQI4DaAYW+IbTun+2qEZVFxK0ySjQLTbS0VQKc= 120 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 121 | github.com/goreleaser/goreleaser v0.122.0 h1:83xV9cUrXErdvIVnIAXYZkmZFdY139RvihqxrwswxrY= 122 | github.com/goreleaser/goreleaser v0.122.0/go.mod h1:Acn33/psgsNrPClBfaYjaqmtfK4ilOIWQWYEls6nOPs= 123 | github.com/goreleaser/goreleaser v0.123.1 h1:dF9hrTc0TTh/p9FZI0my4QpjzljQlBEJAaGTE/tZTII= 124 | github.com/goreleaser/goreleaser v0.123.1/go.mod h1:E2iyhIqrWVzc6Ebi1rdLv11qE8Nb0a7PjiZoek0vKZY= 125 | github.com/goreleaser/nfpm v1.1.5 h1:bjVIflQl0b3lNQvO/b++cKMKXW+INL70AdGR+zDXWps= 126 | github.com/goreleaser/nfpm v1.1.5/go.mod h1:4V1IQlCSizz8KHXBb0C82xIh/NNJdLo332q1T4r909U= 127 | github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 128 | github.com/grpc-ecosystem/grpc-gateway v1.9.2 h1:S+ef0492XaIknb8LMjcwgW2i3cNTzDYMmDrOThOJNWc= 129 | github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 130 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 131 | github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= 132 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 133 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 134 | github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= 135 | github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= 136 | github.com/jarcoal/httpmock v1.0.4 h1:jp+dy/+nonJE4g4xbVtl9QdrUNbn6/3hDT5R4nDIZnA= 137 | github.com/jarcoal/httpmock v1.0.4/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= 138 | github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= 139 | github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= 140 | github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= 141 | github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= 142 | github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= 143 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc= 144 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 145 | github.com/kamilsk/retry/v4 v4.3.1 h1:hNQmK1xAgybAVsadNAGvCNutFLS2h+Ycpw317u4d+i0= 146 | github.com/kamilsk/retry/v4 v4.3.1/go.mod h1:VaCDWufu3zVv7Ktt+Z7Dcslli2te4QEZoqt4QR7xgQg= 147 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 148 | github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= 149 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 150 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 151 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 152 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 153 | github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= 154 | github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= 155 | github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= 156 | github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 157 | github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149 h1:HfxbT6/JcvIljmERptWhwa8XzP7H3T+Z2N26gTsaDaA= 158 | github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= 159 | github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 160 | github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= 161 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 162 | github.com/mattn/go-zglob v0.0.1 h1:xsEx/XUoVlI6yXjqBK062zYhRTZltCNmYPx6v+8DNaY= 163 | github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= 164 | github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= 165 | github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= 166 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 167 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 168 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 169 | github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 170 | github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= 171 | github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= 172 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 173 | github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= 174 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 175 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 176 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 177 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 178 | github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= 179 | github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b h1:+gCnWOZV8Z/8jehJ2CdqB47Z3S+SREmQcuXkRFLNsiI= 180 | github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= 181 | github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= 182 | github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= 183 | github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= 184 | github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= 185 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 186 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= 187 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 188 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 189 | github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= 190 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 191 | github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= 192 | github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= 193 | github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= 194 | github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= 195 | github.com/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8= 196 | github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= 197 | github.com/xanzy/go-gitlab v0.21.0 h1:Ru55sR4TBoDNsAKwCOpzeaGtbiWj7xTksVmzBJbLu6c= 198 | github.com/xanzy/go-gitlab v0.21.0/go.mod h1:t4Bmvnxj7k37S4Y17lfLx+nLqkf/oQwT2HagfWKv5Og= 199 | github.com/xanzy/go-gitlab v0.22.1 h1:TVxgHmoa35jQL+9FCkG0nwPDxU9dQZXknBTDtGaSFno= 200 | github.com/xanzy/go-gitlab v0.22.1/go.mod h1:t4Bmvnxj7k37S4Y17lfLx+nLqkf/oQwT2HagfWKv5Og= 201 | github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= 202 | github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= 203 | go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= 204 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 205 | go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= 206 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 207 | gocloud.dev v0.17.0 h1:UuDiCphYsiNhRNLtgHVL/eZheQeCt00hL3XjDfbt820= 208 | gocloud.dev v0.17.0/go.mod h1:tIHTRdR1V5dlD8sTkzYdTGizBJ314BDykJ8KmadEXwo= 209 | gocloud.dev v0.18.0 h1:HX6uFZYZs9tUP87jzoWgB8dl4ihsRpiAsBDKTthiApY= 210 | gocloud.dev v0.18.0/go.mod h1:lhLOb91+9tKB8RnNlsx+weJGEd0AHM94huK1bmrhPwM= 211 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 212 | golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 213 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 214 | golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4= 215 | golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 216 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 217 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 218 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 219 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 220 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 221 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 222 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 223 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 224 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 225 | golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 226 | golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 227 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 228 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 229 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 230 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 231 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 232 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 233 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 234 | golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 235 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= 236 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 237 | golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 h1:N66aaryRB3Ax92gH0v3hp1QYZ3zWWCCUR/j8Ifh45Ss= 238 | golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 239 | golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914 h1:MlY3mEfbnWGmUi4rtHOtNnnnN4UJRGSyLPx+DXA5Sq4= 240 | golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 241 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 242 | golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 243 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 244 | golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 245 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= 246 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 247 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 248 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 249 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 250 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 251 | golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= 252 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 253 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= 254 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 255 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 256 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 257 | golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 258 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 259 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 260 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 261 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 262 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 263 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 264 | golang.org/x/sys v0.0.0-20190620070143-6f217b454f45 h1:Dl2hc890lrizvUppGbRWhnIh2f8jOTCQpY5IKWRS0oM= 265 | golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 266 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 267 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 268 | golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= 269 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 270 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 271 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 272 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 273 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 274 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 275 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 276 | golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 277 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 278 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 279 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= 280 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 281 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 282 | google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 283 | google.golang.org/api v0.6.0 h1:2tJEkRfnZL5g1GeBUlITh/rqT5HG3sFcoVCUUxmgJ2g= 284 | google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= 285 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 286 | google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 287 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 288 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 289 | google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= 290 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 291 | google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= 292 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 293 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 294 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 295 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 296 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 297 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 298 | google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 299 | google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= 300 | google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601 h1:9VBRTdmgQxbs6HE0sUnMrSWNePppAJU07NYvX5dIB04= 301 | google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= 302 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 303 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 304 | google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 305 | google.golang.org/grpc v1.21.1 h1:j6XxA85m/6txkUCHvzlV5f+HBNl/1r5cZ2A/3IEFOO8= 306 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 307 | gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= 308 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 309 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 310 | gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 311 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= 312 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 313 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= 314 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 315 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 316 | gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 317 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 318 | gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 319 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 320 | gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= 321 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 322 | gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= 323 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 324 | gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= 325 | gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 326 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 327 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 328 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 329 | pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= 330 | -------------------------------------------------------------------------------- /goreleaser.yml: -------------------------------------------------------------------------------- 1 | build: 2 | goos: 3 | - linux 4 | - darwin 5 | - windows 6 | goarch: 7 | - 386 8 | - amd64 9 | - arm 10 | - arm64 11 | ignore: 12 | - goos: darwin 13 | goarch: 386 14 | archive: 15 | replacements: 16 | darwin: Darwin 17 | linux: Linux 18 | windows: Windows 19 | 386: i386 20 | amd64: x86_64 21 | format_overrides: 22 | - goos: windows 23 | format: zip 24 | brew: 25 | github: 26 | owner: godownloader 27 | name: homebrew-tap 28 | folder: Formula 29 | homepage: https://github.com/goreleaser/godownloader 30 | description: Download Go binaries as fast and easily as possible 31 | dependencies: 32 | - git 33 | nfpm: 34 | homepage: https://github.com/goreleaser/godownloader 35 | description: Download Go binaries as fast and easily as possible 36 | maintainer: Nick Galbreath 37 | vendor: GoDownloader 38 | formats: 39 | - deb 40 | dependencies: 41 | - git 42 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "fmt" 6 | "io/ioutil" 7 | "net/http" 8 | "os" 9 | "path" 10 | "strings" 11 | "text/template" 12 | "time" 13 | 14 | "github.com/apex/log" 15 | "github.com/apex/log/handlers/cli" 16 | "github.com/client9/codegen/shell" 17 | "github.com/goreleaser/goreleaser/pkg/config" 18 | "github.com/goreleaser/goreleaser/pkg/context" 19 | "github.com/goreleaser/goreleaser/pkg/defaults" 20 | "github.com/pkg/errors" 21 | kingpin "gopkg.in/alecthomas/kingpin.v2" 22 | ) 23 | 24 | // nolint: gochecknoglobals 25 | var ( 26 | version = "dev" 27 | commit = "none" 28 | datestr = "unknown" 29 | ) 30 | 31 | // given a template, and a config, generate shell script. 32 | func makeShell(tplsrc string, cfg *config.Project) ([]byte, error) { 33 | // if we want to add a timestamp in the templates this 34 | // function will generate it 35 | funcMap := template.FuncMap{ 36 | "join": strings.Join, 37 | "platformBinaries": makePlatformBinaries, 38 | "timestamp": func() string { 39 | return time.Now().UTC().Format(time.RFC3339) 40 | }, 41 | "replace": strings.ReplaceAll, 42 | "time": func(s string) string { 43 | return time.Now().UTC().Format(s) 44 | }, 45 | "tolower": strings.ToLower, 46 | "toupper": strings.ToUpper, 47 | "trim": strings.TrimSpace, 48 | } 49 | 50 | out := bytes.Buffer{} 51 | t, err := template.New("shell").Funcs(funcMap).Parse(tplsrc) 52 | if err != nil { 53 | return nil, err 54 | } 55 | err = t.Execute(&out, cfg) 56 | return out.Bytes(), err 57 | } 58 | 59 | // makePlatform returns a platform string combining goos, goarch, and goarm. 60 | func makePlatform(goos, goarch, goarm string) string { 61 | platform := goos + "/" + goarch 62 | if goarch == "arm" && goarm != "" { 63 | platform += "v" + goarm 64 | } 65 | return platform 66 | } 67 | 68 | // makePlatformBinaries returns a map from platforms to a slice of binaries 69 | // built for that platform. 70 | func makePlatformBinaries(cfg *config.Project) map[string][]string { 71 | platformBinaries := make(map[string][]string) 72 | for _, build := range cfg.Builds { 73 | ignore := make(map[string]bool) 74 | for _, ignoredBuild := range build.Ignore { 75 | platform := makePlatform(ignoredBuild.Goos, ignoredBuild.Goarch, ignoredBuild.Goarm) 76 | ignore[platform] = true 77 | } 78 | for _, goos := range build.Goos { 79 | for _, goarch := range build.Goarch { 80 | switch goarch { 81 | case "arm": 82 | for _, goarm := range build.Goarm { 83 | platform := makePlatform(goos, goarch, goarm) 84 | if !ignore[platform] { 85 | platformBinaries[platform] = append(platformBinaries[platform], build.Binary) 86 | } 87 | } 88 | default: 89 | platform := makePlatform(goos, goarch, "") 90 | if !ignore[platform] { 91 | platformBinaries[platform] = append(platformBinaries[platform], build.Binary) 92 | } 93 | } 94 | } 95 | } 96 | } 97 | return platformBinaries 98 | } 99 | 100 | // converts the given name template to it's equivalent in shell 101 | // except for the default goreleaser templates, templates with 102 | // conditionals will return an error 103 | // 104 | // {{ .Binary }} ---> [prefix]${BINARY}, etc. 105 | // 106 | func makeName(prefix, target string) (string, error) { 107 | // armv6 is the default in the shell script 108 | // so do not need special template condition for ARM 109 | armversion := "{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}" 110 | target = strings.Replace(target, armversion, "{{ .Arch }}", -1) 111 | 112 | // hack for https://github.com/goreleaser/godownloader/issues/70 113 | armversion = "{{ .Arch }}{{ if .Arm }}{{ .Arm }}{{ end }}" 114 | target = strings.Replace(target, armversion, "{{ .Arch }}", -1) 115 | 116 | target = strings.Replace(target, "{{.Arm}}", "{{ .Arch }}", -1) 117 | target = strings.Replace(target, "{{ .Arm }}", "{{ .Arch }}", -1) 118 | 119 | // otherwise if it contains a conditional, we can't (easily) 120 | // translate that to bash. Ask for bug report. 121 | if strings.Contains(target, "{{ if") || 122 | strings.Contains(target, "{{if") { 123 | //nolint: lll 124 | return "", fmt.Errorf("name_template %q contains unknown conditional or ARM format. Please file bug at https://github.com/goreleaser/godownloader", target) 125 | } 126 | 127 | varmap := map[string]string{ 128 | "Os": "${OS}", 129 | "Arch": "${ARCH}", 130 | "Version": "${VERSION}", 131 | "Tag": "${TAG}", 132 | "Binary": "${BINARY}", 133 | "ProjectName": "${PROJECT_NAME}", 134 | } 135 | 136 | out := bytes.Buffer{} 137 | if _, err := out.WriteString(prefix); err != nil { 138 | return "", err 139 | } 140 | t, err := template.New("name").Parse(target) 141 | if err != nil { 142 | return "", err 143 | } 144 | err = t.Execute(&out, varmap) 145 | return out.String(), err 146 | } 147 | 148 | // returns the owner/name repo from input 149 | // 150 | // see https://github.com/goreleaser/godownloader/issues/55 151 | func normalizeRepo(repo string) string { 152 | // handle full or partial URLs 153 | repo = strings.TrimPrefix(repo, "https://github.com/") 154 | repo = strings.TrimPrefix(repo, "http://github.com/") 155 | repo = strings.TrimPrefix(repo, "github.com/") 156 | 157 | // hande /name/repo or name/repo/ cases 158 | repo = strings.Trim(repo, "/") 159 | 160 | return repo 161 | } 162 | 163 | func loadURLs(path, configPath string) (*config.Project, error) { 164 | for _, file := range []string{configPath, "goreleaser.yml", ".goreleaser.yml", "goreleaser.yaml", ".goreleaser.yaml"} { 165 | if file == "" { 166 | continue 167 | } 168 | url := fmt.Sprintf("%s/%s", path, file) 169 | log.Infof("reading %s", url) 170 | project, err := loadURL(url) 171 | if err != nil { 172 | return nil, err 173 | } 174 | if project != nil { 175 | return project, nil 176 | } 177 | } 178 | return nil, fmt.Errorf("could not fetch a goreleaser configuration file") 179 | } 180 | 181 | func loadURL(file string) (*config.Project, error) { 182 | // nolint: gosec 183 | resp, err := http.Get(file) 184 | if err != nil { 185 | return nil, err 186 | } 187 | if resp.StatusCode != http.StatusOK { 188 | log.Errorf("reading %s returned %d %s\n", file, resp.StatusCode, http.StatusText(resp.StatusCode)) 189 | return nil, nil 190 | } 191 | p, err := config.LoadReader(resp.Body) 192 | 193 | // to make errcheck happy 194 | errc := resp.Body.Close() 195 | if errc != nil { 196 | return nil, errc 197 | } 198 | return &p, err 199 | } 200 | 201 | func loadFile(file string) (*config.Project, error) { 202 | p, err := config.Load(file) 203 | return &p, err 204 | } 205 | 206 | // Load project configuration from a given repo name or filepath/url. 207 | func Load(repo, configPath, file string) (project *config.Project, err error) { 208 | if repo == "" && file == "" { 209 | return nil, fmt.Errorf("repo or file not specified") 210 | } 211 | if file == "" { 212 | repo = normalizeRepo(repo) 213 | log.Infof("reading repo %q on github", repo) 214 | project, err = loadURLs( 215 | fmt.Sprintf("https://raw.githubusercontent.com/%s/master", repo), 216 | configPath, 217 | ) 218 | } else { 219 | log.Infof("reading file %q", file) 220 | project, err = loadFile(file) 221 | } 222 | if err != nil { 223 | return nil, err 224 | } 225 | 226 | // if not specified add in GitHub owner/repo info 227 | if project.Release.GitHub.Owner == "" { 228 | if repo == "" { 229 | return nil, fmt.Errorf("owner/name repo not specified") 230 | } 231 | project.Release.GitHub.Owner = path.Dir(repo) 232 | project.Release.GitHub.Name = path.Base(repo) 233 | } 234 | 235 | // avoid errors in docker defaulter 236 | for i := range project.Dockers { 237 | project.Dockers[i].Files = []string{} 238 | } 239 | 240 | var ctx = context.New(*project) 241 | for _, defaulter := range defaults.Defaulters { 242 | log.Infof("setting defaults for %s", defaulter) 243 | if err := defaulter.Default(ctx); err != nil { 244 | return nil, errors.Wrap(err, "failed to set defaults") 245 | } 246 | } 247 | project = &ctx.Config 248 | 249 | // set default binary name 250 | if len(project.Builds) == 0 { 251 | project.Builds = []config.Build{ 252 | {Binary: path.Base(repo)}, 253 | } 254 | } 255 | if project.Builds[0].Binary == "" { 256 | project.Builds[0].Binary = path.Base(repo) 257 | } 258 | 259 | return project, err 260 | } 261 | 262 | func main() { 263 | log.SetHandler(cli.Default) 264 | 265 | var ( 266 | repo = kingpin.Flag("repo", "owner/name or URL of GitHub repository").Short('r').String() 267 | output = kingpin.Flag("output", "output file, default stdout").Short('o').String() 268 | force = kingpin.Flag("force", "force writing of output").Short('f').Bool() 269 | source = kingpin.Flag("source", "source type [godownloader|raw|equinoxio]").Default("godownloader").String() 270 | exe = kingpin.Flag("exe", "name of binary, used only in raw").String() 271 | nametpl = kingpin.Flag("nametpl", "name template, used only in raw").String() 272 | tree = kingpin.Flag("tree", "use tree to generate multiple outputs").String() 273 | file = kingpin.Arg("file", "??").String() 274 | ) 275 | 276 | kingpin.CommandLine.Version(fmt.Sprintf("%v, commit %v, built at %v", version, commit, datestr)) 277 | kingpin.CommandLine.VersionFlag.Short('v') 278 | kingpin.CommandLine.HelpFlag.Short('h') 279 | kingpin.Parse() 280 | 281 | if *tree != "" { 282 | err := treewalk(*tree, *file, *force) 283 | if err != nil { 284 | log.WithError(err).Error("treewalker failed") 285 | os.Exit(1) 286 | } 287 | return 288 | } 289 | 290 | // gross.. need config 291 | out, err := processSource(*source, *repo, "", *file, *exe, *nametpl) 292 | 293 | if err != nil { 294 | log.WithError(err).Error("failed") 295 | os.Exit(1) 296 | } 297 | 298 | // stdout case 299 | if *output == "" { 300 | if _, err = os.Stdout.Write(out); err != nil { 301 | log.WithError(err).Error("unable to write") 302 | os.Exit(1) 303 | } 304 | return 305 | } 306 | 307 | // only write out if forced to, OR if output is effectively different 308 | // than what the file has. 309 | if *force || shell.ShouldWriteFile(*output, out) { 310 | if err = ioutil.WriteFile(*output, out, 0666); err != nil { //nolint: gosec 311 | log.WithError(err).Errorf("unable to write to %s", *output) 312 | os.Exit(1) 313 | } 314 | return 315 | } 316 | 317 | // output is effectively the same as new content 318 | // (comments and most whitespace doesn't matter) 319 | // nothing to do 320 | } 321 | -------------------------------------------------------------------------------- /makeshellfn.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | git_clone_or_update() { 5 | giturl=$1 6 | gitrepo=${giturl##*/} # foo.git 7 | gitrepo=${gitrepo%.git} # foo 8 | if [ ! -d "$gitrepo" ]; then 9 | git clone "$giturl" 10 | else 11 | (cd "$gitrepo" && git pull >/dev/null) 12 | fi 13 | } 14 | date_iso8601() { 15 | date -u +%Y-%m-%dT%H:%M:%S+0000 16 | } 17 | 18 | git_clone_or_update https://github.com/client9/shlib.git 19 | cd shlib 20 | 21 | now=$(date_iso8601) 22 | echo "// Code generated ${now} DO NOT EDIT." 23 | echo "package main" 24 | echo "" 25 | echo 'const shellfn = `' 26 | cat \ 27 | license.sh \ 28 | is_command.sh \ 29 | echoerr.sh \ 30 | log.sh \ 31 | uname_os.sh \ 32 | uname_arch.sh \ 33 | uname_os_check.sh \ 34 | uname_arch_check.sh \ 35 | untar.sh \ 36 | http_download.sh \ 37 | github_release.sh \ 38 | hash_sha256.sh \ 39 | license_end.sh \ 40 | | grep -v '^#' | grep -v ' #' | tr -s '\n' 41 | 42 | echo '`' 43 | -------------------------------------------------------------------------------- /scripts/build-site.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | # use gfind on osx 4 | if command -v gfind >/dev/null 2>&1; then 5 | alias find=gfind 6 | fi 7 | 8 | # add ./bin to PATH as well 9 | export PATH="./bin:$PATH" 10 | 11 | # clean up 12 | rm -rf ./www/public 13 | rm -rf ./www/static/github.com 14 | rm -rf ./www/data/projects 15 | mkdir -p ./www/data/projects 16 | 17 | # generate the sh files 18 | ./godownloader --tree=tree ./www/static/ 19 | 20 | # backup of disabled/broken/archived projects 21 | mkdir -p www/static/github.com/alecthomas 22 | wget -O www/static/github.com/alecthomas/gometalinter.sh \ 23 | https://install.goreleaser.com/github.com/alecthomas/gometalinter.sh 24 | 25 | mkdir -p www/static/github.com/kaihendry 26 | wget -O www/static/github.com/kaihendry/lk2.sh \ 27 | https://install.goreleaser.com/github.com/kaihendry/lk2.sh 28 | 29 | # lint generated files 30 | # SC2034 is unused variable 31 | # some generated scripts contain 1 or more variables with aren't used 32 | # sometimes. 33 | find ./www/static -name '*.sh' | while read -r f; do 34 | shellcheck -e SC2034 -s sh "$f" 35 | shellcheck -e SC2034 -s bash "$f" 36 | shellcheck -e SC2034 -s dash "$f" 37 | shellcheck -e SC2034 -s ksh "$f" 38 | done 39 | 40 | # generate the hugo data files 41 | find tree -name '*.yaml' -printf '%P\n' | while read -r f; do 42 | ff="$(echo "$f" | sed -e 's/\.yaml//' -e 's/\./-/g' -e 's/\//-/g')" 43 | echo "path: $f" | sed 's/\.yaml//' > ./www/data/projects/"$ff.yaml" 44 | done 45 | 46 | # generate the site 47 | hugo -s www -d public 48 | -------------------------------------------------------------------------------- /shell_equinoxio.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "path" 6 | 7 | "github.com/goreleaser/goreleaser/pkg/config" 8 | ) 9 | 10 | // processEquinoxio create a fake goreleaser config for equinox.io 11 | // and use a similar template. 12 | func processEquinoxio(repo string) ([]byte, error) { 13 | if repo == "" { 14 | return nil, fmt.Errorf("must have repo") 15 | } 16 | project := config.Project{} 17 | project.Release.GitHub.Owner = path.Dir(repo) 18 | project.Release.GitHub.Name = path.Base(repo) 19 | project.Builds = []config.Build{ 20 | {Binary: path.Base(repo)}, 21 | } 22 | project.Archive.Format = "tgz" 23 | return makeShell(shellEquinoxio, &project) 24 | } 25 | 26 | const shellEquinoxio = `#!/bin/sh 27 | set -e 28 | # Code generated by godownloader on {{ timestamp }}. DO NOT EDIT. 29 | # 30 | 31 | usage() { 32 | this=$1 33 | cat < 0 { 17 | cfg.Archive = cfg.Archives[0] 18 | } 19 | // get archive name template 20 | archName, err := makeName("NAME=", cfg.Archive.NameTemplate) 21 | cfg.Archive.NameTemplate = archName 22 | if err != nil { 23 | return nil, fmt.Errorf("unable generate archive name: %s", err) 24 | } 25 | // get checksum name template 26 | checkName, err := makeName("CHECKSUM=", cfg.Checksum.NameTemplate) 27 | cfg.Checksum.NameTemplate = checkName 28 | if err != nil { 29 | return nil, fmt.Errorf("unable generate checksum name: %s", err) 30 | } 31 | 32 | return makeShell(shellGodownloader, cfg) 33 | } 34 | 35 | // nolint: lll 36 | const shellGodownloader = `#!/bin/sh 37 | set -e 38 | # Code generated by godownloader on {{ timestamp }}. DO NOT EDIT. 39 | # 40 | 41 | usage() { 42 | this=$1 43 | cat </dev/null 15 | } 16 | echoerr() { 17 | echo "$@" 1>&2 18 | } 19 | log_prefix() { 20 | echo "$0" 21 | } 22 | _logp=6 23 | log_set_priority() { 24 | _logp="$1" 25 | } 26 | log_priority() { 27 | if test -z "$1"; then 28 | echo "$_logp" 29 | return 30 | fi 31 | [ "$1" -le "$_logp" ] 32 | } 33 | log_tag() { 34 | case $1 in 35 | 0) echo "emerg" ;; 36 | 1) echo "alert" ;; 37 | 2) echo "crit" ;; 38 | 3) echo "err" ;; 39 | 4) echo "warning" ;; 40 | 5) echo "notice" ;; 41 | 6) echo "info" ;; 42 | 7) echo "debug" ;; 43 | *) echo "$1" ;; 44 | esac 45 | } 46 | log_debug() { 47 | log_priority 7 || return 0 48 | echoerr "$(log_prefix)" "$(log_tag 7)" "$@" 49 | } 50 | log_info() { 51 | log_priority 6 || return 0 52 | echoerr "$(log_prefix)" "$(log_tag 6)" "$@" 53 | } 54 | log_err() { 55 | log_priority 3 || return 0 56 | echoerr "$(log_prefix)" "$(log_tag 3)" "$@" 57 | } 58 | log_crit() { 59 | log_priority 2 || return 0 60 | echoerr "$(log_prefix)" "$(log_tag 2)" "$@" 61 | } 62 | uname_os() { 63 | os=$(uname -s | tr '[:upper:]' '[:lower:]') 64 | case "$os" in 65 | cygwin_nt*) os="windows" ;; 66 | mingw*) os="windows" ;; 67 | msys_nt*) os="windows" ;; 68 | esac 69 | echo "$os" 70 | } 71 | uname_arch() { 72 | arch=$(uname -m) 73 | case $arch in 74 | x86_64) arch="amd64" ;; 75 | x86) arch="386" ;; 76 | i686) arch="386" ;; 77 | i386) arch="386" ;; 78 | aarch64) arch="arm64" ;; 79 | armv5*) arch="armv5" ;; 80 | armv6*) arch="armv6" ;; 81 | armv7*) arch="armv7" ;; 82 | esac 83 | echo ${arch} 84 | } 85 | uname_os_check() { 86 | os=$(uname_os) 87 | case "$os" in 88 | darwin) return 0 ;; 89 | dragonfly) return 0 ;; 90 | freebsd) return 0 ;; 91 | linux) return 0 ;; 92 | android) return 0 ;; 93 | nacl) return 0 ;; 94 | netbsd) return 0 ;; 95 | openbsd) return 0 ;; 96 | plan9) return 0 ;; 97 | solaris) return 0 ;; 98 | windows) return 0 ;; 99 | esac 100 | log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib" 101 | return 1 102 | } 103 | uname_arch_check() { 104 | arch=$(uname_arch) 105 | case "$arch" in 106 | 386) return 0 ;; 107 | amd64) return 0 ;; 108 | arm64) return 0 ;; 109 | armv5) return 0 ;; 110 | armv6) return 0 ;; 111 | armv7) return 0 ;; 112 | ppc64) return 0 ;; 113 | ppc64le) return 0 ;; 114 | mips) return 0 ;; 115 | mipsle) return 0 ;; 116 | mips64) return 0 ;; 117 | mips64le) return 0 ;; 118 | s390x) return 0 ;; 119 | amd64p32) return 0 ;; 120 | esac 121 | log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib" 122 | return 1 123 | } 124 | untar() { 125 | tarball=$1 126 | case "${tarball}" in 127 | *.tar.gz | *.tgz) tar --no-same-owner -xzf "${tarball}" ;; 128 | *.tar) tar --no-same-owner -xf "${tarball}" ;; 129 | *.zip) unzip "${tarball}" ;; 130 | *) 131 | log_err "untar unknown archive format for ${tarball}" 132 | return 1 133 | ;; 134 | esac 135 | } 136 | http_download_curl() { 137 | local_file=$1 138 | source_url=$2 139 | header=$3 140 | if [ -z "$header" ]; then 141 | code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url") 142 | else 143 | code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url") 144 | fi 145 | if [ "$code" != "200" ]; then 146 | log_debug "http_download_curl received HTTP status $code" 147 | return 1 148 | fi 149 | return 0 150 | } 151 | http_download_wget() { 152 | local_file=$1 153 | source_url=$2 154 | header=$3 155 | if [ -z "$header" ]; then 156 | wget -q -O "$local_file" "$source_url" 157 | else 158 | wget -q --header "$header" -O "$local_file" "$source_url" 159 | fi 160 | } 161 | http_download() { 162 | log_debug "http_download $2" 163 | if is_command curl; then 164 | http_download_curl "$@" 165 | return 166 | elif is_command wget; then 167 | http_download_wget "$@" 168 | return 169 | fi 170 | log_crit "http_download unable to find wget or curl" 171 | return 1 172 | } 173 | http_copy() { 174 | tmp=$(mktemp) 175 | http_download "${tmp}" "$1" "$2" || return 1 176 | body=$(cat "$tmp") 177 | rm -f "${tmp}" 178 | echo "$body" 179 | } 180 | github_release() { 181 | owner_repo=$1 182 | version=$2 183 | test -z "$version" && version="latest" 184 | giturl="https://github.com/${owner_repo}/releases/${version}" 185 | json=$(http_copy "$giturl" "Accept:application/json") 186 | test -z "$json" && return 1 187 | version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//') 188 | test -z "$version" && return 1 189 | echo "$version" 190 | } 191 | hash_sha256() { 192 | TARGET=${1:-/dev/stdin} 193 | if is_command gsha256sum; then 194 | hash=$(gsha256sum "$TARGET") || return 1 195 | echo "$hash" | cut -d ' ' -f 1 196 | elif is_command sha256sum; then 197 | hash=$(sha256sum "$TARGET") || return 1 198 | echo "$hash" | cut -d ' ' -f 1 199 | elif is_command shasum; then 200 | hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 201 | echo "$hash" | cut -d ' ' -f 1 202 | elif is_command openssl; then 203 | hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 204 | echo "$hash" | cut -d ' ' -f a 205 | else 206 | log_crit "hash_sha256 unable to find command to compute sha-256 hash" 207 | return 1 208 | fi 209 | } 210 | hash_sha256_verify() { 211 | TARGET=$1 212 | checksums=$2 213 | if [ -z "$checksums" ]; then 214 | log_err "hash_sha256_verify checksum file not specified in arg2" 215 | return 1 216 | fi 217 | BASENAME=${TARGET##*/} 218 | want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) 219 | if [ -z "$want" ]; then 220 | log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'" 221 | return 1 222 | fi 223 | got=$(hash_sha256 "$TARGET") 224 | if [ "$want" != "$got" ]; then 225 | log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got" 226 | return 1 227 | fi 228 | } 229 | cat /dev/null < 20 | 21 | [GoReleaser]: https://goreleaser.com 22 | [GoDownloader]: https://github.com/goreleaser/godownloader 23 | 24 | You can see the list of all projects being served [here](/projects). 25 | -------------------------------------------------------------------------------- /www/content/introduction.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Introduction 3 | weight: 1 4 | menu: true 5 | --- 6 | 7 | Install scripts generated by godownloader! 8 | 9 | This page contains scripts generated using [godownloader]. 10 | 11 | [godownloader]: https://github.com/goreleaser/godownloader 12 | -------------------------------------------------------------------------------- /www/content/projects.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Projects 3 | weight: 100 4 | layout: projects 5 | hideFromIndex: true 6 | menu: true 7 | --- 8 | 9 | This is the list of all projects being served in this site. 10 | 11 | You can see both the project path and the one-liner to install it here. 12 | -------------------------------------------------------------------------------- /www/data/.gitignore: -------------------------------------------------------------------------------- 1 | projects/*.yaml 2 | -------------------------------------------------------------------------------- /www/layouts/page/projects.html: -------------------------------------------------------------------------------- 1 | {{ define "main" }} 2 | {{ .Content }} 3 | {{ range sort .Site.Data.projects "path" "asc" }} 4 |
5 |

{{ .path }}

6 | {{ $cmd := delimit (slice "curl -sfL https://install.goreleaser.com/" .path ".sh | sh") "" }} 7 | {{ highlight $cmd "bash" "" }} 8 | Copy to clipboard 9 |
10 | {{ end }} 11 | 12 | 13 | 16 | 19 | {{ end }} 20 | -------------------------------------------------------------------------------- /www/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/goreleaser/godownloader/632441f5a29bac9ac3088f139477b364ff525041/www/static/favicon.ico --------------------------------------------------------------------------------