diff options
author | Alex Goodman <wagoodman@gmail.com> | 2021-02-15 13:13:08 -0500 |
---|---|---|
committer | Alex Goodman <wagoodman@gmail.com> | 2021-02-15 13:13:08 -0500 |
commit | bcebe0491c8442c20fc0f70750294fe46d78351b (patch) | |
tree | 6f2e14fed47eb7f9779e68fa5135e276f3625c2d | |
parent | ae89e3dc2ca81401d8c8ad91f83a07d4473f4c26 (diff) |
normalize application config and loggingupdate_views
41 files changed, 734 insertions, 480 deletions
diff --git a/cmd/analyze.go b/cmd/analyze.go index 49883d6..65a6749 100644 --- a/cmd/analyze.go +++ b/cmd/analyze.go @@ -2,12 +2,12 @@ package cmd import ( "fmt" - "github.com/sirupsen/logrus" - "github.com/spf13/viper" - "github.com/wagoodman/dive/dive" "os" "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/wagoodman/dive/dive" + "github.com/wagoodman/dive/internal/log" "github.com/wagoodman/dive/runtime" ) @@ -59,7 +59,7 @@ func doAnalyzeCmd(cmd *cobra.Command, args []string) { ignoreErrors, err := cmd.PersistentFlags().GetBool("ignore-errors") if err != nil { - logrus.Error("unable to get 'ignore-errors' option:", err) + log.Error("unable to get 'ignore-errors' option:", err) } runtime.Run(runtime.Options{ @@ -69,5 +69,6 @@ func doAnalyzeCmd(cmd *cobra.Command, args []string) { ExportFile: exportFile, CiConfig: ciConfig, IgnoreErrors: viper.GetBool("ignore-errors") || ignoreErrors, - }) + }, + *appConfig) } diff --git a/cmd/build.go b/cmd/build.go index 9c65fab..d49ad16 100644 --- a/cmd/build.go +++ b/cmd/build.go @@ -33,5 +33,5 @@ func doBuildCmd(cmd *cobra.Command, args []string) { BuildArgs: args, ExportFile: exportFile, CiConfig: ciConfig, - }) + }, *appConfig) } diff --git a/cmd/root.go b/cmd/root.go index 3f3466e..3aa7969 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -2,20 +2,20 @@ package cmd import ( "fmt" - "io/ioutil" "os" - "path" "strings" - "github.com/wagoodman/dive/dive" - "github.com/wagoodman/dive/dive/filetree" - - "github.com/mitchellh/go-homedir" - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" + "github.com/wagoodman/dive/dive" + "github.com/wagoodman/dive/dive/filetree" + "github.com/wagoodman/dive/internal/log" + "github.com/wagoodman/dive/internal/logger" + "github.com/wagoodman/dive/runtime" + "github.com/wagoodman/dive/runtime/config" ) +var appConfig *config.ApplicationConfig var cfgFile string var exportFile string var ciConfigFile string @@ -60,12 +60,16 @@ func initCli() { for _, key := range []string{"lowestEfficiency", "highestWastedBytes", "highestUserWastedPercent"} { if err := ciConfig.BindPFlag(fmt.Sprintf("rules.%s", key), rootCmd.Flags().Lookup(key)); err != nil { - log.Fatalf("Unable to bind '%s' flag: %v", key, err) + panic(fmt.Errorf("unable to bind '%s' flag: %v", key, err)) } } if err := ciConfig.BindPFlag("ignore-errors", rootCmd.PersistentFlags().Lookup("ignore-errors")); err != nil { - log.Fatalf("Unable to bind 'ignore-errors' flag: %v", err) + panic(fmt.Errorf("unable to bind 'ignore-errors' flag: %w", err)) + } + + if err := viper.BindPFlag("source", rootCmd.PersistentFlags().Lookup("source")); err != nil { + panic(fmt.Errorf("unable to bind 'source' flag: %w", err)) } } @@ -73,143 +77,25 @@ func initCli() { func initConfig() { var err error - //viper.SetDefault("log.level", log.InfoLevel.String()) - viper.SetDefault("log.level", "debug") - viper.SetDefault("log.path", "./dive.log") - viper.SetDefault("log.enabled", true) - // keybindings: status view / global - // keybindings: status view / global - viper.SetDefault("keybinding.quit", "Ctrl+C") - viper.SetDefault("keybinding.toggle-view", "Tab") - viper.SetDefault("keybinding.filter-files", "Ctrl+f") - // keybindings: layer view - viper.SetDefault("keybinding.compare-all", "Ctrl+A") - viper.SetDefault("keybinding.compare-layer", "Ctrl+L") - // keybindings: filetree view - viper.SetDefault("keybinding.toggle-collapse-dir", "Space") - viper.SetDefault("keybinding.toggle-collapse-all-dir", "Ctrl+Space") - viper.SetDefault("keybinding.toggle-filetree-attributes", "Ctrl+B") - viper.SetDefault("keybinding.toggle-added-files", "Ctrl+A") - viper.SetDefault("keybinding.toggle-removed-files", "Ctrl+R") - viper.SetDefault("keybinding.toggle-modified-files", "Ctrl+N") - viper.SetDefault("keybinding.toggle-unmodified-files", "Ctrl+U") - viper.SetDefault("keybinding.toggle-wrap-tree", "Ctrl+P") - viper.SetDefault("keybinding.page-up", "PgUp") - viper.SetDefault("keybinding.page-down", "PgDn") - - viper.SetDefault("diff.hide", "") - - viper.SetDefault("layer.show-aggregated-changes", false) - - viper.SetDefault("filetree.collapse-dir", false) - viper.SetDefault("filetree.pane-width", 0.5) - viper.SetDefault("filetree.show-attributes", true) - - viper.SetDefault("container-engine", "docker") - viper.SetDefault("ignore-errors", false) - - err = viper.BindPFlag("source", rootCmd.PersistentFlags().Lookup("source")) + appConfig, err = config.LoadApplicationConfig(viper.GetViper(), cfgFile) if err != nil { - fmt.Println(err) - os.Exit(1) - } - - viper.SetEnvPrefix("DIVE") - // replace all - with _ when looking for matching environment variables - viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) - viper.AutomaticEnv() - - // if config files are present, load them - if cfgFile == "" { - // default configs are ignored if not found - filepathToCfg := getDefaultCfgFile() - viper.SetConfigFile(filepathToCfg) - } else { - viper.SetConfigFile(cfgFile) - } - err = viper.ReadInConfig() - if err == nil { - fmt.Println("Using config file:", viper.ConfigFileUsed()) - } else if cfgFile != "" { - fmt.Println(err) - os.Exit(0) + panic(err) } - // set global defaults (for performance) - filetree.GlobalFileTreeCollapse = viper.GetBool("filetree.collapse-dir") + // set global defaults + filetree.GlobalFileTreeCollapse = appConfig.FileTree.CollapseDir } // initLogging sets up the logging object with a formatter and location func initLogging() { - var logFileObj *os.File - var err error - - if viper.GetBool("log.enabled") { - logFileObj, err = os.OpenFile(viper.GetString("log.path"), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) - log.SetOutput(logFileObj) - } else { - log.SetOutput(ioutil.Discard) + logCfg := logger.LogrusConfig{ + EnableConsole: false, + EnableFile: appConfig.Log.Enabled, + FileLocation: appConfig.Log.Path, + Level: appConfig.Log.Level, } + runtime.SetLogger(logger.NewLogrusLogger(logCfg)) - if err != nil { - fmt.Fprintln(os.Stderr, err) - } - - Formatter := new(log.TextFormatter) - Formatter.DisableTimestamp = true - log.SetFormatter(Formatter) - - level, err := log.ParseLevel(viper.GetString("log.level")) - if err != nil { - fmt.Fprintln(os.Stderr, err) - } - - log.SetLevel(level) - log.Debug("Starting Dive...") - log.Debugf("config filepath: %s", viper.ConfigFileUsed()) - for k, v := range viper.AllSettings() { - log.Debug("config value: ", k, " : ", v) - } -} - -// getDefaultCfgFile checks for config file in paths from xdg specs -// and in $HOME/.config/dive/ directory -// defaults to $HOME/.dive.yaml -func getDefaultCfgFile() string { - home, err := homedir.Dir() - if err != nil { - fmt.Println(err) - os.Exit(0) - } - - xdgHome := os.Getenv("XDG_CONFIG_HOME") - xdgDirs := os.Getenv("XDG_CONFIG_DIRS") - xdgPaths := append([]string{xdgHome}, strings.Split(xdgDirs, ":")...) - allDirs := append(xdgPaths, path.Join(home, ".config")) - - for _, val := range allDirs { - file := findInPath(val) - if len(file) > 0 { - return file - } - } - return path.Join(home, ".dive.yaml") -} - -// findInPath returns first "*.yaml" file in path's subdirectory "dive" -// if not found returns empty string -func findInPath(pathTo string) string { - directory := path.Join(pathTo, "dive") - files, err := ioutil.ReadDir(directory) - if err != nil { - return "" - } - - for _, file := range files { - filename := file.Name() - if path.Ext(filename) == ".yaml" { - return path.Join(directory, filename) - } - } - return "" + log.Debug("starting dive") + log.Debug("config contents:\n", appConfig.String()) } diff --git a/dive/filetree/comparer.go b/dive/filetree/comparer.go index 1df52a7..29ebafc 100644 --- a/dive/filetree/comparer.go +++ b/dive/filetree/comparer.go @@ -2,7 +2,8 @@ package filetree import ( "fmt" - "github.com/sirupsen/logrus" + + "github.com/wagoodman/dive/internal/log" ) type TreeIndexKey struct { @@ -77,7 +78,7 @@ func (cmp *Comparer) get(key TreeIndexKey) (*FileTree, []PathError, error) { markPathErrors, err := newTree.CompareAndMark(cmp.refTrees[idx]) pathErrors = append(pathErrors, markPathErrors...) if err != nil { - logrus.Errorf("error while building tree: %+v", err) + log.Errorf("error while building tree: %+v", err) return nil, nil, err } } diff --git a/dive/filetree/efficiency.go b/dive/filetree/efficiency.go index cdb6b4f..ac315a4 100644 --- a/dive/filetree/efficiency.go +++ b/dive/filetree/efficiency.go @@ -3,7 +3,7 @@ package filetree import ( "sort" - "github.com/sirupsen/logrus" + "github.com/wagoodman/dive/internal/log" ) // EfficiencyData represents the storage and reference statistics for a given file tree path. @@ -65,11 +65,11 @@ func Efficiency(trees []*FileTree) (float64, EfficiencySlice) { stackedTree, failedPaths, err := StackTreeRange(trees, 0, currentTree-1) if len(failedPaths) > 0 { for _, path := range failedPaths { - logrus.Errorf(path.String()) + log.Errorf(path.String()) } } if err != nil { - logrus.Errorf("unable to stack tree range: %+v", err) + log.Errorf("unable to stack tree range: %+v", err) return err } @@ -81,7 +81,7 @@ func Efficiency(trees []*FileTree) (float64, EfficiencySlice) { if previousTreeNode.Data.FileInfo.IsDir { err = previousTreeNode.VisitDepthChildFirst(sizer, nil) if err != nil { - logrus.Errorf("unable to propagate whiteout dir: %+v", err) + log.Errorf("unable to propagate whiteout dir: %+v", err) return err } } @@ -109,7 +109,7 @@ func Efficiency(trees []*FileTree) (float64, EfficiencySlice) { currentTree = idx err := tree.VisitDepthChildFirst(visitor, visitEvaluator) if err != nil { - logrus.Errorf("unable to propagate ref tree: %+v", err) + log.Errorf("unable to propagate ref tree: %+v", err) } } diff --git a/dive/filetree/file_info.go b/dive/filetree/file_info.go index 788ac3c..60e573a 100644 --- a/dive/filetree/file_info.go +++ b/dive/filetree/file_info.go @@ -2,10 +2,11 @@ package filetree import ( "archive/tar" - "github.com/cespare/xxhash" - "github.com/sirupsen/logrus" "io" "os" + + "github.com/cespare/xxhash" + "github.com/wagoodman/dive/internal/log" ) // FileInfo contains tar metadata for a specific FileNode @@ -54,7 +55,7 @@ func NewFileInfo(realPath, path string, info os.FileInfo) FileInfo { linkName, err = os.Readlink(realPath) if err != nil { - logrus.Panic("unable to read link:", realPath, err) + log.Errorf("unable to read link=%q : %+v", realPath, err) } } else if info.IsDir() { @@ -69,7 +70,7 @@ func NewFileInfo(realPath, path string, info os.FileInfo) FileInfo { if fileType != tar.TypeDir { file, err := os.Open(realPath) if err != nil { - logrus.Panic("unable to read file:", realPath) + log.Errorf("unable to read file: %s", realPath) } defer file.Close() hash = getHashFromReader(file) @@ -127,7 +128,7 @@ func getHashFromReader(reader io.Reader) uint64 { for { n, err := reader.Read(buf) if err != nil && err != io.EOF { - logrus.Panic(err) + log.Error(err) } if n == 0 { break @@ -135,7 +136,7 @@ func getHashFromReader(reader io.Reader) uint64 { _, err = h.Write(buf[:n]) if err != nil { - logrus.Panic(err) + log.Error(err) } } diff --git a/dive/filetree/file_node.go b/dive/filetree/file_node.go index 106a34d..ec3b6fd 100644 --- a/dive/filetree/file_node.go +++ b/dive/filetree/file_node.go @@ -6,11 +6,10 @@ import ( "sort" "strings" - "github.com/sirupsen/logrus" - "github.com/wagoodman/dive/runtime/ui/format" - "github.com/dustin/go-humanize" "github.com/phayes/permbits" + "github.com/wagoodman/dive/internal/log" + "github.com/wagoodman/dive/runtime/ui/format" ) const ( @@ -173,7 +172,7 @@ func (node *FileNode) MetadataString() string { err := node.VisitDepthChildFirst(sizer, nil) if err != nil { - logrus.Errorf("unable to propagate node for metadata: %+v", err) + log.Errorf("unable to propagate node for metadata: %+v", err) } } diff --git a/dive/filetree/file_tree.go b/dive/filetree/file_tree.go index dc639de..edfb22f 100644 --- a/dive/filetree/file_tree.go +++ b/dive/filetree/file_tree.go @@ -6,8 +6,9 @@ import ( "sort" "strings" + "github.com/wagoodman/dive/internal/log" + "github.com/google/uuid" - "github.com/sirupsen/logrus" ) const ( @@ -52,8 +53,7 @@ type renderParams struct { isLast bool } - - // renderStringTreeBetween returns a string representing the given tree between the given rows. Since each node +// renderStringTreeBetween returns a string representing the given tree between the given rows. Since each node // is rendered on its own line, the returned string shows the visible nodes not affected by a collapsed parent. func (tree *FileTree) renderStringTreeBetween(startRow, stopRow int, showAttributes bool) string { // generate a list of nodes to render @@ -75,7 +75,7 @@ func (tree *FileTree) renderStringTreeBetween(startRow, stopRow int, showAttribu // we should always visit nodes in order sort.Strings(keys) lastIndex := len(keys) - 1 - for ; lastIndex > 0; lastIndex--{ + for ; lastIndex > 0; lastIndex-- { key := keys[lastIndex] if currentParams.node.Children[key].Data.ViewInfo.Hidden { continue @@ -158,7 +158,7 @@ func (tree *FileTree) VisibleSize() int { } err := tree.VisitDepthParentFirst(visitor, visitEvaluator) if err != nil { - logrus.Errorf("unable to determine visible tree size: %+v", err) + log.Errorf("unable to determine visible tree size: %+v", err) } // don't include root @@ -191,7 +191,7 @@ func (tree *FileTree) Copy() *FileTree { }, nil) if err != nil { - logrus.Errorf("unable to propagate tree on copy(): %+v", err) + log.Errorf("unable to propagate tree on copy(): %+v", err) } return newTree @@ -393,7 +393,7 @@ func StackTreeRange(trees []*FileTree, start, stop int) (*FileTree, []PathError, errors = append(errors, failedPaths...) } if err != nil { - logrus.Errorf("could not stack tree range: %v", err) + log.Errorf("could not stack tree range: %v", err) return nil, nil, err } } diff --git a/dive/image/docker/config.go b/dive/image/docker/config.go index 0efcb57..5b708bf 100644 --- a/dive/image/docker/config.go +++ b/dive/image/docker/config.go @@ -2,7 +2,6 @@ package docker import ( "encoding/json" - "github.com/sirupsen/logrus" ) type config struct { @@ -28,7 +27,7 @@ func newConfig(configBytes []byte) config { var imageConfig config err := json.Unmarshal(configBytes, &imageConfig) if err != nil { - logrus.Panic(err) + panic(err) } layerIdx := 0 diff --git a/dive/image/docker/manifest.go b/dive/image/docker/manifest.go index b08ee05..98546f3 100644 --- a/dive/image/docker/manifest.go +++ b/dive/image/docker/manifest.go @@ -2,7 +2,6 @@ package docker import ( "encoding/json" - "github.com/sirupsen/logrus" ) type manifest struct { @@ -15,7 +14,7 @@ func newManifest(manifestBytes []byte) manifest { var manifest []manifest err := json.Unmarshal(manifestBytes, &manifest) if err != nil { - logrus.Panic(err) + panic(err) } return manifest[0] } @@ -3,28 +3,33 @@ module github.com/wagoodman/dive go 1.13 require ( + github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 // indirect github.com/OneOfOne/xxhash v1.2.8 // indirect + github.com/buildpacks/imgutil v0.0.0-20200805143852-1844b230530d // indirect github.com/buildpacks/lifecycle v0.7.2 - github.com/buildpacks/pack v0.14.2 github.com/cespare/xxhash v1.1.0 + github.com/containerd/containerd v1.3.3 // indirect github.com/docker/cli v20.10.0-beta1+incompatible github.com/docker/docker v1.4.2-0.20200221181110-62bd5a33f707 github.com/dustin/go-humanize v1.0.0 github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/gdamore/tcell/v2 v2.1.0 + github.com/gogo/protobuf v1.3.1 // indirect + github.com/golang/mock v1.4.1 // indirect github.com/golang/protobuf v1.4.3 // indirect github.com/google/go-cmp v0.5.2 // indirect + github.com/google/go-containerregistry v0.0.0-20200313165449-955bf358a3d8 // indirect github.com/google/uuid v1.1.2 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect github.com/gorilla/mux v1.8.0 // indirect - github.com/jroimartin/gocui v0.4.0 + github.com/kr/text v0.2.0 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible github.com/lunixbochs/vtclean v1.0.0 github.com/magiconair/properties v1.8.4 // indirect github.com/mattn/go-colorable v0.1.8 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/mapstructure v1.3.3 // indirect - github.com/nsf/termbox-go v0.0.0-20200418040025-38ba6e5628f1 // indirect + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/pelletier/go-toml v1.8.1 // indirect github.com/phayes/permbits v0.0.0-20190612203442-39d7c581d2ee @@ -39,8 +44,8 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.7.1 github.com/stretchr/testify v1.6.1 // indirect + github.com/x-cray/logrus-prefixed-formatter v0.5.2 gitlab.com/tslocum/cbind v0.1.4 - go.uber.org/zap v1.10.0 golang.org/x/net v0.0.0-20201029055024-942e2f445f3c golang.org/x/sys v0.0.0-20201218084310-7d0127a74742 // indirect golang.org/x/text v0.3.4 // indirect @@ -51,7 +56,7 @@ require ( google.golang.org/protobuf v1.25.0 // indirect gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect gopkg.in/ini.v1 v1.62.0 // indirect - gopkg.in/yaml.v2 v2.3.0 // indirect + gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect gotest.tools/v3 v3.0.3 // indirect ) @@ -1,4 +1,3 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= cloud.google.com/go v0.26.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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -35,13 +34,9 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= @@ -50,24 +45,16 @@ github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/apex/log v1.1.2-0.20190827100214-baa5455d1012 h1:r9k3B0K539tmbDOdyCIuz/6qtn8q+lp+qvEStcFUIdM= github.com/apex/log v1.1.2-0.20190827100214-baa5455d1012/go.mod h1:Ls949n1HFtXfbDcjiTTFQqkVUrte0puoIBfO3SVgwOA= -github.com/apex/log v1.1.2 h1:bnDuVoi+o98wOdVqfEzNDlY0tcmBia7r4YkjS9EqGYk= -github.com/apex/log v1.1.2/go.mod h1:SyfRweFO+TlkIJ3DVizTSeI1xk7jOIIqOnUPZQTTsww= -github.com/apex/logs v0.0.3/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= |