From 1bfe5a24eaac04035fb723f15f92c6e6e37b6b57 Mon Sep 17 00:00:00 2001 From: Koichi Shiraishi Date: Wed, 13 Feb 2019 17:33:04 +0900 Subject: README: fix unknown toggle-unmodified-files config The 'keybinding.toggle-unmodified-files' is unknown config. actually 'keybinding.toggle-unchanged-files'. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 21f0e4f..b657cfc 100644 --- a/README.md +++ b/README.md @@ -184,7 +184,7 @@ Key Binding | Description Ctrl + A | Filetree view: show/hide added files Ctrl + R | Filetree view: show/hide removed files Ctrl + M | Filetree view: show/hide modified files -Ctrl + U | Filetree view: show/hide unmodified files +Ctrl + U | Filetree view: show/hide unchanged files PageUp | Filetree view: scroll up a page PageDown | Filetree view: scroll down a page @@ -214,7 +214,7 @@ keybinding: toggle-added-files: ctrl+a toggle-removed-files: ctrl+r toggle-modified-files: ctrl+m - toggle-unmodified-files: ctrl+u + toggle-unchanged-files: ctrl+u page-up: pgup page-down: pgdn -- cgit v1.2.3 From 1021fabf19aa55100fdd0db6967134745e63d521 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 10 Jun 2019 14:04:51 -0400 Subject: docs: add missing slash to command example --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5121130..678ebc0 100644 --- a/README.md +++ b/README.md @@ -147,7 +147,7 @@ or if you are running with a docker image: ```bash docker run --rm -it \ -v /var/run/docker.sock:/var/run/docker.sock \ - -e DOCKER_API_VERSION=1.37 + -e DOCKER_API_VERSION=1.37 \ wagoodman/dive:latest ``` -- cgit v1.2.3 From 26281d9f964d19ae5156cb04449d3127b4cce07e Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Sat, 20 Jul 2019 17:38:37 -0400 Subject: replace travis with gitlab; linting fixes --- .dockerignore | 2 + .gitignore | 1 + .gitlab-ci.yml | 26 ++++ .scripts/test-coverage.sh | 55 +++++++ .scripts/test.sh | 55 ------- .travis.yml | 34 ----- Makefile | 16 +- cmd/analyze.go | 4 +- filetree/cache.go | 2 - filetree/data.go | 5 +- filetree/efficiency_test.go | 25 +++- filetree/node.go | 5 +- filetree/node_test.go | 25 ++-- filetree/tree.go | 10 +- filetree/tree_test.go | 336 +++++++++++++++++++++++++++++++++--------- go.mod | 12 +- go.sum | 157 ++++++++++++++++++++ image/docker_image.go | 10 +- runtime/ci/evaluator.go | 5 +- ui/details_controller.go | 23 ++- ui/filetree_controller.go | 35 ++--- ui/filetree_viewmodel.go | 14 +- ui/filetree_viewmodel_test.go | 25 ++-- ui/filter_controller.go | 12 +- ui/layer_controller.go | 32 ++-- ui/status_controller.go | 11 +- ui/ui.go | 52 +++---- 27 files changed, 673 insertions(+), 316 deletions(-) create mode 100644 .gitlab-ci.yml create mode 100755 .scripts/test-coverage.sh delete mode 100755 .scripts/test.sh delete mode 100644 .travis.yml diff --git a/.dockerignore b/.dockerignore index 402fbc0..52712ed 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,8 +1,10 @@ /.git /.data +/.cover /dist /ui /utils /image /cmd /build +coverage.txt diff --git a/.gitignore b/.gitignore index 16fccd1..149cdc3 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ *.log /dist .cover +coverage.txt diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..7ec9505 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,26 @@ +image: golang:1.12.5 + +cache: + paths: + - .cache + +variables: + GOPATH: $CI_PROJECT_DIR/.cache + +stages: + - setup + - validation + +setup: + stage: setup + script: + - mkdir -p .cache + - go get ./... + - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.17.1 + +validation: + stage: validation + before_script: + - export PATH="$GOPATH/bin:$PATH" + script: + - make ci diff --git a/.scripts/test-coverage.sh b/.scripts/test-coverage.sh new file mode 100755 index 0000000..36db3a7 --- /dev/null +++ b/.scripts/test-coverage.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# Generate test coverage statistics for Go packages. +# +# Works around the fact that `go test -coverprofile` currently does not work +# with multiple packages, see https://code.google.com/p/go/issues/detail?id=6909 +# +# Usage: script/coverage [--html|--coveralls] +# +# --html Additionally create HTML report and open it in browser +# --coveralls Push coverage statistics to coveralls.io +# +# Source: https://github.com/mlafeldt/chef-runner/blob/v0.7.0/script/coverage + +set -e + +workdir=.cover +profile="$workdir/cover.out" +mode=count + +generate_cover_data() { + rm -rf "$workdir" + mkdir "$workdir" + + for pkg in "$@"; do + f="$workdir/$(echo $pkg | tr / -).cover" + go test -v -covermode="$mode" -coverprofile="$f" "$pkg" + done + + echo "mode: $mode" >"$profile" + grep -h -v "^mode:" "$workdir"/*.cover >>"$profile" +} + +show_cover_report() { + go tool cover -${1}="$profile" +} + +push_to_coveralls() { + echo "Pushing coverage statistics to coveralls.io" + goveralls -coverprofile="$profile" +} + +generate_cover_data $(go list ./...) +case "$1" in +"") + show_cover_report func + ;; +--html) + show_cover_report html + ;; +--coveralls) + push_to_coveralls + ;; +*) + echo >&2 "error: invalid option: $1"; exit 1 ;; +esac diff --git a/.scripts/test.sh b/.scripts/test.sh deleted file mode 100755 index 36db3a7..0000000 --- a/.scripts/test.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -# Generate test coverage statistics for Go packages. -# -# Works around the fact that `go test -coverprofile` currently does not work -# with multiple packages, see https://code.google.com/p/go/issues/detail?id=6909 -# -# Usage: script/coverage [--html|--coveralls] -# -# --html Additionally create HTML report and open it in browser -# --coveralls Push coverage statistics to coveralls.io -# -# Source: https://github.com/mlafeldt/chef-runner/blob/v0.7.0/script/coverage - -set -e - -workdir=.cover -profile="$workdir/cover.out" -mode=count - -generate_cover_data() { - rm -rf "$workdir" - mkdir "$workdir" - - for pkg in "$@"; do - f="$workdir/$(echo $pkg | tr / -).cover" - go test -v -covermode="$mode" -coverprofile="$f" "$pkg" - done - - echo "mode: $mode" >"$profile" - grep -h -v "^mode:" "$workdir"/*.cover >>"$profile" -} - -show_cover_report() { - go tool cover -${1}="$profile" -} - -push_to_coveralls() { - echo "Pushing coverage statistics to coveralls.io" - goveralls -coverprofile="$profile" -} - -generate_cover_data $(go list ./...) -case "$1" in -"") - show_cover_report func - ;; ---html) - show_cover_report html - ;; ---coveralls) - push_to_coveralls - ;; -*) - echo >&2 "error: invalid option: $1"; exit 1 ;; -esac diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 38c0be3..0000000 --- a/.travis.yml +++ /dev/null @@ -1,34 +0,0 @@ -language: go - -os: - - linux - - linux-ppc64le - -go: -- '1.9.x' -- '1.10.x' -- '1.11.x' -- 'master' - -# Skip the install step. Don't `go get` dependencies. Only build with the -# code in vendor/ -install: true - -matrix: - # It's ok if our code fails on unstable development versions of Go. - allow_failures: - - go: master - # Don't wait for tip tests to finish. Mark the test run green if the - # tests pass on the stable versions of Go. - fast_finish: true - -notifications: - email: false - -before_script: -- go get -t ./... - -# Note: scripts always run to completion -script: -- make validate -- make test diff --git a/Makefile b/Makefile index ee0266c..e31f316 100644 --- a/Makefile +++ b/Makefile @@ -14,23 +14,26 @@ run-large: build build: go build -o build/$(BIN) -release: test validate +release: test-coverage validate ./.scripts/tag.sh goreleaser --rm-dist install: go install ./... +ci: clean validate test-coverage + test: build - go test -cover -v ./... + go test -cover -v -race ./... -coverage: build - ./.scripts/test.sh +test-coverage: build + ./.scripts/test-coverage.sh validate: grep -R 'const allowTestDataCapture = false' ui/ go vet ./... - @! gofmt -s -d -l . 2>&1 | grep -vE '^\.git/' + @! gofmt -s -l . 2>&1 | grep -vE '^\.git/' | grep -vE '^\.cache/' + golangci-lint run lint: build golint -set_exit_status $$(go list ./...) @@ -40,7 +43,6 @@ generate-test-data: clean: rm -rf build - rm -rf vendor go clean -.PHONY: build install test lint clean release validate generate-test-data +.PHONY: build install test lint clean release validate generate-test-data test-coverage ci diff --git a/cmd/analyze.go b/cmd/analyze.go index fe1a839..8b3f70f 100644 --- a/cmd/analyze.go +++ b/cmd/analyze.go @@ -19,14 +19,14 @@ func doAnalyzeCmd(cmd *cobra.Command, args []string) { } fmt.Println("No image argument given") - cmd.Help() + _ = cmd.Help() utils.Exit(1) } userImage := args[0] if userImage == "" { fmt.Println("No image argument given") - cmd.Help() + _ = cmd.Help() utils.Exit(1) } diff --git a/filetree/cache.go b/filetree/cache.go index 3dde39a..6e676c3 100644 --- a/filetree/cache.go +++ b/filetree/cache.go @@ -17,8 +17,6 @@ func (cache *TreeCache) Get(bottomTreeStart, bottomTreeStop, topTreeStart, topTr key := TreeCacheKey{bottomTreeStart, bottomTreeStop, topTreeStart, topTreeStop} if value, exists := cache.cache[key]; exists { return value - } else { - } value := cache.buildTree(key) cache.cache[key] = value diff --git a/filetree/data.go b/filetree/data.go index 64ceceb..1218964 100644 --- a/filetree/data.go +++ b/filetree/data.go @@ -64,7 +64,10 @@ func getHashFromReader(reader io.Reader) uint64 { break } - h.Write(buf[:n]) + _, err = h.Write(buf[:n]) + if err != nil { + logrus.Panic(err) + } } return h.Sum64() diff --git a/filetree/efficiency_test.go b/filetree/efficiency_test.go index e461201..831ceb5 100644 --- a/filetree/efficiency_test.go +++ b/filetree/efficiency_test.go @@ -4,19 +4,31 @@ import ( "testing" ) +func checkError(t *testing.T, err error, message string) { + if err != nil { + t.Errorf(message+": %+v", err) + } +} + func TestEfficency(t *testing.T) { trees := make([]*FileTree, 3) for idx := range trees { trees[idx] = NewFileTree() } - trees[0].AddPath("/etc/nginx/nginx.conf", FileInfo{Size: 2000}) - trees[0].AddPath("/etc/nginx/public", FileInfo{Size: 3000}) + _, _, err := trees[0].AddPath("/etc/nginx/nginx.conf", FileInfo{Size: 2000}) + checkError(t, err, "could not setup test") + + _, _, err = trees[0].AddPath("/etc/nginx/public", FileInfo{Size: 3000}) + checkError(t, err, "could not setup test") - trees[1].AddPath("/etc/nginx/nginx.conf", FileInfo{Size: 5000}) - trees[1].AddPath("/etc/athing", FileInfo{Size: 10000}) + _, _, err = trees[1].AddPath("/etc/nginx/nginx.conf", FileInfo{Size: 5000}) + checkError(t, err, "could not setup test") + _, _, err = trees[1].AddPath("/etc/athing", FileInfo{Size: 10000}) + checkError(t, err, "could not setup test") - trees[2].AddPath("/etc/.wh.nginx", *BlankFileChangeInfo("/etc/.wh.nginx")) + _, _, err = trees[2].AddPath("/etc/.wh.nginx", *BlankFileChangeInfo("/etc/.wh.nginx")) + checkError(t, err, "could not setup test") var expectedScore = 0.75 var expectedMatches = EfficiencySlice{ @@ -50,7 +62,8 @@ func TestEfficency_ScratchImage(t *testing.T) { trees[idx] = NewFileTree() } - trees[0].AddPath("/nothing", FileInfo{Size: 0}) + _, _, err := trees[0].AddPath("/nothing", FileInfo{Size: 0}) + checkError(t, err, "could not setup test") var expectedScore = 1.0 var expectedMatches = EfficiencySlice{} diff --git a/filetree/node.go b/filetree/node.go index 7a2d2cf..b58c986 100644 --- a/filetree/node.go +++ b/filetree/node.go @@ -100,7 +100,10 @@ func (node *FileNode) Remove() error { return fmt.Errorf("cannot remove the tree root") } for _, child := range node.Children { - child.Remove() + err := child.Remove() + if err != nil { + return err + } } delete(node.Parent.Children, node.Name) node.Tree.Size-- diff --git a/filetree/node_test.go b/filetree/node_test.go index a902e48..0470978 100644 --- a/filetree/node_test.go +++ b/filetree/node_test.go @@ -56,7 +56,8 @@ func TestRemoveChild(t *testing.T) { forth := two.AddChild("forth", FileInfo{}) two.AddChild("fifth", FileInfo{}) - forth.Remove() + err := forth.Remove() + checkError(t, err, "unable to setup test") expected, actual = 4, tree.Size if expected != actual { @@ -67,7 +68,8 @@ func TestRemoveChild(t *testing.T) { t.Errorf("Expected 'forth' node to be deleted.") } - two.Remove() + err = two.Remove() + checkError(t, err, "unable to setup test") expected, actual = 2, tree.Size if expected != actual { @@ -121,7 +123,8 @@ func TestDiffTypeFromAddedChildren(t *testing.T) { node, _, _ = tree.AddPath("/usr/bin2", *BlankFileChangeInfo("/usr/bin2")) node.Data.DiffType = Removed - tree.Root.Children["usr"].deriveDiffType(Unchanged) + err := tree.Root.Children["usr"].deriveDiffType(Unchanged) + checkError(t, err, "unable to setup test") if tree.Root.Children["usr"].Data.DiffType != Changed { t.Errorf("Expected Changed but got %v", tree.Root.Children["usr"].Data.DiffType) @@ -129,17 +132,18 @@ func TestDiffTypeFromAddedChildren(t *testing.T) { } func TestDiffTypeFromRemovedChildren(t *testing.T) { tree := NewFileTree() - node, _, _ := tree.AddPath("/usr", *BlankFileChangeInfo("/usr")) + _, _, _ = tree.AddPath("/usr", *BlankFileChangeInfo("/usr")) info1 := BlankFileChangeInfo("/usr/.wh.bin") - node, _, _ = tree.AddPath("/usr/.wh.bin", *info1) + node, _, _ := tree.AddPath("/usr/.wh.bin", *info1) node.Data.DiffType = Removed info2 := BlankFileChangeInfo("/usr/.wh.bin2") node, _, _ = tree.AddPath("/usr/.wh.bin2", *info2) node.Data.DiffType = Removed - tree.Root.Children["usr"].deriveDiffType(Unchanged) + err := tree.Root.Children["usr"].deriveDiffType(Unchanged) + checkError(t, err, "unable to setup test") if tree.Root.Children["usr"].Data.DiffType != Changed { t.Errorf("Expected Changed but got %v", tree.Root.Children["usr"].Data.DiffType) @@ -149,9 +153,12 @@ func TestDiffTypeFromRemovedChildren(t *testing.T) { func TestDirSize(t *testing.T) { tree1 := NewFileTree() - tree1.AddPath("/etc/nginx/public1", FileInfo{Size: 100}) - tree1.AddPath("/etc/nginx/thing1", FileInfo{Size: 200}) - tree1.AddPath("/etc/nginx/public3/thing2", FileInfo{Size: 300}) + _, _, err := tree1.AddPath("/etc/nginx/public1", FileInfo{Size: 100}) + checkError(t, err, "unable to setup test") + _, _, err = tree1.AddPath("/etc/nginx/thing1", FileInfo{Size: 200}) + checkError(t, err, "unable to setup test") + _, _, err = tree1.AddPath("/etc/nginx/public3/thing2", FileInfo{Size: 300}) + checkError(t, err, "unable to setup test") node, _ := tree1.GetNode("/etc/nginx") expected, actual := "---------- 0:0 600 B ", node.MetadataString() diff --git a/filetree/tree.go b/filetree/tree.go index 46309ce..27d1f07 100644 --- a/filetree/tree.go +++ b/filetree/tree.go @@ -325,9 +325,15 @@ func (tree *FileTree) CompareAndMark(upper *FileTree) error { // take note of the comparison results on each note in the owning tree. for _, pair := range modifications { if pair.final > 0 { - pair.lowerNode.AssignDiffType(pair.final) + err = pair.lowerNode.AssignDiffType(pair.final) + if err != nil { + return err + } } else if pair.lowerNode.Data.DiffType == Unchanged { - pair.lowerNode.deriveDiffType(pair.tentative) + err = pair.lowerNode.deriveDiffType(pair.tentative) + if err != nil { + return err + } } // persist the upper's payload on the owning tree diff --git a/filetree/tree_test.go b/filetree/tree_test.go index b1a2c6b..2007d04 100644 --- a/filetree/tree_test.go +++ b/filetree/tree_test.go @@ -87,12 +87,30 @@ func TestString(t *testing.T) { func TestStringBetween(t *testing.T) { tree := NewFileTree() - tree.AddPath("/etc/nginx/nginx.conf", FileInfo{}) - tree.AddPath("/etc/nginx/public", FileInfo{}) - tree.AddPath("/var/run/systemd", FileInfo{}) - tree.AddPath("/var/run/bashful", FileInfo{}) - tree.AddPath("/tmp", FileInfo{}) - tree.AddPath("/tmp/nonsense", FileInfo{}) + _, _, err := tree.AddPath("/etc/nginx/nginx.conf", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/etc/nginx/public", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/var/run/systemd", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/var/run/bashful", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/tmp", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/tmp/nonsense", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } expected := `│ └── public @@ -109,12 +127,30 @@ func TestStringBetween(t *testing.T) { func TestAddPath(t *testing.T) { tree := NewFileTree() - tree.AddPath("/etc/nginx/nginx.conf", FileInfo{}) - tree.AddPath("/etc/nginx/public", FileInfo{}) - tree.AddPath("/var/run/systemd", FileInfo{}) - tree.AddPath("/var/run/bashful", FileInfo{}) - tree.AddPath("/tmp", FileInfo{}) - tree.AddPath("/tmp/nonsense", FileInfo{}) + _, _, err := tree.AddPath("/etc/nginx/nginx.conf", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/etc/nginx/public", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/var/run/systemd", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/var/run/bashful", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/tmp", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/tmp/nonsense", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } expected := `├── etc @@ -138,15 +174,39 @@ func TestAddPath(t *testing.T) { func TestRemovePath(t *testing.T) { tree := NewFileTree() - tree.AddPath("/etc/nginx/nginx.conf", FileInfo{}) - tree.AddPath("/etc/nginx/public", FileInfo{}) - tree.AddPath("/var/run/systemd", FileInfo{}) - tree.AddPath("/var/run/bashful", FileInfo{}) - tree.AddPath("/tmp", FileInfo{}) - tree.AddPath("/tmp/nonsense", FileInfo{}) + _, _, err := tree.AddPath("/etc/nginx/nginx.conf", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/etc/nginx/public", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/var/run/systemd", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/var/run/bashful", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/tmp", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/tmp/nonsense", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } - tree.RemovePath("/var/run/bashful") - tree.RemovePath("/tmp") + err = tree.RemovePath("/var/run/bashful") + if err != nil { + t.Errorf("could not setup test: %v", err) + } + err = tree.RemovePath("/tmp") + if err != nil { + t.Errorf("could not setup test: %v", err) + } expected := `├── etc @@ -173,24 +233,54 @@ func TestStack(t *testing.T) { tree1 := NewFileTree() - tree1.AddPath("/etc/nginx/public", FileInfo{}) - tree1.AddPath(payloadKey, FileInfo{}) - tree1.AddPath("/var/run/bashful", FileInfo{}) - tree1.AddPath("/tmp", FileInfo{}) - tree1.AddPath("/tmp/nonsense", FileInfo{}) + _, _, err := tree1.AddPath("/etc/nginx/public", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree1.AddPath(payloadKey, FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree1.AddPath("/var/run/bashful", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree1.AddPath("/tmp", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree1.AddPath("/tmp/nonsense", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } tree2 := NewFileTree() // add new files - tree2.AddPath("/etc/nginx/nginx.conf", FileInfo{}) + _, _, err = tree2.AddPath("/etc/nginx/nginx.conf", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } // modify current files - tree2.AddPath(payloadKey, payloadValue) + _, _, err = tree2.AddPath(payloadKey, payloadValue) + if err != nil { + t.Errorf("could not setup test: %v", err) + } // whiteout the following files - tree2.AddPath("/var/run/.wh.bashful", FileInfo{}) - tree2.AddPath("/.wh.tmp", FileInfo{}) + _, _, err = tree2.AddPath("/var/run/.wh.bashful", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree2.AddPath("/.wh.tmp", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } // ignore opaque whiteout files entirely - tree2.AddPath("/.wh..wh..opq", FileInfo{}) + _, _, err = tree2.AddPath("/.wh..wh..opq", FileInfo{}) + if err == nil { + t.Errorf("expected error on whiteout file add, got none") + } - err := tree1.Stack(tree2) + err = tree1.Stack(tree2) if err != nil { t.Errorf("Could not stack refTrees: %v", err) @@ -211,7 +301,7 @@ func TestStack(t *testing.T) { t.Errorf("Expected '%s' to still exist, but it doesn't", payloadKey) } - if node.Data.FileInfo.Path != payloadValue.Path { + if node == nil || node.Data.FileInfo.Path != payloadValue.Path { t.Errorf("Expected '%s' value to be %+v but got %+v", payloadKey, payloadValue, node.Data.FileInfo) } @@ -225,15 +315,39 @@ func TestStack(t *testing.T) { func TestCopy(t *testing.T) { tree := NewFileTree() - tree.AddPath("/etc/nginx/nginx.conf", FileInfo{}) - tree.AddPath("/etc/nginx/public", FileInfo{}) - tree.AddPath("/var/run/systemd", FileInfo{}) - tree.AddPath("/var/run/bashful", FileInfo{}) - tree.AddPath("/tmp", FileInfo{}) - tree.AddPath("/tmp/nonsense", FileInfo{}) + _, _, err := tree.AddPath("/etc/nginx/nginx.conf", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/etc/nginx/public", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/var/run/systemd", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/var/run/bashful", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/tmp", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/tmp/nonsense", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } - tree.RemovePath("/var/run/bashful") - tree.RemovePath("/tmp") + err = tree.RemovePath("/var/run/bashful") + if err != nil { + t.Errorf("could not setup test: %v", err) + } + err = tree.RemovePath("/tmp") + if err != nil { + t.Errorf("could not setup test: %v", err) + } expected := `├── etc @@ -265,10 +379,19 @@ func TestCompareWithNoChanges(t *testing.T) { TypeFlag: 1, hash: 123, } - lowerTree.AddPath(value, fakeData) - upperTree.AddPath(value, fakeData) + _, _, err := lowerTree.AddPath(value, fakeData) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = upperTree.AddPath(value, fakeData) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + } + err := lowerTree.CompareAndMark(upperTree) + if err != nil { + t.Errorf("could not setup test: %v", err) } - lowerTree.CompareAndMark(upperTree) asserter := func(n *FileNode) error { if n.Path() == "/" { return nil @@ -278,7 +401,7 @@ func TestCompareWithNoChanges(t *testing.T) { } return nil } - err := lowerTree.VisitDepthChildFirst(asserter, nil) + err = lowerTree.VisitDepthChildFirst(asserter, nil) if err != nil { t.Error(err) } @@ -291,19 +414,25 @@ func TestCompareWithAdds(t *testing.T) { upperPaths := [...]string{"/etc", "/etc/sudoers", "/usr", "/etc/hosts", "/usr/bin", "/usr/bin/bash", "/a/new/path"} for _, value := range lowerPaths { - lowerTree.AddPath(value, FileInfo{ + _, _, err := lowerTree.AddPath(value, FileInfo{ Path: value, TypeFlag: 1, hash: 123, }) + if err != nil { + t.Errorf("could not setup test: %v", err) + } } for _, value := range upperPaths { - upperTree.AddPath(value, FileInfo{ + _, _, err := upperTree.AddPath(value, FileInfo{ Path: value, TypeFlag: 1, hash: 123, }) + if err != nil { + t.Errorf("could not setup test: %v", err) + } } failedAssertions := []error{} @@ -351,39 +480,51 @@ func TestCompareWithChanges(t *testing.T) { changedPaths := []string{"/etc", "/usr", "/etc/hosts", "/etc/sudoers", "/usr/bin"} for _, value := range changedPaths { - lowerTree.AddPath(value, FileInfo{ + _, _, err := lowerTree.AddPath(value, FileInfo{ Path: value, TypeFlag: 1, hash: 123, }) - upperTree.AddPath(value, FileInfo{ + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = upperTree.AddPath(value, FileInfo{ Path: value, TypeFlag: 1, hash: 456, }) + if err != nil { + t.Errorf("could not setup test: %v", err) + } } chmodPath := "/etc/non-data-change" - lowerTree.AddPath(chmodPath, FileInfo{ + _, _, err := lowerTree.AddPath(chmodPath, FileInfo{ Path: chmodPath, TypeFlag: 1, hash: 123, Mode: 0, }) + if err != nil { + t.Errorf("could not setup test: %v", err) + } - upperTree.AddPath(chmodPath, FileInfo{ + _, _, err = upperTree.AddPath(chmodPath, FileInfo{ Path: chmodPath, TypeFlag: 1, hash: 123, Mode: 1, }) + if err != nil { + t.Errorf("could not setup test: %v", err) + } changedPaths = append(changedPaths, chmodPath) chownPath := "/etc/non-data-change-2" - lowerTree.AddPath(chmodPath, FileInfo{ + _, _, err = lowerTree.AddPath(chmodPath, FileInfo{ Path: chownPath, TypeFlag: 1, hash: 123, @@ -391,8 +532,11 @@ func TestCompareWithChanges(t *testing.T) { Gid: 0, Uid: 0, }) + if err != nil { + t.Errorf("could not setup test: %v", err) + } - upperTree.AddPath(chmodPath, FileInfo{ + _, _, err = upperTree.AddPath(chmodPath, FileInfo{ Path: chownPath, TypeFlag: 1, hash: 123, @@ -400,10 +544,17 @@ func TestCompareWithChanges(t *testing.T) { Gid: 12, Uid: 12, }) + if err != nil { + t.Errorf("could not setup test: %v", err) + } changedPaths = append(changedPaths, chownPath) - lowerTree.CompareAndMark(upperTree) + err = lowerTree.CompareAndMark(upperTree) + if err != nil { + t.Errorf("unable to compare and mark: %+v", err) + } + failedAssertions := []error{} asserter := func(n *FileNode) error { p := n.Path() @@ -420,7 +571,7 @@ func TestCompareWithChanges(t *testing.T) { } return nil } - err := lowerTree.VisitDepthChildFirst(asserter, nil) + err = lowerTree.VisitDepthChildFirst(asserter, nil) if err != nil { t.Errorf("Expected no errors when visiting nodes, got: %+v", err) } @@ -446,7 +597,10 @@ func TestCompareWithRemoves(t *testing.T) { TypeFlag: 1, hash: 123, } - lowerTree.AddPath(value, fakeData) + _, _, err := lowerTree.AddPath(value, fakeData) + if err != nil { + t.Errorf("could not setup test: %v", err) + } } for _, value := range upperPaths { @@ -455,10 +609,16 @@ func TestCompareWithRemoves(t *testing.T) { TypeFlag: 1, hash: 123, } - upperTree.AddPath(value, fakeData) + _, _, err := upperTree.AddPath(value, fakeData) + if err != nil { + t.Errorf("could not setup test: %v", err) + } } - lowerTree.CompareAndMark(upperTree) + err := lowerTree.CompareAndMark(upperTree) + if err != nil { + t.Errorf("could not setup test: %v", err) + } failedAssertions := []error{} asserter := func(n *FileNode) error { p := n.Path() @@ -479,7 +639,7 @@ func TestCompareWithRemoves(t *testing.T) { } return nil } - err := lowerTree.VisitDepthChildFirst(asserter, nil) + err = lowerTree.VisitDepthChildFirst(asserter, nil) if err != nil { t.Errorf("Expected no errors when visiting nodes, got: %+v", err) } @@ -495,15 +655,39 @@ func TestCompareWithRemoves(t *testing.T) { func TestStackRange(t *testing.T) { tree := NewFileTree() - tree.AddPath("/etc/nginx/nginx.conf", FileInfo{}) - tree.AddPath("/etc/nginx/public", FileInfo{}) - tree.AddPath("/var/run/systemd", FileInfo{}) - tree.AddPath("/var/run/bashful", FileInfo{}) - tree.AddPath("/tmp", FileInfo{}) - tree.AddPath("/tmp/nonsense", FileInfo{}) + _, _, err := tree.AddPath("/etc/nginx/nginx.conf", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/etc/nginx/public", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/var/run/systemd", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/var/run/bashful", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/tmp", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } + _, _, err = tree.AddPath("/tmp/nonsense", FileInfo{}) + if err != nil { + t.Errorf("could not setup test: %v", err) + } - tree.RemovePath("/var/run/bashful") - tree.RemovePath("/tmp") + err = tree.RemovePath("/var/run/bashful") + if err != nil { + t.Errorf("could not setup test: %v", err) + } + err = tree.RemovePath("/tmp") + if err != nil { + t.Errorf("could not setup test: %v", err) + } lowerTree := NewFileTree() upperTree := NewFileTree() @@ -516,7 +700,10 @@ func TestStackRange(t *testing.T) { TypeFlag: 1, hash: 123, } - lowerTree.AddPath(value, fakeData) + _, _, err = lowerTree.AddPath(value, fakeData) + if err != nil { + t.Errorf("could not setup test: %v", err) + } } for _, value := range upperPaths { @@ -525,7 +712,10 @@ func TestStackRange(t *testing.T) { TypeFlag: 1, hash: 456, } - upperTree.AddPath(value, fakeData) + _, _, err = upperTree.AddPath(value, fakeData) + if err != nil { + t.Errorf("could not setup test: %v", err) + } } trees := []*FileTree{lowerTree, upperTree, tree} StackTreeRange(trees, 0, 2) @@ -548,12 +738,18 @@ func TestRemoveOnIterate(t *testing.T) { } } - tree.VisitDepthChildFirst(func(node *FileNode) error { + err := tree.VisitDepthChildFirst(func(node *FileNode) error { if node.Data.ViewInfo.Hidden { - tree.RemovePath(node.Path()) + err := tree.RemovePath(node.Path()) + if err != nil { + t.Errorf("could not setup test: %v", err) + } } return nil }, nil) + if err != nil { + t.Errorf("could not setup test: %v", err) + } expected := `└── usr diff --git a/go.mod b/go.mod index 6c51417..26bfcbe 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,6 @@ module github.com/wagoodman/dive require ( github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect - github.com/BurntSushi/toml v0.3.1 // indirect github.com/Microsoft/go-winio v0.4.11 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/cespare/xxhash v1.1.0 @@ -13,32 +12,25 @@ require ( github.com/docker/go-units v0.3.3 // indirect github.com/dustin/go-humanize v1.0.0 github.com/fatih/color v1.7.0 - github.com/gogo/protobuf v1.1.1 // indirect - github.com/google/go-cmp v0.2.0 // indirect + github.com/golangci/golangci-lint v1.17.1 // indirect github.com/google/uuid v1.1.0 github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/mux v1.6.2 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jroimartin/gocui v0.4.0 github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a - github.com/mattn/go-colorable v0.0.9 // indirect github.com/mattn/go-isatty v0.0.4 // indirect github.com/mitchellh/go-homedir v1.0.0 github.com/opencontainers/go-digest v1.0.0-rc1 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect github.com/phayes/permbits v0.0.0-20180830030258-59f2482cd460 - github.com/pkg/errors v0.8.0 // indirect github.com/sergi/go-diff v1.0.0 github.com/sirupsen/logrus v1.2.0 github.com/spf13/cobra v0.0.3 github.com/spf13/viper v1.2.1 github.com/wagoodman/keybinding v0.0.0-20181213133715-6a824da6df05 - golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 // indirect - golang.org/x/net v0.0.0-20181114220301-adae6a3d119a - golang.org/x/sync v0.0.0-20181108010431-42b317875d0f // indirect - golang.org/x/sys v0.0.0-20181116161606-93218def8b18 // indirect + golang.org/x/net v0.0.0-20190313220215-9f648a60d977 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c // indirect google.golang.org/grpc v1.16.0 // indirect gotest.tools v2.2.0+incompatible // indirect diff --git a/go.sum b/go.sum index 07be5d4..3870758 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,14 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Microsoft/go-winio v0.4.11 h1:zoIOcVf0xPN1tnMVbTtEdI+P8OofVk3NObnwOQ6nK2Q= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +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/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -21,54 +25,145 @@ github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 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/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 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 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 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 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/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +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/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jroimartin/gocui v0.4.0 h1:52jnalstgmc25FmtGcWqa0tcbMEWS6RpFLsOIO+I+E8= github.com/jroimartin/gocui v0.4.0/go.mod h1:7i7bbj99OgFHzo7kB2zPb8pXLqMBSQegY7azfqXMkyY= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= +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/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e h1:9MlwzLdW7QSDrhDjFlsEYmxpFyIoXmYRon3dt0io31k= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/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/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= 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.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I= github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +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/nsf/termbox-go v0.0.0-20181027232701-60ab7e3d12ed h1:bAVGG6B+R5qpSylrrA+BAMrzYkdAoiTaKPVxRB+4cyM= github.com/nsf/termbox-go v0.0.0-20181027232701-60ab7e3d12ed/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= +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/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/phayes/permbits v0.0.0-20180830030258-59f2482cd460 h1:B9xJsGjeteSbA5LYAmW9KF9/jQcmrJkmpgVWsqRxc0k= @@ -76,51 +171,113 @@ github.com/phayes/permbits v0.0.0-20180830030258-59f2482cd460/go.mod h1:3uODdxMg github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +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/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= 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/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/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/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/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.2 h1:Fy0orTDgHdbnzHcsOgfCN4LtHf0ec3wwtiwJqwvf3Gc= github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.2.1 h1:bIcUwXqLseLF3BDAZduuNfekWG87ibtFxi59Bq+oI9M= github.com/spf13/viper v1.2.1/go.mod h1:P4AexN0a+C9tGAnUFNwDMYYZv3pjFuvmeiMyKRaNVlI= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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= github.com/wagoodman/keybinding v0.0.0-20181213133715-6a824da6df05 h1:YMcRwVDe8DLDZ/vrhuImCfqjjG/+gZs6SF61DDQkL/8= github.com/wagoodman/keybinding v0.0.0-20181213133715-6a824da6df05/go.mod h1:gXFkc2sM2o06uzn5Lgo6Ql76uweGdxNfeAlFyKiHAdk= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 h1:kkXA53yGe04D0adEYJwEVQjeBppL01Exg+fnMjfUraU= golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869/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/lint v0.0.0-20180702182130-06c8688daad7/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-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-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/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/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992/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-20181116161606-93218def8b18 h1:Wh+XCfg3kNpjhdq2LXrsiOProjtQZKme5XUx7VcxwAw= golang.org/x/sys v0.0.0-20181116161606-93218def8b18/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 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 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-20181117154741-2ddaf7f79a09/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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +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/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 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +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= +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/image/docker_image.go b/image/docker_image.go index b6dcc8c..a27b6eb 100644 --- a/image/docker_image.go +++ b/image/docker_image.go @@ -97,7 +97,10 @@ func (image *dockerImageAnalyzer) Fetch() (io.ReadCloser, error) { if err != nil { // don't use the API, the CLI has more informative output fmt.Println("Image not available locally. Trying to pull '" + image.id + "'...") - utils.RunDockerCmd("pull", image.id) + err = utils.RunDockerCmd("pull", image.id) + if err != nil { + return nil, err + } } readCloser, err := image.client.ImageSave(ctx, []string{image.id}) @@ -243,7 +246,10 @@ func (image *dockerImageAnalyzer) processLayerTar(name string, layerIdx uint, re for _, element := range fileInfos { tree.FileSize += uint64(element.Size) - tree.AddPath(element.Path, element) + _, _, err := tree.AddPath(element.Path, element) + if err != nil { + return err + } } image.layerMap[tree.Name] = tree diff --git a/runtime/ci/evaluator.go b/runtime/ci/evaluator.go index ddc598b..8086779 100644 --- a/runtime/ci/evaluator.go +++ b/runtime/ci/evaluator.go @@ -42,10 +42,7 @@ func (ci *Evaluator) LoadConfig(configFile string) error { func (ci *Evaluator) isRuleEnabled(rule Rule) bool { value := ci.Config.GetString(rule.Key()) - if value == "disabled" { - return false - } - return true + return value != "disabled" } func (ci *Evaluator) Evaluate(analysis *image.AnalysisResult) bool { diff --git a/ui/details_controller.go b/ui/details_controller.go index 68dd5df..778521d 100644 --- a/ui/details_controller.go +++ b/ui/details_controller.go @@ -62,10 +62,7 @@ func (controller *DetailsController) Setup(v *gocui.View, header *gocui.View) er // IsVisible indicates if the details view pane is currently initialized. func (controller *DetailsController) IsVisible() bool { - if controller == nil { - return false - } - return true + return controller != nil } // CursorDown moves the cursor down in the details pane (currently indicates nothing). @@ -123,23 +120,23 @@ func (controller *DetailsController) Render() error { layerHeaderStr := fmt.Sprintf("[Layer Details]%s", strings.Repeat("─", width-15)) imageHeaderStr := fmt.Sprintf("[Image Details]%s", strings.Repeat("─", width-15)) - fmt.Fprintln(controller.header, Formatting.Header(vtclean.Clean(layerHeaderStr, false))) + _, _ = fmt.Fprintln(controller.header, Formatting.Header(vtclean.Clean(layerHeaderStr, false))) // update contents controller.view.Clear() - fmt.Fprintln(controller.view, Formatting.Header("Digest: ")+currentLayer.Id()) + _, _ = fmt.Fprintln(controller.view, Formatting.Header("Digest: ")+currentLayer.Id()) // TODO: add back in with controller model // fmt.Fprintln(view.view, Formatting.Header("Tar ID: ")+currentLayer.TarId()) - fmt.Fprintln(controller.view, Formatting.Header("Command:")) - fmt.Fprintln(controller.view, currentLayer.Command()) + _, _ = fmt.Fprintln(controller.view, Formatting.Hea