diff --git a/README.md b/README.md index 09be352..7e4c973 100644 --- a/README.md +++ b/README.md @@ -122,19 +122,19 @@ log: path: ./dive.log level: info -# note: you can specify multiple bindings by separating values with a comma. -# note: UI hinting is derived from the first binding +# Note: you can specify multiple bindings by separating values with a comma. +# Note: UI hinting is derived from the first binding keybinding: - # global bindings + # Global bindings quit: ctrl+c toggle-view: tab, ctrl+space filter-files: ctrl+f, ctrl+slash - # layer view specific bindings + # Layer view specific bindings compare-all: ctrl+a compare-layer: ctrl+l - # file view specific bindings + # File view specific bindings toggle-collapse-dir: space toggle-added-files: ctrl+a toggle-removed-files: ctrl+r @@ -142,6 +142,19 @@ keybinding: toggle-unmodified-files: ctrl+u page-up: pgup page-down: pgdn + +diff: + # You can change the default files show in the filetree (right pane). All diff types are shown by default. + hide: + - added + - removed + - changed + - unchanged + +layer: + # Enable showing all changes from this layer and ever previous layer + show-aggregated-changes: false + ``` dive will search for configs in the following locations: diff --git a/cmd/root.go b/cmd/root.go index a53eebf..1447951 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -80,14 +80,14 @@ func initConfig() { viper.SetDefault("log.level", log.InfoLevel.String()) viper.SetDefault("log.path", "./dive.log") viper.SetDefault("log.enabled", true) - // status view / global + // keybindings: status view / global viper.SetDefault("keybinding.quit", "ctrl+c") viper.SetDefault("keybinding.toggle-view", "tab, ctrl+space") viper.SetDefault("keybinding.filter-files", "ctrl+f, ctrl+slash") - // layer view + // keybindings: layer view viper.SetDefault("keybinding.compare-all", "ctrl+a") viper.SetDefault("keybinding.compare-layer", "ctrl+l") - // filetree view + // keybindings: filetree view viper.SetDefault("keybinding.toggle-collapse-dir", "space") viper.SetDefault("keybinding.toggle-added-files", "ctrl+a") viper.SetDefault("keybinding.toggle-removed-files", "ctrl+r") @@ -96,6 +96,9 @@ func initConfig() { viper.SetDefault("keybinding.page-up", "pgup") viper.SetDefault("keybinding.page-down", "pgdn") + viper.SetDefault("diff.hide", "") + viper.SetDefault("layer.show-aggregated-changes", false) + viper.AutomaticEnv() // read in environment variables that match // If a config file is found, read it in. diff --git a/ui/filetreeview.go b/ui/filetreeview.go index c304555..6312ef7 100644 --- a/ui/filetreeview.go +++ b/ui/filetreeview.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/sirupsen/logrus" "github.com/spf13/viper" + "github.com/wagoodman/dive/utils" "regexp" "strings" @@ -55,6 +56,22 @@ func NewFileTreeView(name string, gui *gocui.Gui, tree *filetree.FileTree, refTr treeView.RefTrees = refTrees treeView.HiddenDiffTypes = make([]bool, 4) + hiddenTypes := viper.GetStringSlice("diff.hide") + for _, hType := range hiddenTypes { + switch t := strings.ToLower(hType); t { + case "added": + treeView.HiddenDiffTypes[filetree.Added] = true + case "removed": + treeView.HiddenDiffTypes[filetree.Removed] = true + case "changed": + treeView.HiddenDiffTypes[filetree.Changed] = true + case "unchanged": + treeView.HiddenDiffTypes[filetree.Unchanged] = true + default: + utils.PrintAndExit(fmt.Sprintf("unknown diff.hide value: %s", t)) + } + } + treeView.keybindingToggleCollapse = getKeybindings(viper.GetString("keybinding.toggle-collapse-dir")) treeView.keybindingToggleAdded = getKeybindings(viper.GetString("keybinding.toggle-added-files")) treeView.keybindingToggleRemoved = getKeybindings(viper.GetString("keybinding.toggle-removed-files")) diff --git a/ui/layerview.go b/ui/layerview.go index cf8a8a6..d856f01 100644 --- a/ui/layerview.go +++ b/ui/layerview.go @@ -3,6 +3,7 @@ package ui import ( "fmt" "github.com/spf13/viper" + "github.com/wagoodman/dive/utils" "github.com/dustin/go-humanize" "github.com/jroimartin/gocui" @@ -35,7 +36,15 @@ func NewLayerView(name string, gui *gocui.Gui, layers []*image.Layer) (layerView layerView.Name = name layerView.gui = gui layerView.Layers = layers - layerView.CompareMode = CompareLayer + + switch mode := viper.GetBool("layer.show-aggregated-changes"); mode { + case true: + layerView.CompareMode = CompareAll + case false: + layerView.CompareMode = CompareLayer + default: + utils.PrintAndExit(fmt.Sprintf("unknown layer.show-aggregated-changes value: %s", mode)) + } layerView.keybindingCompareAll = getKeybindings(viper.GetString("keybinding.compare-all")) layerView.keybindingCompareLayer = getKeybindings(viper.GetString("keybinding.compare-layer")) diff --git a/ui/ui.go b/ui/ui.go index a55c197..13fb299 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -8,6 +8,7 @@ import ( "github.com/spf13/viper" "github.com/wagoodman/dive/filetree" "github.com/wagoodman/dive/image" + "github.com/wagoodman/dive/utils" "log" ) @@ -313,6 +314,7 @@ func Run(layers []*image.Layer, refTrees []*filetree.FileTree, efficiency float6 if err != nil { log.Panicln(err) } + utils.SetUi(g) defer g.Close() Views.lookup = make(map[string]View) @@ -347,4 +349,5 @@ func Run(layers []*image.Layer, refTrees []*filetree.FileTree, efficiency float6 if err := g.MainLoop(); err != nil && err != gocui.ErrQuit { log.Panicln(err) } + utils.Exit(0) } diff --git a/utils/exit.go b/utils/exit.go index 2f71a7e..df2abe3 100644 --- a/utils/exit.go +++ b/utils/exit.go @@ -1,10 +1,26 @@ package utils import ( + "fmt" + "github.com/jroimartin/gocui" "github.com/k0kubun/go-ansi" + "github.com/sirupsen/logrus" "os" ) +var ui *gocui.Gui + +func SetUi(g *gocui.Gui) { + ui = g +} + +func PrintAndExit(args ...interface{}) { + logrus.Println(args...) + Cleanup() + fmt.Println(args...) + os.Exit(1) +} + // Note: this should only be used when exiting from non-gocui code func Exit(rc int) { Cleanup() @@ -12,5 +28,8 @@ func Exit(rc int) { } func Cleanup() { + if ui != nil { + ui.Close() + } ansi.CursorShow() }