diff --git a/.gitignore b/.gitignore index 581c11532b..e1b289cc57 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,9 @@ +# prelude.mk +/bin/ + # teleproxy.mk -/teleproxy /teleproxy.log -# kubeapply.mk -/kubeapply - # kubernaut.mk *.knaut *.knaut.claim @@ -15,14 +14,21 @@ /docker-registry.yaml.o # go-mod.mk -/golangci-lint /go-test.tap /go1*.src.tar.gz +# go-mod.mk +/gopath/ + # --- Files ignored by older versions --- # Remove the tail of this list when the commit making the change gets # far enough in to the past. +# 2019-07-01 +/teleproxy +/kubeapply +/golangci-lint + # 2019-02-06 /patter.go /patter.go.tmp diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..e9dc2509ff --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,85 @@ + +# Datawire build-aux CHANGELOG + + - 2019-07-05: `build-aux-push`: Work around problem with `git subtree`; avoid accidentally pushing + proprietary code to build-aux.git. + + - 2019-07-03: `go-mod.mk`: `.opensource.tar.gz` files are still part of `make build`, but no longer + part of `make go-build`. + + - 2019-07-03: Rewrite the `go-opensource` Bash script as `go-mkopensource` in Go. + + - 2019-07-03: Migrate from `curl` to `go.mod`. + - 2019-07-03: BREAKING CHANGE: Move executables to be in `./build-aux/bin/` instead of directly in + `./build-aux/`. Each of these programs now has a variable to refer to it by, instead + of having to hard-code the path. It is also no longer valid to use one of those + programs without depending on it first. + + - 2019-06-20: `go-mod.mk`: Bump golangci-lint version 1.15.0→1.17.1. + - 2019-06-20: `go-mod.mk`: For each binary, generate a `BIN.opensource.tar.gz` file. + - 2019-06-20: `go-workspace.mk`: Remove. + + - 2019-05-31: `go-modmk`: Add `go doc` target to run `godoc -http`. + + - 2019-05-01: BREAKING CHANGE: `docker.mk`: Don't include `kuberanut-ui.mk`. + - 2019-05-01: BREAKING CHANGE: `teleproxy.mk`: Don't include `kuberanut-ui.mk`. + - 2019-05-01: Go over documented inputs/outputs; differentiate between "eager" and "lazy inputs". + - 2019-05-01: BREAKING CHANGE: `help.mk`: Don't include `common.mk`. + - 2019-05-01: BREAKING CHANGE: `kubeapply.mk`: Don't include `common.mk`. + - 2019-05-01: BREAKING CHANGE: `kubernaut.mk`: Don't include `common.mk`. + - 2019-05-01: BREAKING CHANGE: `flock.mk`: Delete; merge in to `prelude.mk`. + - 2019-05-01: Drop dependency on Go for setting `GO{HOST,}{OS,ARCH}`. + - 2019-05-01: BREAKING CHANGE: Use GOHOSTOS/GOHOSTARCH instead of GOOS/GOARCH as appropriate. + - 2019-05-01: `prelude.mk`: Add `$(call lazyonce,…)`. + - 2019-05-01: `prelude.mk`: Introduce, steal code from `common.mk`. + + - 2019-02-15: `kubernaut-ui.mk`: Avoid warnings from `make` inside of `makeh shell`. + + - 2019-02-13: `_go-common.mk`: Bump golangci-lint version 1.13.1→1.15.0. + + - 2019-02-08: `common.mk`: Slight rework of how test dependencies work. + + - 2019-01-30: `common.mk`: Add TAP-based `check` infrastructure. + + - 2019-01-23: `docker.mk`: Fix `.knaut.push` on macOS. + - 2019-01-18: `docker.mk`: Robustness improvements. + + - 2019-01-15: `go.mk`: Remove this symlink to `go-workspace.mk`. + + - 2019-01-10: `teleproxy.mk`: Go to simple 1s polling, instead of exponential backoff. + + - 2019-01-05: `build-aux-push`: Rejoin afer the split. + + - 2018-12-23: `flock.mk`: Introduce. + + - 2018-12-22: `go-mod.mk`: Enable parallel builds for Go 1.12+ + - 2018-12-22: `go-workspace.mk`: Enable parallel builds for Go 1.10+ + - 2018-12-22: Almost exclusively use `$(KUBECONFIG)` to refer to `cluster.knaut`. This allows the + caller to override the value by passing a `KUBECONFIG=…` argument to `make`. This is + an important property for running `make check` inside of `testbench`, so that + testbench can provide the Kubernaut file. The exception is that we still hard-code + the value in `clean: cluster.knaut.clean` so that `make clean` doesn't remove the + user's Kubernaut file. + + - 2018-12-22: `_go-common.mk`: Add a variable to disable `go-test`'s automatic definition + + - 2018-12-20: BREAKING CHANGE: `common.mk`: The argument order of `$(call joinlist,…)` has changed. + + - 2018-12-20: BREAKING CHANGE: `go-{mod,workspace}.mk`: `$(pkg)` is now `$(go.module)`, and is no + longer necessary to manually set; `go-{mod,workspace}.mk` are both smart enough to + set it automatically! + - 2018-12-20: BREAKING CHANGE: `go-{mod,workspace}.mk`: `$(bins)` is now `$(notdir $(go.bins))`, + and is no longer nescessary to manually set; `go-{mod,workspace}.mk` are both smart + enough to set it automatically! + - 2018-12-20: BREAKING CHANGE: `go-{mod,workspace}.mk`: Go binaries now go in + `./bin_$(GOOS)_$(GOARCH)/` by default, instead of the old default of `./` + - 2018-12-20: `go-{mod,workspace}.mk`: The `Makefile` doesn't need to export `GOPATH` or anything + like that, the .mk snippets now export things. + - 2018-12-20: `go-{mod,workspace}.mk`: It's no longer necessary to use `$(GO)`, just write + `go`--but don't don't use it inside of `$(shell …)` if you can avoid it, exported + variables don't affect `$(shell …)`. + - 2018-12-20: `common.mk`: It's no longer necessary to clean up `bin_*/`, in your `clean:` rule, + `common.mk` takes care of that for you. + - 2018-12-20: `common.mk` goes ahead and declares several common targets as `.PHONY` + + - 2018-12-06: Rename `go.mk` to `go-workspace.mk`, introduce a new `go-mod.mk`. diff --git a/HACKING.md b/HACKING.md index 14702813f3..f43e8c3d2f 100644 --- a/HACKING.md +++ b/HACKING.md @@ -2,8 +2,6 @@ ## Misc notes - - Any `.go` files should say `// +build ignore` to prevent `go list - ./...` from picking them up. - If you have a dependency on another `.mk` file includes, include it with `include $(dir $(lastword $(MAKEFILE_LIST)))common.mk`. - `.PHONY` targets that you wish to be user-visible should have a `## @@ -16,6 +14,12 @@ include guards to make sure they are only included once; similar to how you would with a C header file. + - The Make `export` directive *only* affects recipes, and does *not* + affect `$(shell …)`. Because of this, you shoud not call `go` + inside of `$(shell …)`, as `$GO111MODULE` may not have the correct + value. + - Make sure to pass `--fail` to `curl` when downloading things; + otherwise it will silently save 404 HTML/XML pages. ## Naming conventions @@ -43,10 +47,13 @@ (including macOS). Therefore, `--` working is a reasonable base assumption. Known exceptions: * macOS `chmod` + - Prefer `curl` to `wget`; macOS ships with `curl`, it doesn't ship + with `wget`. ## Style guide - - (see "Naming conventions") + - See "Naming conventions".. + - See [`docs/conventions.md`](./docs/conventions.md). - Place `.PHONY:` immediately *after* the rule definition. - Use pattern rules instead of "old-fashioned suffix rules" (as the GNU Make manual refers to them). diff --git a/flock.go b/bin-go/flock/flock.go similarity index 99% rename from flock.go rename to bin-go/flock/flock.go index d1fb4b0854..f0f62cc1ee 100644 --- a/flock.go +++ b/bin-go/flock/flock.go @@ -1,7 +1,5 @@ // Copyright 2018 Datawire. All rights reserved. -// +build ignore - // flock.go is a minimal implementation of flock(1) (from util-linux) // for systems that don't have flock(1) but do have flock(2). // diff --git a/bin-go/go-mkopensource/internal/golist/golist.go b/bin-go/go-mkopensource/internal/golist/golist.go new file mode 100644 index 0000000000..505928d606 --- /dev/null +++ b/bin-go/go-mkopensource/internal/golist/golist.go @@ -0,0 +1,28 @@ +package golist + +import ( + "bytes" + "encoding/json" + "io" + "os/exec" +) + +func GoList(pkg string, flags ...string) ([]Package, error) { + stdoutBytes, err := exec.Command("go", append([]string{"list"}, append(flags, "-json", "--", pkg)...)...).Output() + if err != nil { + return nil, err + } + stdoutDecoder := json.NewDecoder(bytes.NewReader(stdoutBytes)) + var ret []Package + for { + var pkg Package + if err := stdoutDecoder.Decode(&pkg); err != nil { + if err == io.EOF { + break + } + return nil, err + } + ret = append(ret, pkg) + } + return ret, nil +} diff --git a/bin-go/go-mkopensource/internal/golist/types.go b/bin-go/go-mkopensource/internal/golist/types.go new file mode 100644 index 0000000000..9997990514 --- /dev/null +++ b/bin-go/go-mkopensource/internal/golist/types.go @@ -0,0 +1,90 @@ +package golist + +import ( + "time" +) + +// These definitions are copied verbatim from `go help list`. + +type Package struct { + Dir string // directory containing package sources + ImportPath string // import path of package in dir + ImportComment string // path in import comment on package statement + Name string // package name + Doc string // package documentation string + Target string // install path + Shlib string // the shared library that contains this package (only set when -linkshared) + Goroot bool // is this package in the Go root? + Standard bool // is this package part of the standard Go library? + Stale bool // would 'go install' do anything for this package? + StaleReason string // explanation for Stale==true + Root string // Go root or Go path dir containing this package + ConflictDir string // this directory shadows Dir in $GOPATH + BinaryOnly bool // binary-only package: cannot be recompiled from sources + ForTest string // package is only for use in named test + Export string // file containing export data (when using -export) + Module *Module // info about package's containing module, if any (can be nil) + Match []string // command-line patterns matching this package + DepOnly bool // package is only a dependency, not explicitly listed + + // Source files + GoFiles []string // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles) + CgoFiles []string // .go source files that import "C" + CompiledGoFiles []string // .go files presented to compiler (when using -compiled) + IgnoredGoFiles []string // .go source files ignored due to build constraints + CFiles []string // .c source files + CXXFiles []string // .cc, .cxx and .cpp source files + MFiles []string // .m source files + HFiles []string // .h, .hh, .hpp and .hxx source files + FFiles []string // .f, .F, .for and .f90 Fortran source files + SFiles []string // .s source files + SwigFiles []string // .swig files + SwigCXXFiles []string // .swigcxx files + SysoFiles []string // .syso object files to add to archive + TestGoFiles []string // _test.go files in package + XTestGoFiles []string // _test.go files outside package + + // Cgo directives + CgoCFLAGS []string // cgo: flags for C compiler + CgoCPPFLAGS []string // cgo: flags for C preprocessor + CgoCXXFLAGS []string // cgo: flags for C++ compiler + CgoFFLAGS []string // cgo: flags for Fortran compiler + CgoLDFLAGS []string // cgo: flags for linker + CgoPkgConfig []string // cgo: pkg-config names + + // Dependency information + Imports []string // import paths used by this package + ImportMap map[string]string // map from source import to ImportPath (identity entries omitted) + Deps []string // all (recursively) imported dependencies + TestImports []string // imports from TestGoFiles + XTestImports []string // imports from XTestGoFiles + + // Error information + Incomplete bool // this package or a dependency has an error + Error *PackageError // error loading package + DepsErrors []*PackageError // errors loading dependencies +} + +type PackageError struct { + ImportStack []string // shortest path from package named on command line to this one + Pos string // position of error (if present, file:line:col) + Err string // the error itself +} + +type Module struct { + Path string // module path + Version string // module version + Versions []string // available module versions (with -versions) + Replace *Module // replaced by this module + Time *time.Time // time version was created + Update *Module // available update, if any (with -u) + Main bool // is this the main module? + Indirect bool // is this module only an indirect dependency of main module? + Dir string // directory holding files for this module, if any + GoMod string // path to go.mod file for this module, if any + Error *ModuleError // error loading module +} + +type ModuleError struct { + Err string // the error itself +} diff --git a/bin-go/go-mkopensource/main.go b/bin-go/go-mkopensource/main.go new file mode 100644 index 0000000000..0026eb88bf --- /dev/null +++ b/bin-go/go-mkopensource/main.go @@ -0,0 +1,324 @@ +package main + +import ( + "archive/tar" + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "path" + "path/filepath" + "sort" + "strings" + "text/tabwriter" + + "github.com/pkg/errors" + "github.com/spf13/pflag" + + "github.com/datawire/build-aux/bin-go/go-mkopensource/internal/golist" +) + +type CLIArgs struct { + OutputName string + OutputFilename string + GoTarFilename string + Package string +} + +func parseArgs() (*CLIArgs, error) { + args := &CLIArgs{} + argparser := pflag.NewFlagSet(os.Args[0], pflag.ContinueOnError) + help := false + argparser.BoolVarP(&help, "help", "h", false, "Show this message") + argparser.StringVar(&args.OutputFilename, "output", "", "") + argparser.StringVar(&args.OutputName, "output-name", "", "") + argparser.StringVar(&args.GoTarFilename, "gotar", "", "") + argparser.StringVar(&args.Package, "package", "", "") + if err := argparser.Parse(os.Args[1:]); err != nil { + return nil, err + } + if help { + fmt.Printf("Usage: %v OPTIONS\n", os.Args[0]) + fmt.Println("Build a .opensource.tar.gz tarball for open source license compliance") + fmt.Println() + fmt.Println("OPTIONS:") + argparser.PrintDefaults() + return nil, pflag.ErrHelp + } + if argparser.NArg() != 0 { + return nil, errors.Errorf("expected 0 arguments, got %d: %q", argparser.NArg(), argparser.Args()) + } + if args.OutputName == "" && args.OutputFilename == "" { + return nil, errors.Errorf("at least one of --output= or --output-name= must be specified") + } + if args.OutputFilename != "" && !strings.HasSuffix(args.OutputFilename, ".tar.gz") { + return nil, errors.Errorf("--output (%q) must have .tar.gz suffix", args.OutputFilename) + } + if args.OutputName == "" { + args.OutputName = strings.TrimSuffix(filepath.Base(args.OutputFilename), ".tar.gz") + } + if !strings.HasPrefix(filepath.Base(args.GoTarFilename), "go1.") || !strings.HasSuffix(args.GoTarFilename, ".tar.gz") { + return nil, errors.Errorf("--gotar (%q) doesn't look like a go1.*.tar.gz file", args.GoTarFilename) + } + if args.Package == "" { + return nil, errors.Errorf("--package (%q) must be non-empty", args.Package) + } + return args, nil +} + +func main() { + args, err := parseArgs() + if err != nil { + if err == pflag.ErrHelp { + os.Exit(0) + } + fmt.Fprintf(os.Stderr, "%s: %v\nTry '%s --help' for more information.\n", os.Args[0], err, os.Args[0]) + os.Exit(2) + } + if err := Main(args); err != nil { + fmt.Fprintf(os.Stderr, "%s: fatal: %v\n", os.Args[0], err) + os.Exit(1) + } +} + +func loadGoTar(goTarFilename string) (version string, license []byte, err error) { + goTarFile, err := os.Open(goTarFilename) + if err != nil { + return "", nil, err + } + defer goTarFile.Close() + goTarUncompressed, err := gzip.NewReader(goTarFile) + if err != nil { + return "", nil, err + } + defer goTarUncompressed.Close() + goTar := tar.NewReader(goTarUncompressed) + for { + header, err := goTar.Next() + if err != nil { + if err == io.EOF { + break + } + return "", nil, err + } + switch header.Name { + case "go/VERSION": + fc, err := ioutil.ReadAll(goTar) + if err != nil { + return "", nil, err + } + version = "v" + strings.TrimPrefix(strings.TrimSpace(string(fc)), "go") + case "go/LICENSE": + fc, err := ioutil.ReadAll(goTar) + if err != nil { + return "", nil, err + } + license = fc + } + if version != "" && license != nil { + break + } + } + if version == "" || license == nil { + return "", nil, errors.Errorf("file %q did not contain %q or %q", goTarFilename, "go/VERSION", "go/LICENSE") + } + return version, license, nil +} + +func dirForModule(tarfiles map[string][]byte, modname string) error { + fileinfos, err := ioutil.ReadDir("vendor/" + modname) + if err != nil { + return err + } + licensePrefixes := []string{ + "LICENSE", + "license", + "COPYING", + "copying", + } + var license []string + for _, fileinfo := range fileinfos { + for _, prefix := range licensePrefixes { + if strings.HasPrefix(fileinfo.Name(), prefix) { + license = append(license, fileinfo.Name()) + } + } + } + switch len(license) { + case 0: + return errors.Errorf("%q has no LICENSE file", modname) + case 1: + // do nothing + default: + fmt.Fprintf(os.Stderr, "WARNING: %q: found %d LICENSE files, heuristics more likely to be wrong\n", modname, len(license)) + } + licenseBody, err := ioutil.ReadFile("vendor/" + modname + "/" + license[0]) + if err != nil { + return err + } + if strings.HasPrefix(string(licenseBody), "Mozilla Public License, version 2.0") { + // Copyleft + err := filepath.Walk("vendor/"+modname, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + return nil + } + body, err := ioutil.ReadFile(path) + if err != nil { + return err + } + tarfiles[strings.TrimPrefix(path, "vendor/")] = body + return nil + }) + if err != nil { + return err + } + } else { + // Permissive + extraPrefixes := []string{ + "NOTICE", // required for Apache 2.0 compliance + "PATENT", // for BSD and MIT, which do not include a patent grant + } + var extrafiles []string + for _, fileinfo := range fileinfos { + for _, prefix := range extraPrefixes { + if strings.HasPrefix(fileinfo.Name(), prefix) { + extrafiles = append(extrafiles, fileinfo.Name()) + } + } + } + for _, filename := range append(license, extrafiles...) { + body, err := ioutil.ReadFile("vendor/" + modname + "/" + filename) + if err != nil { + return err + } + tarfiles[modname+"/"+filename] = body + } + } + return nil +} + +func Main(args *CLIArgs) error { + // go list (& post-processing) + listPkgs, err := golist.GoList(args.Package, "-deps") + if err != nil { + return err + } + var gopkg, gomod string + for _, pkg := range listPkgs { + if !pkg.DepOnly { + gopkg = pkg.ImportPath + gomod = pkg.Module.Path + } + } + if gopkg == "" || gomod == "" { + return errors.New("go list didn't give us the requested package") + } + listMods := make(map[string]*golist.Module) + for _, pkg := range listPkgs { + key := "" + if pkg.Module != nil { + key = pkg.Module.Path + if pkg.Module.Path == gomod || pkg.Module.Path == "github.com/datawire/liboauth2" || pkg.Module.Path == "github.com/datawire/teleproxy" { + continue + } + } + if _, done := listMods[key]; done { + continue + } + listMods[key] = pkg.Module + } + + // tar xf go{version}.src.tar.gz + goVersion, goLicense, err := loadGoTar(args.GoTarFilename) + if err != nil { + return err + } + + // gather files... + files := make(map[string][]byte) + readme := new(bytes.Buffer) + readme.WriteString(wordwrap(75, fmt.Sprintf("The program %q incorporates the following Free and Open Source software:", path.Base(gopkg)))) + readme.WriteString("\n") + table := tabwriter.NewWriter(readme, 0, 8, 2, ' ', 0) + io.WriteString(table, " \tName\tVersion\n") + io.WriteString(table, "\t----\t-------\n") + modNames := make([]string, 0, len(listMods)) + for k := range listMods { + modNames = append(modNames, k) + } + sort.Strings(modNames) + for _, modKey := range modNames { + modVal := listMods[modKey] + var depName, depVersion string + if modVal == nil { + depName = "the Go language standard library (\"std\")" + depVersion = goVersion + files["std/LICENSE"] = goLicense + } else { + depName = modVal.Path + depVersion = modVal.Version + if modVal.Replace != nil { + if modVal.Replace.Version == "" { + depVersion = "(modified)" + } else { + if modVal.Replace.Path != modVal.Path { + depName = fmt.Sprintf("%s (modified from %s)", modVal.Replace.Path, modVal.Path) + } + depVersion = modVal.Replace.Version + } + } + if err := dirForModule(files, modVal.Path); err != nil { + return err + } + } + // TODO: license+files + fmt.Fprintf(table, "\t%s\t%s\n", depName, depVersion) + } + table.Flush() + readme.WriteString("\n") + readme.WriteString(wordwrap(75, "The appropriate license notices and source code are in correspondingly named directories.")) + files["OPENSOURCE.md"] = readme.Bytes() + + // write output + var outputFile *os.File + if args.OutputFilename == "" { + outputFile = os.Stdout + } else { + outputFile, err = os.OpenFile(args.OutputFilename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return err + } + } + defer outputFile.Close() + outputCompressed := gzip.NewWriter(outputFile) + defer outputCompressed.Close() + outputTar := tar.NewWriter(outputCompressed) + defer outputTar.Close() + + filenames := make([]string, 0, len(files)) + for filename := range files { + filenames = append(filenames, filename) + } + sort.Strings(filenames) + for _, filename := range filenames { + body := files[filename] + err := outputTar.WriteHeader(&tar.Header{ + Typeflag: tar.TypeReg, + Name: args.OutputName + "/" + filename, + Size: int64(len(body)), + Mode: 0644, + }) + if err != nil { + return err + } + if _, err := outputTar.Write(body); err != nil { + return err + } + } + return nil +} diff --git a/bin-go/go-mkopensource/wordwrap.go b/bin-go/go-mkopensource/wordwrap.go new file mode 100644 index 0000000000..158db1bded --- /dev/null +++ b/bin-go/go-mkopensource/wordwrap.go @@ -0,0 +1,45 @@ +package main + +import ( + "strings" +) + +func wordwrap(width int, str string) string { + var words []string + for len(str) > 0 { + sep := strings.IndexAny(str, " \n") + if sep < 0 { + words = append(words, str) + break + } + word := str[:sep] + rest := str[sep+1:] + words = append(words, word) + // First space after a period is a non-breaking space; + // encode that with an empty word. + if strings.HasSuffix(word, ".") && strings.HasPrefix(rest, " ") { + words = append(words, "") + } + str = strings.TrimLeft(rest, " \n") + } + linewidth := 0 + ret := new(strings.Builder) + sep := "" + for _, word := range words { + if word == "" { + sep = " " + } else if linewidth+len(sep)+len(word) > width { + ret.WriteString("\n") + ret.WriteString(word) + linewidth = len(word) + sep = " " + } else { + ret.WriteString(sep) + ret.WriteString(word) + linewidth += len(sep) + len(word) + sep = " " + } + } + ret.WriteString("\n") + return ret.String() +} diff --git a/gotest2tap.go b/bin-go/gotest2tap/gotest2tap.go similarity index 99% rename from gotest2tap.go rename to bin-go/gotest2tap/gotest2tap.go index a3860caf0a..1bff847d04 100644 --- a/gotest2tap.go +++ b/bin-go/gotest2tap/gotest2tap.go @@ -1,7 +1,5 @@ // Copyright 2018 Datawire. All rights reserved. -// +build ignore - // gotest2tap.go translates `go test -json` on stdin to TAP v13 on // stdout. package main diff --git a/gubernaut.go b/bin-go/gubernaut/gubernaut.go similarity index 99% rename from gubernaut.go rename to bin-go/gubernaut/gubernaut.go index 0033357f1b..d97d6c7a45 100644 --- a/gubernaut.go +++ b/bin-go/gubernaut/gubernaut.go @@ -1,5 +1,3 @@ -// +build ignore - package main import ( diff --git a/copy-ifchanged b/bin-sh/copy-ifchanged.sh old mode 100755 new mode 100644 similarity index 100% rename from copy-ifchanged rename to bin-sh/copy-ifchanged.sh diff --git a/tap-driver b/bin-sh/tap-driver.sh old mode 100755 new mode 100644 similarity index 92% rename from tap-driver rename to bin-sh/tap-driver.sh index 62fae57e4e..c5feda7018 --- a/tap-driver +++ b/bin-sh/tap-driver.sh @@ -11,10 +11,25 @@ # portability. # # Notes: -# - The TAP parser here is heavily based on the one I (LukeShu) wrote -# in Python for testbench-matrix. -# - This is only slightly shorter than Automake's tap-driver.sh, but -# I think it's a lot more understandable. +# This is 500 lines of pure Bash. I (LukeShu) think it's clean and +# editable, but I'm more comfortable with Bash than most. It's +# conceptually very similar to Automake's `tap-driver.sh`, which is +# about the same length, but a little bit of POSIX shell, and a +# whole lot of AWK (and I think isn't very understandable). The +# bulk of mine is a TAP parser, strongly based on the one I wrote +# in Python for [testbench-matrix][]. +# - I considered writing it in Python, but decided against it +# because I didn't want to expand the build-footprint of +# build-aux, which currently does not depend on Python. +# - I considered writing it in Perl, because it's part of the base +# install just about everywhere, but decided against it because +# I figured everyone else at Datawire would hate that even more +# than Bash. +# - I don't know why I didn't write it in Go. Writing it in Go +# would have made a lot of sense. Rewriting it in Go is an +# option on the table that I don't oppose. +# +# [testbench-matrix]: https://github.com/datawire/testbench/tree/master/testbench/tap/matrix set -euE -o pipefail arg0=${0##*/} diff --git a/write-ifchanged b/bin-sh/write-ifchanged.sh old mode 100755 new mode 100644 similarity index 88% rename from write-ifchanged rename to bin-sh/write-ifchanged.sh index a108b52188..a2e3f24473 --- a/write-ifchanged +++ b/bin-sh/write-ifchanged.sh @@ -22,8 +22,8 @@ cat > "$tmpfile" || exit $? if cmp -s "$tmpfile" "$outfile"; then rm -f "$tmpfile" || : else - if [[ -n "$CI" && -e "$2" ]]; then - echo "error: This should not happen in CI: $2 should not change" >&2 + if [[ -n "$CI" && -e "$outfile" ]]; then + echo "error: This should not happen in CI: ${outfile} should not change" >&2 exit 1 fi mv -f "$tmpfile" "$outfile" diff --git a/build-aux-push b/build-aux-push index 79dc5ecedd..f854245710 100755 --- a/build-aux-push +++ b/build-aux-push @@ -1,7 +1,62 @@ #!/bin/sh set -eux + +# Fetch before the split. +# +# If a `git-subtree-split:` line refers to a commit that we don't have +# locally (because it has been garbage collected, because +# build-aux.git isn't a remote in .git/config), then `git subtree` +# will do the wrong thing (instead of just aborting, because crappy +# error handling), and potentially push proprietary code to +# build-aux.git. So do a fetch first, to guarantee that build-aux +# commits exist locally. +git fetch https://github.com/datawire/build-aux.git + +# Split. origin=$(git remote get-url origin) name=$(printf '%s\n' "$origin" | sed -e 's,\.git/*$,,' -e 's,.*/,,') commit=$(git subtree split --annotate="(${name}) " --prefix=build-aux HEAD) + +# Push the split. git push git@github.com:datawire/build-aux.git "${commit}:master" + +# Rejoin after the split. +# +# If project A does a `build-aux-push` to push some commits to +# build-aux.git, then some other commits go on build-aux.git that touch +# the same parts of the same files, then project A's next +# `build-aux-pull` will result in merge conflicts! Even though it +# should be a fast-forward merge! +# +# This is because git doesn't have the full history to now that it's a +# ff; it lost some intermediate state. +# +# `git subtree split` has a `--rejoin` flag that's designed to fix +# exactly this: +# +# --rejoin +# This option is only valid for the split command. +# +# After splitting, merge the newly created synthetic history +# back into your main project. That way, future splits can +# search only the part of history that has been added since +# the most recent --rejoin. +# +# If your split commits end up merged into the upstream +# subproject, and then you want to get the latest upstream +# version, this will allow git’s merge algorithm to more +# intelligently avoid conflicts (since it knows these +# synthetic commits are already part of the upstream +# repository). +# +# Yay! Except it goes on to say: +# +# If you do all your merges with --squash, don’t use --rejoin +# when you split, because you don’t want the subproject’s +# history to be part of your project anyway. +# +# Boo! We do use `--squash`. The flag isn't quite smart enough to +# automatically do a new `--squash`, so we have to do it ourselves. +# Fortunately, we already have a `build-aux-pull` script that does +# exactly this. "${0%-push}-pull" "$commit" diff --git a/common.mk b/common.mk index 2c6eab713f..7fb27506dc 100644 --- a/common.mk +++ b/common.mk @@ -19,6 +19,9 @@ # - Alias: bin/% -> bin_$(GOHOSTOS)_$(GOHOSTARCH)/% ## common.mk targets ## # (N/A) +# +# Dependencies of `clobber` MUST NOT depend on programs in +# `$(build-aux.bindir)/`. ifeq ($(words $(filter $(abspath $(lastword $(MAKEFILE_LIST))),$(abspath $(MAKEFILE_LIST)))),1) _common.mk := $(lastword $(MAKEFILE_LIST)) include $(dir $(_common.mk))prelude.mk @@ -83,22 +86,22 @@ bin: check: lint build $(MAKE) test-suite.tap.summary -test-suite.tap: - @$(dir $(_common.mk))tap-driver cat $(sort $(filter %.tap,$^)) > $@ +test-suite.tap: $(TAP_DRIVER) + @$(TAP_DRIVER) cat $(sort $(filter %.tap,$^)) > $@ -%.tap.summary: %.tap - @$(dir $(_common.mk))tap-driver summarize $< +%.tap.summary: %.tap $(TAP_DRIVER) + @$(TAP_DRIVER) summarize $< -%.tap: %.tap.gen FORCE - @$(abspath $<) 2>&1 | tee $@ | $(dir $(_common.mk))tap-driver stream -n $< +%.tap: %.tap.gen $(TAP_DRIVER) FORCE + @$(abspath $<) 2>&1 | tee $@ | $(TAP_DRIVER) stream -n $< %.log: %.test FORCE @$(abspath $<) >$@ 2>&1; echo :exit-status: $$? >>$@ -%.tap: %.log %.test +%.tap: %.log %.test $(TAP_DRIVER) @{ \ printf '%s\n' 'TAP version 13' '1..1' && \ sed 's/^/#/' < $< && \ sed -n '$${ s/^:exit-status: 0$$/ok 1/; s/^:exit-status: 77$$/ok 1 # SKIP/; s/^:exit-status: .*/not ok 1/; p; }' < $<; \ - } | tee $@ | $(dir $(_common.mk))tap-driver stream -n $*.test + } | tee $@ | $(TAP_DRIVER) stream -n $*.test # # Configure how Make works diff --git a/docker.mk b/docker.mk index 1cfac74cad..771807c630 100644 --- a/docker.mk +++ b/docker.mk @@ -143,7 +143,7 @@ _docker.port-forward = $(dir $(_docker.mk))docker-port-forward # %.docker.knaut-push file contents: # # line 1: in-cluster tag name (hash-based) -%.docker.knaut-push: %.docker $(KUBEAPPLY) $(KUBECONFIG) +%.docker.knaut-push: %.docker $(KUBEAPPLY) $(FLOCK) $(KUBECONFIG) # the FLOCK for KUBEAPPLY is to work around https://github.com/datawire/teleproxy/issues/77 DOCKER_K8S_ENABLE_PVC=$(DOCKER_K8S_ENABLE_PVC) $(FLOCK) $(_docker.port-forward).lock $(KUBEAPPLY) -f $(dir $(_docker.mk))docker-registry.yaml { \ @@ -158,7 +158,7 @@ _docker.port-forward = $(dir $(_docker.mk))docker-port-forward docker push '$(DOCKER_IMAGE)' .PHONY: %.docker.push -_clean-docker: +_clean-docker: $(FLOCK) $(FLOCK) $(_docker.port-forward).lock rm $(_docker.port-forward).lock rm -f $(_docker.port-forward).log rm -f $(dir $(_docker.mk))docker-registry.yaml.o diff --git a/docs/conventions.md b/docs/conventions.md new file mode 100644 index 0000000000..19e847f5b2 --- /dev/null +++ b/docs/conventions.md @@ -0,0 +1,89 @@ +# Conventions for use in build-aux + +Each `.mk` snippet starts with a reference header-comment of the +format: + + ```make + # Copyright statement. + # + # A sentence or two introducing what this file does. + # + ## Section heading ## + # - type: item + # - type: item + ## Section heading ## + # - item + # - item + # + # High-level prose documentation. + ``` + +Always include (at a minimum) these 4 sections, even if their content +is `(none)`: + + - `## Eager inputs ##` (mostly variables) Eager-evaluated inputs that + need to be defined *before* loading the snippet + - `## Lazy inputs ##` (mostly variables) Lazy-evaluated inputs can be + defined before *or* after loading the snippet + - `## Outputs ##` (targets, variables, et c.) + - `## common.mk targets ##` + +If there are which targets from snippets other than `common.mk` that +it hooks in to, a section for each of those snippets should exist too. + +The most common reason for an input to be eager is if it is listed as +a dependency of a target defined in the `.mk` file. + +Bullet points under "Eager inputs", "Lazy inputs", or "Outputs" should +be of the format "Type: thing [extra info]", optionally with the ":" +aligned between rows. Types currently used are: + + - `Target(s)` (only for use as an output): Indicates that the snippet + defines rules to create the specified file(s). Prefer to list each + target separately; only use the plural `Targets` when listing an + expression that govers a large range of actual files. + - `.PHONY Target(s)` (only for use as an output): Like `Target`, but + is declared as `.PHONY`; a file with that name is never actually + created. + - `File` (only for use as an input): Indicates that this file is + parsed by the Makefile snippet. Note that it should not be a file + described by a Target, since it needs to be there at + Makefile-parse-time. + - `Variable`: The meaning is obvious. + * For inputs: If there is a default value, the listing should + include `?= value` for a possibly pseudo-code or comment `value` + documenting what the default value is. + * For outputs: The listing should include `= value` or `?= value` + for a possibly pseudo-code or comment `value` documenting what + the variable is set to contain. The `=` should be `?=` as + appropriate, to document whether it can be overridden by the + caller/user. + * If a `?=` variable is listed in "Outputs", consider also listing + it in "inputs"; if an input gets a default value set, consider + also listing it in "Outputs". + - `NAME` in `go-mod.mk`. It isn't listed as an an input, because + it isn't one "in spirit". + - `KUBECONFIG` in `kubernaut-ui.mk` is ":=", but it is listed as + an input anyway; it's one "in spirit"; it's just that it must + be overridden more forcefully than with an environment + variable. + - "Executables" (below) are set with `?=`, but don't list them as + "inputs". + - `Function`: (only for use as an output) This is a special case of a + Variable that defines a function to be called with `$(call + funcname,args)`. Should not be listed as an input; if you depend + on a function, just go ahead and include the snippet that defines + it. + - `Executable` (only for use as an output): An "Executable" output is + a special-case of both a "Target" output and a "Variable" + input/output. An "Executable" output has the following attributes: + * It is exposed as a variable that stores an absolute path to an + executable file (this makes it safe to list as a dependency). + * That variable can be overridden using an environment variable + (that is: it is set with `?=`). + * It is NOT guaranteed to already exist (you may need to depend on + it), but a rule to create it is guaranteed be there it it doesn't + already exist. + * Overriding it using an environment variable will not affect the + rule to create the standard version, or cleanup rules to remove + it; those targets do not obey the environment variable. diff --git a/docs/intro.md b/docs/intro.md index 49b26055f5..19ea8aed32 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -10,15 +10,25 @@ include simply by writing `include build-aux/NAME.mk` in your Each `.mk` snippet starts with a reference header-comment identifying: - - any inputs (mostly variables) + - any eager-evaluated inputs (mostly variables) + - any lazy-evaluated inputs (mostly variables) - any outputs (targets, variables) - which targets from other snippets it hooks in to (mostly hooking in to `common.mk` targets) -You don't need to worry about dependencies between `.mk` files; each -file will automatically `include` the others it depends on. You don't -need to worry about including a file twice; this is safe, as they all -have C-header-style include guards. +Eager inputs need to be defined *before* loading the snippet; lazy +inputs can be defined later. See [`conventions.mk`][./conventions.md] +for more information on the reference header-comment. + +For the most part, you don't need to worry about dependencies between +`.mk` files; each file will automatically `include` the others it +depends on. However, if you would like to use an output from one +snippet as an eager input to another, then you do need to worry about +include order; if you would like to use `kubernaut-ui.mk` to set +`KUBECONFIG` for `teleproxy.mk`, then you will need to make sure you +include `kubernaut-ui.mk` *before* you include `teleproxy.mk`. You +don't need to worry about including a file twice; this is safe, as +they all have C-header-style include guards. ## `common.mk` diff --git a/docs/testing.md b/docs/testing.md index 50f82f38fd..abfbbeebf6 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -86,13 +86,13 @@ directory, you could write: ## Adding your own test runners To add a new test runner, you just need a command that emits TAP: -`tee` it to a `.tap` file, and pipe that to `build-aux/tap-driver -stream -n TEST_GROUP_NAME` to pretty-print the results as they happen: +`tee` it to a `.tap` file, and pipe that to `$(TAP_DRIVER) stream -n +TEST_GROUP_NAME` to pretty-print the results as they happen: # Tell Make how to run the test command, and stream the results to - # `tap-driver stream` to pretty-print the results as they happen. - my-test.tap: my-test.input FORCE - @SOME_COMMAND_THAT_EMITS_TAP 2>&1 | tee $@ | build-aux/tap-driver stream -n my-test + # `$(TAP_DRIVER) stream` to pretty-print the results as they happen. + my-test.tap: my-test.input $(TAP_DRIVER) FORCE + @SOME_COMMAND_THAT_EMITS_TAP 2>&1 | tee $@ | $(TAP_DRIVER) stream -n my-test # Tell Make to include 'my-test' in `make check` test-suite.tap: my-test.tap @@ -100,8 +100,8 @@ stream -n TEST_GROUP_NAME` to pretty-print the results as they happen: For example, to use [BATS (Bash Automated Testing System)][BATS], you would write: - %.tap: %.bats FORCE - @bats --tap $< | tee $@ | build-aux/tap-driver stream -n $< + %.tap: %.bats $(TAP_DRIVER) FORCE + @bats --tap $< | tee $@ | $(TAP_DRIVER) stream -n $< # Automatically include `./tests/*.bats` test-suite.tap: $(patsubst %.bats,%.tap,$(wildcard tests/*.bats)) diff --git a/flock b/flock deleted file mode 100755 index f4ec7f7eab..0000000000 --- a/flock +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# Copyright 2018 Datawire. All rights reserved. -# -# Wrapper around `go run ./flock.go` to set GO111MODULe appropriately. - -lockfile=$1 -shift -GO111MODULE=off go run "$0.go" "$lockfile" env GO111MODULE="${GO111MODULE}" "$@" diff --git a/go-mod.mk b/go-mod.mk index 789b204484..8bbf72f901 100644 --- a/go-mod.mk +++ b/go-mod.mk @@ -10,15 +10,19 @@ ## Lazy inputs ## # - Variable: go.GOBUILD ?= go build # - Variable: go.LDFLAGS ?= -# - Variable: go.GOLANG_LINT_VERSION ?= … # - Variable: go.GOLANG_LINT_FLAGS ?= …$(wildcard .golangci.yml .golangci.toml .golangci.json)… # - Variable: CI ?= # ## Outputs ## +# - Executable: GOTEST2TAP ?= $(CURDIR)/build-aux/bin/gotest2tap +# - Executable: GOLANGCI_LINT ?= $(CURDIR)/build-aux/bin/golangci-lint +# # - Variable: export GO111MODULE = on # - Variable: NAME ?= $(notdir $(go.module)) # # - Variable: go.goversion = $(patsubst go%,%,$(filter go1%,$(shell go version))) +# - Variable: go.lock = $(FLOCK) # if nescessary, in dependencies +# - or = $(FLOCK) $(GOPATH)/pkg/mod # if nescessary, in recipes # - Variable: go.module = EXAMPLE.COM/YOU/YOURREPO # - Variable: go.bins = List of "main" Go packages # - Variable: go.pkgs ?= ./... @@ -52,16 +56,11 @@ include $(dir $(_go-mod.mk))common.mk # # Configure the `go` command -go.goversion = $(call lazyonce,go.goversion,$(patsubst go%,%,$(filter go1%,$(shell go version)))) +go.goversion = $(_prelude.go.goversion) +go.lock = $(_prelude.go.lock) export GO111MODULE = on -# Disable parallel builds on Go 1.11; the module cache is not -# concurrency-safe. This is fixed in 1.12. -ifneq ($(filter 1.11.%,$(go.goversion)),) -.NOTPARALLEL: -endif - # # Set default values for input variables @@ -69,13 +68,15 @@ go.GOBUILD ?= go build go.DISABLE_GO_TEST ?= go.LDFLAGS ?= go.PLATFORMS ?= $(GOOS)_$(GOARCH) -go.GOLANG_LINT_VERSION ?= 1.17.1 go.GOLANG_LINT_FLAGS ?= $(if $(wildcard .golangci.yml .golangci.toml .golangci.json),,--disable-all --enable=gofmt --enable=govet) CI ?= # # Set output variables and functions +GOTEST2TAP ?= $(build-aux.bindir)/gotest2tap +GOLANGCI_LINT ?= $(build-aux.bindir)/golangci-lint + NAME ?= $(notdir $(go.module)) go.module := $(shell GO111MODULE=on go mod edit -json | jq -r .Module.Path) @@ -106,52 +107,51 @@ go.pkgs ?= ./... # Rules go-get: ## (Go) Download Go dependencies - go mod download +go-get: $(go.lock) + $(go.lock)go mod download .PHONY: go-get vendor: go-get FORCE - go mod vendor +vendor: $(go.lock) + $(go.lock)go mod vendor @test -d $@ -vendor.hash: vendor - find vendor -type f -exec sha256sum {} + | sort | sha256sum | $(WRITE_IFCHANGED) $@ $(dir $(_go-mod.mk))go1%.src.tar.gz: curl -o $@ --fail https://dl.google.com/go/$(@F) +_go.mkopensource = $(build-aux.bindir)/go-mkopensource + # Usage: $(eval $(call go.bin.rule,BINNAME,GOPACKAGE)) define go.bin.rule -bin_%/$1: go-get FORCE - $$(go.GOBUILD) $$(if $$(go.LDFLAGS),--ldflags $$(call quote.shell,$$(go.LDFLAGS))) -o $$(@D)/.cache.$$(@F) $2 - go list -deps -f='{{.Module}}' $2 | LC_COLLATE=C sort -u | $$(WRITE_IFCHANGED) $$(@D)/.deps.$$(@F) - $$(COPY_IFCHANGED) $$(@D)/.cache.$$(@F) $$@ - -bin_%/$1.opensource.tar.gz: bin_%/$1 vendor.hash $$(dir $$(_go-mod.mk))go-opensource $$(dir $$(_go-mod.mk))go$$(go.goversion).src.tar.gz - $$(if $$(CI),@set -e; if test -e $$@; then echo 'This should not happen in CI: $$@ rebuild triggered by $$+' >&2; false; fi) - $$(dir $$(_go-mod.mk))go-opensource --output=$$@ --package=$2 --depsfile=$$(&1 | GO111MODULE=off go run $(dir $(_go-mod.mk))gotest2tap.go | tee $@ | $(dir $(_go-mod.mk))tap-driver stream -n go-test +$(dir $(_go-mod.mk))go-test.tap: $(GOTEST2TAP) $(TAP_DRIVER) $(go.lock) FORCE + @$(go.lock)go test -json $(go.pkgs) 2>&1 | $(GOTEST2TAP) | tee $@ | $(TAP_DRIVER) stream -n go-test + +# +# go-doc + +go-doc: ## (Go) Run a `godoc -http` server +go-doc: $(dir $(_go-mod.mk))gopath + { \ + while sleep 1; do \ + $(MAKE) --quiet $(dir $(_go-mod.mk))gopath/src/$(go.module); \ + done & \ + trap "kill $$!" EXIT; \ + GOPATH=$(dir $(_go-mod.mk))gopath godoc -http :8080; \ + } +.PHONY: go-doc + +$(dir $(_go-mod.mk))gopath: FORCE vendor + mkdir -p $(dir $(_go-mod.mk))gopath/src + echo 'module bogus' > $(dir $(_go-mod.mk))gopath/go.mod + rsync --archive --delete vendor/ $(dir $(_go-mod.mk))gopath/src/ + $(MAKE) $(dir $(_go-mod.mk))gopath/src/$(go.module) +$(dir $(_go-mod.mk))gopath/src/$(go.module): $(go.lock) FORCE + mkdir -p $@ + $(go.lock)go list ./... | sed -e 's,^$(go.module),,' -e 's,$$,/*.go,' | rsync --archive --prune-empty-dirs --delete-excluded --include='*/' --include-from=/dev/stdin --exclude='*' ./ $@/ # # Hook in to common.mk @@ -173,19 +196,22 @@ test-suite.tap: $(if $(go.DISABLE_GO_TEST),,$(dir $(_go-mod.mk))go-test.tap) clean: _go-clean _go-clean: - rm -f $(dir $(_go-mod.mk))go-test.tap vendor.hash - rm -rf vendor/ + rm -f $(dir $(_go-mod.mk))go-test.tap + rm -rf $(dir $(_go-mod.mk))gopath/ vendor/ # Files made by older versions. Remove the tail of this list when the # commit making the change gets far enough in to the past. # +# 2018-07-03 + rm -f vendor.hash +# 2018-07-01 + rm -f $(dir $(_go-mod.mk))golangci-lint # 2019-02-06 rm -f $(dir $(_go-mod.mk))patter.go $(dir $(_go-mod.mk))patter.go.tmp .PHONY: _go-clean clobber: _go-clobber _go-clobber: - rm -f $(dir $(_go-mod.mk))golangci-lint $(dir $(_go-mod.mk))go1*.src.tar.gz + rm -f $(dir $(_go-mod.mk))go1*.src.tar.gz .PHONY: _go-clobber -# endif diff --git a/go-opensource b/go-opensource deleted file mode 100755 index ca0bc0b8a7..0000000000 --- a/go-opensource +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env bash -set -euE -o pipefail -shopt -s nullglob -PATH="/usr/local/opt/gnu-getopt/bin:$PATH" - -dirfor_std() { - (( $# == 0 )) - mkdir "$destdir/std" - tar xfO "$arg_gotar" go/LICENSE > "$destdir/std/LICENSE" -} - -dirfor_module() { - (( $# == 1 )) - local modname="$1" - mkdir -p "$destdir/$modname" - local license=( - "vendor/$modname"/LICENSE* - "vendor/$modname"/license* - "vendor/$modname"/COPYING* - "vendor/$modname"/copying* - ) - case ${#license[@]} in - 0) echo "ERROR: $modname has no LICENSE file" >&2; false;; - 1) :;; - *) echo "WARNING: $modname: found ${#license[@]} LICENSE files, heuristics more likely to be wrong" >&2;; - esac - if [[ "$(head -n1 "${license[0]}")" == "Mozilla Public License, version 2.0" ]]; then - # Copyleft - rmdir "$destdir/$modname" - cp -a "vendor/$modname" "$destdir/$modname" - else - # Permissive - local extrafiles=( - "vendor/$modname"/NOTICE* # required for Apache 2.0 compliance - "vendor/$modname"/PATENT* # for BSD and MIT, which do not include a patent grant - ) - cp "${license[@]}" ${extrafiles:+"${extrafiles[@]}"} "$destdir/$modname" - fi -} - -main() { - local argstr - argstr=$(getopt -n "${0##*/}" -o '' -l 'output:,gotar:,package:,depsfile:' -- "$@") - eval "set -- $argstr" - local arg_output arg_gotar arg_package arg_depsfile - while (( $# > 0 )); do - case "$1" in - --output) arg_output=$2;; - --gotar) arg_gotar=$2;; - --package) arg_package=$2;; - --depsfile) arg_depsfile=$2;; - --) shift 1; break;; - esac - shift 2 - done - (( $# == 0 )) - [[ "$arg_output" == *.tar.gz ]] - [[ "${arg_gotar##*/}" == go1.*.tar.gz ]] - [[ -f "$arg_gotar" ]] - [[ -n "$arg_package" ]] - local gopkg gomod - gopkg=$(go list "$arg_package") - gomod=$(go list -f='{{.Module}}' "$gopkg") - - tmpdir=$(mktemp -dt "${0##*/}.XXXXXXXXXX") - trap 'rm -rf "$tmpdir"' EXIT - local destdir="${tmpdir}/${gopkg##*/}.opensource" - mkdir "$destdir" - - { - fmt <<<"The program \"${gopkg##*/}\" incorporates the following Free and Open Source software:" - echo - { - if [[ -z "$arg_depsfile" ]]; then - go list -deps -f='{{.Module}}' "$gopkg" | sort -u - else - cat "$arg_depsfile" - fi - } | { - echo 'Name|Version' - echo '----|-------' - while read -r dep_modname dep_version; do - # Inspect the dep string and set variables, but don't actually do anything yet - dep_prettyname= - dep_vcsname= - case "$dep_modname" in - "$gomod"|'github.com/datawire/liboauth2'|'github.com/datawire/teleproxy') - continue - ;; - '') - dep_modname='std' - dep_prettyname='the Go language standard library ("std")' - dep_version=$(tar xfO "$arg_gotar" go/VERSION | sed 's/^go/v/') - ;; - *) - if [[ "$dep_version" == *'=>'* ]]; then - read -r -a _replacement <<<"${dep_version##* => }" - case ${#_replacement[@]} in - 1) - dep_version='(modified)' - ;; - 2) - if [[ "${_replacement[0]}" != "${dep_modname}" ]]; then - dep_prettyname="${_replacement[0]} (modified from ${dep_modname})" - fi - dep_version=${_replacement[1]} - ;; - *) - echo "ERROR: invalid version replacement: ${dep_version}" >&2 - false - ;; - esac - fi - ;; - esac - # Now take action based on those variables - case "$dep_modname" in - std) dirfor_std;; - *) dirfor_module "$dep_modname";; - esac - printf '%s|%s\n' "${dep_prettyname:-${dep_modname}}" "${dep_version}" - done - } | { - column -s'|' -t | sed 's/^/ /' - } - echo - fmt <<<'The appropriate license notices and source code are in correspondingly named directories.' - } > "$destdir/OPENSOURCE.md" - tar -cz -f "$arg_output" -C "$tmpdir" "${destdir##*/}" -} - -main "$@" diff --git a/go.mod b/go.mod new file mode 100644 index 0000000000..66b42c8f79 --- /dev/null +++ b/go.mod @@ -0,0 +1,16 @@ +module github.com/datawire/build-aux + +go 1.12 + +require ( + github.com/datawire/teleproxy v0.0.0-00010101000000-000000000000 // indirect + github.com/golangci/golangci-lint v0.0.0-00010101000000-000000000000 // indirect + github.com/pkg/errors v0.8.1 + github.com/spf13/pflag v1.0.3 +) + +// Pin versions of external commands +replace ( + github.com/datawire/teleproxy => github.com/datawire/teleproxy v0.3.16 + github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v1.17.1 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000000..765ec9d98e --- /dev/null +++ b/go.sum @@ -0,0 +1,411 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.35.1 h1:LMe/Btq0Eijsc97JyBwMc0KMXOe0orqAMdg7/EkywN8= +cloud.google.com/go v0.35.1/go.mod h1:wfjPZNvXCBYESy3fIynybskMP48KVPrjSPCnXiK7Prg= +contrib.go.opencensus.io/exporter/ocagent v0.4.3 h1:QjNm697iO7CZ09IxxSiCUzOhALENIsLsixdPwjV1yGs= +contrib.go.opencensus.io/exporter/ocagent v0.4.3/go.mod h1:YuG83h+XWwqWjvCqn7vK4KSyLKhThY3+gNGQ37iS2V0= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= +dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= +dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.apache.org/thrift.git v0.0.0-20181218151757-9b75e4fe745a/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.lukeshu.com/go/libsystemd v0.0.0-20181219160046-e05011ef37a6 h1:RIKACBk97cDZjLb9ye3DUhB0qXi/PlZeeARNvt+dutw= +git.lukeshu.com/go/libsystemd v0.0.0-20181219160046-e05011ef37a6/go.mod h1:ClDr3zlU9uyEWaIRc/L5ybH6W2YHUy9LtiU7+FEOTis= +github.com/Azure/go-autorest v11.3.2+incompatible h1:2bRmoaLvtIXW5uWpZVoIkc0C1z7c84rVGnP+3mpyCRg= +github.com/Azure/go-autorest v11.3.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/sprig v2.17.1+incompatible h1:PChbxFGKTWsg9IWh+pSZRCSj3zQkVpL6Hd9uWsFwxtc= +github.com/Masterminds/sprig v2.17.1+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/OpenPeeDeeP/depguard v0.0.0-20180806142446-a69c782687b2 h1:HTOmFEEYrWi4MW5ZKUx6xfeyM10Sx3kQF65xiQJMPYA= +github.com/OpenPeeDeeP/depguard v0.0.0-20180806142446-a69c782687b2/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/aokoli/goutils v1.1.0 h1:jy4ghdcYvs5EIoGssZNslIASX5m+KNMfyyKvRQ0TEVE= +github.com/aokoli/goutils v1.1.0/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/census-instrumentation/opencensus-proto v0.1.0-0.20181214143942-ba49f56771b8/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.1.0 h1:VwZ9smxzX8u14/125wHIX7ARV+YhR+L4JADswwxWK0Y= +github.com/census-instrumentation/opencensus-proto v0.1.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/datawire/pf v0.0.0-20180510150411-31a823f9495a/go.mod h1:H8uUmE8qqo7z9u30MYB9riLyRckPHOPBk9ZdCuH+dQQ= +github.com/datawire/teleproxy v0.3.16 h1:H9bXuDlyBQs0UR9RjOlKMFUYHTnswS4yyegVKn3LxkA= +github.com/datawire/teleproxy v0.3.16/go.mod h1:EbUA710RQ3uxRViAj9F6TC6O1wKhX4oLYamKifKbdzM= +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/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/fatih/color v1.6.0 h1:66qjqZk8kalYAvDRtM1AdAJQI0tj4Wrue3Eq3B3pmFU= +github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-critic/go-critic v0.0.0-20181204210945-1df300866540 h1:7CU1IXBpPvxpQ/NqJrpuMXMHAw+FB2vfqtRF8tgW9fw= +github.com/go-critic/go-critic v0.0.0-20181204210945-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= +github.com/go-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0 h1:zKymWyA1TRYvqYrYDrfEMZULyrhcnGY3x7LDKU2XQaA= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181003203344-ef45e06d44b6 h1:i2jIkQFb8RG45DuQs+ElyROY848cSJIoIkBM+7XXypA= +github.com/golangci/errcheck v0.0.0-20181003203344-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/go-tools v0.0.0-20180109140146-af6baa5dc196 h1:9rtVlONXLF1rJZzvLt4tfOXtnAFUEhxCJ64Ibzj6ECo= +github.com/golangci/go-tools v0.0.0-20180109140146-af6baa5dc196/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee h1:J2XAy40+7yz70uaOiMbNnluTg7gyQhtGqLQncQh+4J8= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20181105071733-0b8337e80d98 h1:ir6/L2ZOJfFrJlOTsuf/hlzdPuUwXV/VzkSlgS6f1vs= +github.com/golangci/gofmt v0.0.0-20181105071733-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.17.1 h1:lc8Hf9GPCjIr0hg3S/xhvFT1+Hydass8F1xchr8jkME= +github.com/golangci/golangci-lint v1.17.1/go.mod h1:+5sJSl2h3aly+fpmL2meSP8CaSKua2E4Twi9LPy7b1g= +github.com/golangci/gosec v0.0.0-20180901114220-66fb7fc33547 h1:qMomh8bv+kDazm1dSLZ9S3zZ2PJZMHL4ilfBjxFOlmI= +github.com/golangci/gosec v0.0.0-20180901114220-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU= +github.com/golangci/ineffassign v0.0.0-20180808204949-42439a7714cc h1:XRFao922N8F3EcIXBSNX8Iywk+GI0dxD/8FicMX2D/c= +github.com/golangci/ineffassign v0.0.0-20180808204949-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20180610141402-ee948d087217 h1:r7vyX+SN24x6+5AnpnrRn/bdwBb7U+McZqCHOVtXDuk= +github.com/golangci/lint-1 v0.0.0-20180610141402-ee948d087217/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw= +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-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/uuid v1.1.0 h1:Jf4mxPC/ziBnoPIdpQdPJ9OeiomAUHLvxmPRSPH9m4s= +github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= +github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g= +github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.0.0-20190125124242-bb1ef8ce758c h1:TUSDjXmBQ+GOJPbqKIu59CU2Jx+oaiHFchjsqj0fu9Q= +github.com/gophercloud/gophercloud v0.0.0-20190125124242-bb1ef8ce758c/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3 h1:JVnpOZS+qxli+rgVl98ILOXVNbW+kb5wcxeGx8ShUIw= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f h1:ShTPMJQes6tubcjzGMODIVG5hlrCeImaBnZzKF2N8SM= +github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce h1:xdsDDbiBDQTKASoGEZ+pEmF1OnWuu8AQ9I8iNbHNeno= +github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.2.0 h1:yPeWdRnmynF7p+lLYz0H2tthW9lqhMJrQV/U7yy4wX0= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= +github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +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/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/magiconair/properties v1.7.6 h1:U+1DqNen04MdEPgFiIwdOUiqZ8qPa37xgogX/sd3+54= +github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/miekg/dns v1.1.3 h1:1g0r1IvskvgL8rR+AcHzUA+oFmGcQlaIm4IqakufeMM= +github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663 h1:Ri1EhipkbhWsffPJ3IPlrb4SkTOPa2PfRXp3jchBczw= +github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/pelletier/go-toml v1.1.0 h1:cmiOvKzEunMsAxyhXSzpL5Q1CRKpVv0KQsnAIcSEVYM= +github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181218105931-67670fe90761/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= +github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= +github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= +github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= +github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= +github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= +github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= +github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= +github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= +github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= +github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= +github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= +github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= +github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= +github.com/sirupsen/logrus v1.0.5 h1:8c8b5uO0zS4X6RPl/sd1ENwSkIc0/H2PaHxE3udaE8I= +github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= +github.com/spf13/afero v1.1.0 h1:bopulORc2JeYaxfHLvJa5NzxviA9PoWhpiiJkru7Ji4= +github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg= +github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec h1:2ZXvIUGghLpdTVHR1UfvfrzoVlZaE/yOWC5LueIHZig= +github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.0.2 h1:Ncr3ZIuJn322w2k1qmzXDnkLAdQMlJqBa9kfAH+irso= +github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +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/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/timakin/bodyclose v0.0.0-20190407043127-4a873e97b2bb h1:lI9ufgFfvuqRctP9Ny8lDDLbSWCMxBPletcSqrnyFYM= +github.com/timakin/bodyclose v0.0.0-20190407043127-4a873e97b2bb/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.18.1-0.20181204023538-aab39bd6a98b/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.19.0 h1:+jrnNy8MR4GZXvwF9PEuSyHxA4NaTf6601oNRwCSXq0= +go.opencensus.io v0.19.0/go.mod h1:AYeH0+ZxYyghG8diqaaIq/9P3VgCCt5GF2ldCY4dkFg= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/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-20190313024323-a1f597ede03a h1:YX8ljsm6wXlHZO+aRz9Exqr0evNhKRNe5K/gi+zKh4U= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181217023233-e147a9138326/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/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-20190313220215-9f648a60d977 h1:actzWV6iWn3GLqN8dZjzsB+CLt+gaV2+wsxroxiQI8I= +golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190115181402-5dab4167f31c h1:pcBdqVcrlT+A3i+tWsOROFONQyey9tisIQHI4xqVGLg= +golang.org/x/oauth2 v0.0.0-20190115181402-5dab4167f31c/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/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-20190312061237-fead79001313 h1:pczuHS43Cp2ktBEEmLwScxgjWsBSzdaQiKzUyf3DTTc= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd h1:7E3PabyysDSEjnaANKBgums/hyvMI/HoHQ50qZEzTrg= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.1.0 h1:K6z2u68e86TPdSdefXdzvXgR1zEMa+459vBSfWYAZkI= +google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190122154452-ba6ebe99b011/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190123001331-8819c946db44 h1:9u28q5XSBq/QWKRyrhsE2pOAKf+5fR68Vj5prhzqUYY= +google.golang.org/genproto v0.0.0-20190123001331-8819c946db44/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.15.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.18.0 h1:IZl7mfBGfbhYx2p2rKRtYgDFw6SBz+kclmxYrCksPPA= +google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/api v0.0.0-20181221193117-173ce66c1e39 h1:iGq7zEPXFb0IeXAQK5RiYT1SVKX/af9F9Wv0M+yudPY= +k8s.io/api v0.0.0-20181221193117-173ce66c1e39/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/apimachinery v0.0.0-20190119020841-d41becfba9ee h1:3MH/wGFP+9PjyLIMnPN2GYatdJosd+5TnSO2BzQqqo4= +k8s.io/apimachinery v0.0.0-20190119020841-d41becfba9ee/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/client-go v10.0.0+incompatible h1:F1IqCqw7oMBzDkqlcBymRq1450wD0eNqLE9jzUrIi34= +k8s.io/client-go v10.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/klog v0.1.0 h1:I5HMfc/DtuVaGR1KPwUrTc476K8NCqNBldC7H4dYEzk= +k8s.io/klog v0.1.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190124213536-fbb59629db34 h1:B1LAOfRqg2QUyCdzfjf46quTSYUTAK5OCwbh6pljHbM= +mvdan.cc/unparam v0.0.0-20190124213536-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY= +sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/help.mk b/help.mk index ee5043fe2f..42b4feae46 100644 --- a/help.mk +++ b/help.mk @@ -66,6 +66,44 @@ _help.genbody = $(if $2,$(call _help.genbody,$1$(if $(and $1,$(call _help.genbod help.body.vars = NAME VERSION KUBECONFIG help.body ?= $(call _help.genbody,,$(help.body.vars)) +# If a target doesn't specify a category name, then we use $(NAME) as +# the category name. We used to use "-", but the en_US.UTF-8 locale +# ignores non-letter characters. So showing "-" in the category +# column for non-categorized targets meant that `sort` would be +# looking at the second column for those rows, which would, +# potentially split the non-categorized targets: +# +# TARGETS: +# - check-e2e Check: oauth e2e tests +# - check-intercept Check: apictl traffic intercept +# (Common) build Build the software +# (Common) check Check whether the software works; run the tests +# (Common) clean Delete all files that are normally created by building the software +# (Common) clobber Delete all files that this Makefile can re-generate +# (Common) format Apply automatic formatting+cleanup to source code +# (Common) help Show this message +# (Common) lint Perform static analysis of the software +# (Go) go-fmt Fixup the code with `go fmt` +# (Go) go-get Download Go dependencies +# (Go) go-lint Check the code with `golangci-lint` +# (Go) go-test Check the code with `go test` +# (Kubernaut) apply Apply YAML to the cluster, WITHOUT pushing newer Docker images +# (Kubernaut) claim Obtain an ephemeral cluster from kubernaut.io +# (Kubernaut) deploy Apply YAML to the cluster, pushing newer Docker images +# (Kubernaut) proxy Launch teleproxy in the background +# (Kubernaut) push Push Docker images to the cluster +# (Kubernaut) shell Run an interactive Bash shell with KUBECONFIG= set to the Kubernaut claim +# (Kubernaut) unclaim Destroy the cluster +# (Kubernaut) unproxy Shut down 'proxy' +# - release-bin Upload binaries to S3 +# - release Cut a release; upload binaries to S3 and Docker images to Quay +# - release-docker Upload Docker images to Quay +# +# Using $(NAME) (falling back to "this project", since `help.mk` +# doesn't assume you set NAME) as the default category name solves +# this, and makes it clear what no-category means (since all +# build-aux.git targets now declare a category). + help: ## (Common) Show this message @echo 'Usage: make [TARGETS...]' @echo diff --git a/kubeapply.mk b/kubeapply.mk index 539052bb5b..c524ef5917 100644 --- a/kubeapply.mk +++ b/kubeapply.mk @@ -3,28 +3,26 @@ # Makefile snippet for installing `kubeapply` # ## Eager inputs ## -# - Variable: KUBEAPPLY ?= ./build-aux/kubeapply +# (none) ## Lazy inputs ## # (none) ## Outputs ## -# - Variable: KUBEAPPLY ?= ./build-aux/kubeapply -# - Target: $(KUBEAPPLY) -## common.mk targets ## -# - clobber +# - Executable: KUBEAPPLY ?= $(CURDIR)/build-aux/bin/kubeapply ifeq ($(words $(filter $(abspath $(lastword $(MAKEFILE_LIST))),$(abspath $(MAKEFILE_LIST)))),1) _kubeapply.mk := $(lastword $(MAKEFILE_LIST)) -include $(dir $(lastword $(MAKEFILE_LIST)))prelude.mk - -KUBEAPPLY ?= $(dir $(_kubeapply.mk))kubeapply -KUBEAPPLY_VERSION = 0.3.11 +include $(dir $(_kubeapply.mk))prelude.mk -$(KUBEAPPLY): $(_kubeapply.mk) - curl -o $@ --fail https://s3.amazonaws.com/datawire-static-files/kubeapply/$(KUBEAPPLY_VERSION)/$(GOHOSTOS)/$(GOHOSTARCH)/kubeapply - chmod go-w,a+x $@ +KUBEAPPLY ?= $(build-aux.bindir)/kubeapply +$(build-aux.bindir)/kubeapply: $(build-aux.dir)/go.mod $(_prelude.go.lock) | $(build-aux.bindir) + $(build-aux.go-build) -o $@ github.com/datawire/teleproxy/cmd/kubeapply -clobber: _clobber-kubeapply -_clobber-kubeapply: - rm -f $(KUBEAPPLY) -.PHONY: _clobber-kubeapply +clean: _clean-kubeapply +_clean-kubeapply: +# Files made by older versions. Remove the tail of this list when the +# commit making the change gets far enough in to the past. +# +# 2018-07-01 + rm -f $(dir $(_kubeapply.mk))kubeapply +.PHONY: _clean-kubeapply endif diff --git a/kubernaut.mk b/kubernaut.mk index abc3b564c6..0b1689402b 100644 --- a/kubernaut.mk +++ b/kubernaut.mk @@ -5,13 +5,12 @@ ## Eager inputs ## # (none) ## Lazy inputs ## -# - Variable: GUBERNAUT ?= go run …/gubernaut.go +# (none) ## Outputs ## # - Target : `%.knaut` # - .PHONY Target: `%.knaut.clean` -# - Variable: GUBERNAUT ?= go run …/gubernaut.go ## common.mk targets ## -# - clobber +# - clean # # Creating the NAME.knaut creates the Kubernaut claim. The file may # be used as a KUBECONFIG file. @@ -19,9 +18,6 @@ # Calling the NAME.knaut.clean file releases the claim, and removes # the NAME.knaut file. # -# The GUBERNAUT variable may be used to adjust the gubernaut command -# called; by default it looks up 'gubernaut' in $PATH. -# ## Quickstart ## # # 1. Put this file in your source tree and include it from your @@ -50,20 +46,21 @@ # ifeq ($(words $(filter $(abspath $(lastword $(MAKEFILE_LIST))),$(abspath $(MAKEFILE_LIST)))),1) _kubernaut.mk := $(lastword $(MAKEFILE_LIST)) +include $(dir $(_kubernaut.mk))prelude.mk -GUBERNAUT = GO111MODULE=off go run $(dir $(_kubernaut.mk))gubernaut.go +GUBERNAUT ?= $(build-aux.bindir)/gubernaut %.knaut.claim: echo $(*F)-$${USER}-$$(uuidgen) > $@ -%.knaut: %.knaut.claim +%.knaut: %.knaut.claim $(GUBERNAUT) $(GUBERNAUT) -release $$(cat $<) $(GUBERNAUT) -claim $$(cat $<) -output $@ -%.knaut.clean: +%.knaut.clean: $(GUBERNAUT) if [ -e $*.knaut.claim ]; then $(GUBERNAUT) -release $$(cat $*.knaut.claim); fi rm -f $*.knaut $*.knaut.claim .PHONY: %.knaut.clean -clobber: $(addsuffix .clean,$(wildcard *.knaut)) +clean: $(addsuffix .clean,$(wildcard *.knaut) $(wildcard $(build-aux.dir)/*.knaut)) endif diff --git a/prelude.mk b/prelude.mk index 2c57689fee..12aa0316a7 100644 --- a/prelude.mk +++ b/prelude.mk @@ -7,37 +7,45 @@ ## Lazy inputs ## # (none) ## Outputs ## +# - Executable: FLOCK ?= $(CURDIR)/build-aux/bin/flock # or /usr/bin/flock +# - Executable: WRITE_IFCHANGED ?= $(CURDIR)/build-aux/bin/write-ifchanged +# - Executable: COPY_IFCHANGED ?= $(CURDIR)/build-aux/bin/copy-ifchanged +# - Executable: TAP_DRIVER ?= $(CURDIR)/build-aux/bin/tap-driver +# +# - Variable: build-aux.dir +# - Variable: build-aux.bindir +# - Variable: build-aux.go-build +# # - Variable: export GOHOSTOS # - Variable: export GOHOSTARCH -# - Variable: FLOCK -# - Variable: COPY_IFCHANGED -# - Variable: WRITE_IFCHANGE # - Variable: NL # - Variable: SPACE +# # - Function: joinlist # - Function: path.trimprefix # - Function: path.addprefix # - Function: quote.shell # - Function: lazyonce # - .PHONY Target: FORCE +# +# - Target: _prelude_clobber ## common.mk targets ## -# (none) +# - clobber ifeq ($(words $(filter $(abspath $(lastword $(MAKEFILE_LIST))),$(abspath $(MAKEFILE_LIST)))),1) _prelude.mk := $(lastword $(MAKEFILE_LIST)) # # Variables +build-aux.dir = $(patsubst %/,%,$(dir $(_prelude.mk))) +build-aux.bindir = $(abspath $(build-aux.dir)/bin) + # Possible values of GOHOSTOS/GOHOSTARCH: # https://golang.org/doc/install/source#environment _prelude.HAVE_GO = $(call lazyonce,_prelude.HAVE_GO,$(shell which go 2>/dev/null)) export GOHOSTOS = $(call lazyonce,GOHOSTOS ,$(if $(_prelude.HAVE_GO),$(shell go env GOHOSTOS ),$(shell uname -s | tr A-Z a-z))) export GOHOSTARCH = $(call lazyonce,GOHOSTARCH,$(if $(_prelude.HAVE_GO),$(shell go env GOHOSTARCH),$(patsubst i%86,386,$(patsubst x86_64,amd64,$(shell uname -m))))) -FLOCK = $(call lazyonce,FLOCK,$(if $(shell which flock 2>/dev/null),flock,$(abspath $(dir $(_prelude.mk))flock))) -COPY_IFCHANGED = $(abspath $(dir $(_prelude.mk))copy-ifchanged) -WRITE_IFCHANGED = $(abspath $(dir $(_prelude.mk))write-ifchanged) - # NOTE: this is not a typo, this is actually how you spell newline in Make define NL @@ -49,6 +57,39 @@ define SPACE endef +# +# Executables + +FLOCK ?= $(call lazyonce,FLOCK,$(or $(shell which flock 2>/dev/null),$(build-aux.bindir)/flock)) +COPY_IFCHANGED ?= $(build-aux.bindir)/copy-ifchanged +WRITE_IFCHANGED ?= $(build-aux.bindir)/write-ifchanged +TAP_DRIVER ?= $(build-aux.bindir)/tap-driver + +$(build-aux.bindir): + mkdir $@ + +clobber: _clobber-prelude +_clobber-prelude: + rm -rf $(build-aux.bindir) +.PHONY: _clobber-prelude + +$(build-aux.bindir)/%: $(build-aux.dir)/bin-sh/%.sh | $(build-aux.bindir) + install $< $@ + +# All of this funny business with locking can be ditched once we drop +# support for Go 1.11. (When removing it, be aware that go-mod.mk +# uses `_prelude.go.*` variables). +_prelude.go.GOPATH = $(call lazyonce,$(shell go env GOPATH)) +_prelude.go.goversion = $(call lazyonce,_prelude.go.goversion,$(patsubst go%,%,$(filter go1%,$(shell go version)))) +_prelude.go.lock = $(if $(filter 1.11 1.11.%,$(_prelude.go.goversion)),$(FLOCK)$(if $@, $(_prelude.go.GOPATH)/pkg/mod )) +$(build-aux.bindir)/.flock.stamp: $(build-aux.bindir)/.%.stamp: $(build-aux.dir)/bin-go/%/ $(shell find $(build-aux.dir)/bin-go/ -mindepth 1) $(build-aux.dir)/go.mod | $(build-aux.bindir) + cd $(build-aux.dir) && GO111MODULE=on go build -o $@ ./bin-go/$* +$(build-aux.bindir)/.%.stamp: $(build-aux.dir)/bin-go/%/ $(shell find $(build-aux.dir)/bin-go/ -mindepth 1) $(build-aux.dir)/go.mod $(_prelude.go.lock) | $(build-aux.bindir) + cd $(build-aux.dir) && GO111MODULE=on $(_prelude.go.lock)go build -o $@ ./bin-go/$* +$(build-aux.bindir)/%: $(build-aux.bindir)/.%.stamp $(COPY_IFCHANGED) + $(COPY_IFCHANGED) $< $@ +build-aux.go-build = cd $(build-aux.dir) && GO111MODULE=on $(_prelude.go.lock)go build + # # Functions diff --git a/teleproxy.mk b/teleproxy.mk index b8c711e575..1255595dd0 100644 --- a/teleproxy.mk +++ b/teleproxy.mk @@ -3,35 +3,30 @@ # Makefile snippet for calling `teleproxy` # ## Eager inputs ## -# - Variable: TELEPROXY ?= ./build-aux/teleproxy # - Variable: KUBECONFIG # - Variable: TELEPROXY_LOG ?= ./build-aux/teleproxy.log ## Lazy inputs ## # - Variable: KUBE_URL ## Outputs ## -# - Variable: TELEPROXY ?= ./build-aux/teleproxy +# - Executable: TELEPROXY ?= $(CURDIR)/build-aux/bin/teleproxy # - Variable: TELEPROXY_LOG ?= ./build-aux/teleproxy.log -# - Target : $(TELEPROXY) # - .PHONY Target: proxy # - .PHONY Target: unproxy # - .PHONY Target: status-proxy ## common.mk targets ## # - clean -# - clobber ## kubernaut-ui.mk targets ## # - $(KUBECONFIG).clean ifeq ($(words $(filter $(abspath $(lastword $(MAKEFILE_LIST))),$(abspath $(MAKEFILE_LIST)))),1) _teleproxy.mk := $(lastword $(MAKEFILE_LIST)) include $(dir $(_teleproxy.mk))prelude.mk -TELEPROXY ?= $(dir $(_teleproxy.mk))teleproxy TELEPROXY_LOG ?= $(dir $(_teleproxy.mk))teleproxy.log -TELEPROXY_VERSION = 0.3.16 KUBE_URL = https://kubernetes/api/ -$(TELEPROXY): $(_teleproxy.mk) - sudo rm -f $@ - curl -o $@ --fail https://s3.amazonaws.com/datawire-static-files/teleproxy/$(TELEPROXY_VERSION)/$(GOHOSTOS)/$(GOHOSTARCH)/teleproxy +TELEPROXY ?= $(build-aux.bindir)/teleproxy +$(build-aux.bindir)/teleproxy: $(build-aux.dir)/go.mod $(_prelude.go.lock) | $(build-aux.bindir) + $(build-aux.go-build) -o $@ github.com/datawire/teleproxy/cmd/teleproxy sudo chown root $@ sudo chmod go-w,a+sx $@ @@ -75,11 +70,11 @@ $(KUBECONFIG).clean: unproxy clean: _clean-teleproxy _clean-teleproxy: $(if $(wildcard $(TELEPROXY_LOG)),unproxy) rm -f $(TELEPROXY_LOG) +# Files made by older versions. Remove the tail of this list when the +# commit making the change gets far enough in to the past. +# +# 2018-07-01 + rm -f $(dir $(_teleproxy.mk))teleproxy .PHONY: _clean-teleproxy -clobber: _clobber-teleproxy -_clobber-teleproxy: - rm -f $(TELEPROXY) -.PHONY: _clobber-teleproxy - endif