From e7911ad9ea38eaf8707b7247a5ac96bc81de856c Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 23 Mar 2017 15:46:03 +0100 Subject: [PATCH 1/3] build: unify vendor skipping logic This fixes a recent bug where 'make geth' built everything instead of just geth. --- build/ci.go | 29 +++-------------------------- internal/build/util.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/build/ci.go b/build/ci.go index 27589fc7f5..fcdd337888 100644 --- a/build/ci.go +++ b/build/ci.go @@ -173,19 +173,7 @@ func doInstall(cmdline []string) { if flag.NArg() > 0 { packages = flag.Args() } - - // Resolve ./... manually and remove vendor/bazil/fuse (fuse is not in windows) - out, err := goTool("list", "./...").CombinedOutput() - if err != nil { - log.Fatalf("package listing failed: %v\n%s", err, string(out)) - } - packages = []string{} - for _, line := range strings.Split(string(out), "\n") { - if !strings.Contains(line, "vendor") { - packages = append(packages, strings.TrimSpace(line)) - } - } - + packages = build.ExpandPackagesNoVendor(packages) if *arch == "" || *arch == runtime.GOARCH { goinstall := goTool("install", buildFlags(env)...) @@ -284,19 +272,8 @@ func doTest(cmdline []string) { if len(flag.CommandLine.Args()) > 0 { packages = flag.CommandLine.Args() } - if len(packages) == 1 && packages[0] == "./..." { - // Resolve ./... manually since go vet will fail on vendored stuff - out, err := goTool("list", "./...").CombinedOutput() - if err != nil { - log.Fatalf("package listing failed: %v\n%s", err, string(out)) - } - packages = []string{} - for _, line := range strings.Split(string(out), "\n") { - if !strings.Contains(line, "vendor") { - packages = append(packages, strings.TrimSpace(line)) - } - } - } + packages = build.ExpandPackagesNoVendor(packages) + // Run analysis tools before the tests. if *vet { build.MustRun(goTool("vet", packages...)) diff --git a/internal/build/util.go b/internal/build/util.go index 4df7b91381..44f6760b95 100644 --- a/internal/build/util.go +++ b/internal/build/util.go @@ -26,6 +26,7 @@ import ( "os" "os/exec" "path/filepath" + "runtime" "strings" "text/template" ) @@ -136,3 +137,30 @@ func CopyFile(dst, src string, mode os.FileMode) { log.Fatal(err) } } + +// ExpandPackagesNoVendor expands a cmd/go import path pattern, skipping +// vendored packages. +func ExpandPackagesNoVendor(patterns []string) []string { + expand := false + for _, pkg := range patterns { + if strings.Contains(pkg, "...") { + expand = true + } + } + if expand { + args := append([]string{"list"}, patterns...) + cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), args...) + out, err := cmd.CombinedOutput() + if err != nil { + log.Fatalf("package listing failed: %v\n%s", err, string(out)) + } + var packages []string + for _, line := range strings.Split(string(out), "\n") { + if !strings.Contains(line, "/vendor/") { + packages = append(packages, strings.TrimSpace(line)) + } + } + return packages + } + return patterns +} From df1fbe3c067bbca9be10f6fc2d09a66f82313a82 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 23 Mar 2017 15:48:30 +0100 Subject: [PATCH 2/3] build: always run go vet This ensures 'make test' finds all errors that remote CI would find. Go 1.7 vet reports a false positive in package log, add a workaround. --- .travis.yml | 4 ++-- appveyor.yml | 2 +- build/ci.go | 7 ++----- log/handler.go | 7 ++++++- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4bef48a0db..9d85635b1a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,7 +24,7 @@ matrix: - sudo chmod 666 /dev/fuse - sudo chown root:$USER /etc/fuse.conf - go run build/ci.go install - - go run build/ci.go test -coverage -vet -misspell + - go run build/ci.go test -coverage -misspell - os: osx go: 1.8 @@ -34,7 +34,7 @@ matrix: - brew install caskroom/cask/brew-cask - brew cask install osxfuse - go run build/ci.go install - - go run build/ci.go test -coverage -vet -misspell + - go run build/ci.go test -coverage -misspell # This builder does the Ubuntu PPA and Linux Azure uploads - os: linux diff --git a/appveyor.yml b/appveyor.yml index c156967052..c9c2e357e8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -36,4 +36,4 @@ after_build: test_script: - set CGO_ENABLED=1 - - go run build\ci.go test -vet -coverage + - go run build\ci.go test -coverage diff --git a/build/ci.go b/build/ci.go index fcdd337888..6224175804 100644 --- a/build/ci.go +++ b/build/ci.go @@ -24,7 +24,7 @@ Usage: go run ci.go Available commands are: install [ -arch architecture ] [ packages... ] -- builds packages and executables - test [ -coverage ] [ -vet ] [ -misspell ] [ packages... ] -- runs the tests + test [ -coverage ] [ -misspell ] [ packages... ] -- runs the tests archive [ -arch architecture ] [ -type zip|tar ] [ -signer key-envvar ] [ -upload dest ] -- archives build artefacts importkeys -- imports signing keys from env debsrc [ -signer key-id ] [ -upload dest ] -- creates a debian source package @@ -262,7 +262,6 @@ func goToolArch(arch string, subcmd string, args ...string) *exec.Cmd { func doTest(cmdline []string) { var ( - vet = flag.Bool("vet", false, "Whether to run go vet") misspell = flag.Bool("misspell", false, "Whether to run the spell checker") coverage = flag.Bool("coverage", false, "Whether to record code coverage") ) @@ -275,9 +274,7 @@ func doTest(cmdline []string) { packages = build.ExpandPackagesNoVendor(packages) // Run analysis tools before the tests. - if *vet { - build.MustRun(goTool("vet", packages...)) - } + build.MustRun(goTool("vet", packages...)) if *misspell { spellcheck(packages) } diff --git a/log/handler.go b/log/handler.go index abb17b4c41..d5594b853d 100644 --- a/log/handler.go +++ b/log/handler.go @@ -106,11 +106,16 @@ func CallerFileHandler(h Handler) Handler { // the context with key "fn". func CallerFuncHandler(h Handler) Handler { return FuncHandler(func(r *Record) error { - r.Ctx = append(r.Ctx, "fn", fmt.Sprintf("%+n", r.Call)) + r.Ctx = append(r.Ctx, "fn", formatCall("%+n", r.Call)) return h.Log(r) }) } +// This function is here to please go vet on Go < 1.8. +func formatCall(format string, c stack.Call) string { + return fmt.Sprintf(format, c) +} + // CallerStackHandler returns a Handler that adds a stack trace to the context // with key "stack". The stack trace is formated as a space separated list of // call sites inside matching []'s. The most recent call site is listed first. From 69ac6cc70e4f2e712be91be2795ef79bce3f0e89 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 23 Mar 2017 16:01:17 +0100 Subject: [PATCH 3/3] travis.yml: re-add missing build commands for Go 1.7 --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9d85635b1a..d3b0d427c7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,8 +12,10 @@ matrix: - sudo modprobe fuse - sudo chmod 666 /dev/fuse - sudo chown root:$USER /etc/fuse.conf + - go run build/ci.go install + - go run build/ci.go test -coverage - # These are the latest Go versions, only run go vet and misspell on these + # These are the latest Go versions. - os: linux dist: trusty sudo: required