From 789643261f44d6ddf6bc9020ec8558d2f5110412 Mon Sep 17 00:00:00 2001 From: Will Murphy Date: Sun, 24 Jun 2018 15:04:29 -0400 Subject: [PATCH] mostly working --- filetree/node.go | 24 ++++++++--------- ui/commandview.go | 5 ++-- ui/filetreeview.go | 65 ++++++++++++++++++++++++++++++---------------- ui/ui.go | 6 +++-- 4 files changed, 61 insertions(+), 39 deletions(-) diff --git a/filetree/node.go b/filetree/node.go index 979ecf1..05596b4 100644 --- a/filetree/node.go +++ b/filetree/node.go @@ -1,14 +1,14 @@ package filetree import ( + "archive/tar" + "fmt" "sort" "strings" - "github.com/fatih/color" - "fmt" - "github.com/phayes/permbits" "github.com/dustin/go-humanize" - "github.com/wagoodman/docker-image-explorer/_vendor-20180604210951/github.com/Microsoft/go-winio/archive/tar" + "github.com/fatih/color" + "github.com/phayes/permbits" ) const ( @@ -16,11 +16,11 @@ const ( ) type FileNode struct { - Tree *FileTree - Parent *FileNode - Name string - Data NodeData - Children map[string]*FileNode + Tree *FileTree + Parent *FileNode + Name string + Data NodeData + Children map[string]*FileNode } func NewNode(parent *FileNode, name string, data FileInfo) (node *FileNode) { @@ -125,7 +125,7 @@ func (node *FileNode) MetadataString() string { userGroup := fmt.Sprintf("%d:%d", user, group) size := humanize.Bytes(uint64(node.Data.FileInfo.TarHeader.FileInfo().Size())) - return style.Sprint(fmt.Sprintf(AttributeFormat,dir, fileMode, userGroup, size)) + return style.Sprint(fmt.Sprintf(AttributeFormat, dir, fileMode, userGroup, size)) } func (node *FileNode) VisitDepthChildFirst(visiter Visiter, evaluator VisitEvaluator) error { @@ -161,7 +161,7 @@ func (node *FileNode) VisitDepthParentFirst(visiter Visiter, evaluator VisitEval } // never visit the root node - if node != node.Tree.Root{ + if node != node.Tree.Root { err = visiter(node) if err != nil { return err @@ -225,7 +225,7 @@ func (node *FileNode) deriveDiffType(diffType DiffType) error { } - return node.AssignDiffType(myDiffType) + return node.AssignDiffType(myDiffType) } func (node *FileNode) AssignDiffType(diffType DiffType) error { diff --git a/ui/commandview.go b/ui/commandview.go index d94e471..f10eb59 100644 --- a/ui/commandview.go +++ b/ui/commandview.go @@ -32,7 +32,7 @@ func NewCommandView(name string, gui *gocui.Gui) (commandview *CommandView) { return commandview } -func (view *CommandView) Setup(v *gocui.View) error { +func (view *CommandView) Setup(v *gocui.View, header *gocui.View) error { // set view options view.view = v @@ -80,8 +80,7 @@ func (view *CommandView) KeyHelp() string { func (view *CommandView) Render() error { view.gui.Update(func(g *gocui.Gui) error { - view.view.Clear() - fmt.Fprintln(view.view, "Filter: ") + fmt.Fprintln(view.view, "") return nil }) diff --git a/ui/filetreeview.go b/ui/filetreeview.go index ad9bd6a..285c3ab 100644 --- a/ui/filetreeview.go +++ b/ui/filetreeview.go @@ -4,9 +4,6 @@ import ( "errors" "fmt" "regexp" - - "strings" - "strings" "github.com/fatih/color" @@ -108,12 +105,6 @@ func (view *FileTreeView) setLayer(layerIndex int) error { } view.ModelTree.VisitDepthChildFirst(visitor, nil) - if debug { - v, _ := view.gui.View("debug") - v.Clear() - _, _ = fmt.Fprintln(v, view.RefTrees[layerIndex]) - } - view.view.SetCursor(0, 0) view.TreeIndex = 0 view.ModelTree = newTree @@ -197,31 +188,61 @@ func (view *FileTreeView) toggleShowDiffType(diffType filetree.DiffType) error { } func filterRegex() *regexp.Regexp { + debugPrint("Entered filterRegex()") if Views.Command == nil || Views.Command.view == nil { return nil } - var filterBytes []byte - read, err := Views.Command.view.Read(filterBytes) - if read > 0 && err == nil { - regex, err := regexp.Compile(string(filterBytes)) - if err == nil { - return regex + filterString := strings.TrimSpace(Views.Command.view.Buffer()) + if len(filterString) < 1 { + debugPrint(fmt.Sprintf("returing nil from fitlerRegex() because string is too short (%s)", filterString)) + return nil + } + + debugPrint("Compiling regex from " + filterString) + regex, err := regexp.Compile(filterString) + if err != nil { + debugPrint("Returning nil from filterRegex") + return nil + } + + return regex +} + +func debugPrint(s string) { + if debug && Views.Tree != nil && Views.Tree.gui != nil { + v, _ := Views.Tree.gui.View("debug") + if v != nil { + if len(v.ViewBuffer()) > 100 { + v.Clear() + } + _, _ = fmt.Fprintln(v, s) } } - if read > 0 && err != nil { - panic(err) - } - return nil } func (view *FileTreeView) updateViewTree() { regex := filterRegex() + if regex == nil { + debugPrint("Nil regex in updateViewTree()") + } // keep the view selection in parity with the current DiffType selection view.ModelTree.VisitDepthChildFirst(func(node *filetree.FileNode) error { node.Data.ViewInfo.Hidden = view.HiddenDiffTypes[node.Data.DiffType] - if regex != nil { - match := regex.Find([]byte(node.Path())) - node.Data.ViewInfo.Hidden = match != nil + visibleChild := false + for _, child := range node.Children { + if !child.Data.ViewInfo.Hidden { + visibleChild = true + } + } + if regex != nil && !visibleChild { + match := regex.FindString(node.Path()) + node.Data.ViewInfo.Hidden = len(match) == 0 + debugPrint(fmt.Sprintf("Not nil regex, match was %s", string(match))) + if len(match) == 0 { + debugPrint(fmt.Sprintf("Hiding '%s' because of failure to match /%v/", node.Path(), regex)) + } else { + debugPrint(fmt.Sprintf("Showing '%s' because of matching /%v/", node.Path(), regex)) + } } return nil }, nil) diff --git a/ui/ui.go b/ui/ui.go index 10cf544..3b7a2f8 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -10,7 +10,7 @@ import ( "github.com/wagoodman/docker-image-explorer/image" ) -const debug = false +const debug = true var Formatting struct { Header func(...interface{}) string @@ -45,12 +45,14 @@ func toggleView(g *gocui.Gui, v *gocui.View) error { } func focusFilterView(g *gocui.Gui, v *gocui.View) error { + debugPrint("focusFilterView()") _, err := g.SetCurrentView(Views.Command.Name) Render() return err } func returnToTreeView(g *gocui.Gui, v *gocui.View) error { + debugPrint("returnToTreeView()") _, err := g.SetCurrentView(Views.Tree.Name) Render() return err @@ -177,7 +179,7 @@ func layout(g *gocui.Gui) error { if err != gocui.ErrUnknownView { return err } - Views.Command.Setup(view) + Views.Command.Setup(view, nil) }