mostly working
This commit is contained in:
parent
ef2c76930f
commit
789643261f
@ -1,14 +1,14 @@
|
|||||||
package filetree
|
package filetree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"archive/tar"
|
||||||
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/fatih/color"
|
|
||||||
"fmt"
|
|
||||||
"github.com/phayes/permbits"
|
|
||||||
"github.com/dustin/go-humanize"
|
"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 (
|
const (
|
||||||
@ -16,11 +16,11 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type FileNode struct {
|
type FileNode struct {
|
||||||
Tree *FileTree
|
Tree *FileTree
|
||||||
Parent *FileNode
|
Parent *FileNode
|
||||||
Name string
|
Name string
|
||||||
Data NodeData
|
Data NodeData
|
||||||
Children map[string]*FileNode
|
Children map[string]*FileNode
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewNode(parent *FileNode, name string, data FileInfo) (node *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)
|
userGroup := fmt.Sprintf("%d:%d", user, group)
|
||||||
size := humanize.Bytes(uint64(node.Data.FileInfo.TarHeader.FileInfo().Size()))
|
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 {
|
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
|
// never visit the root node
|
||||||
if node != node.Tree.Root{
|
if node != node.Tree.Root {
|
||||||
err = visiter(node)
|
err = visiter(node)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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 {
|
func (node *FileNode) AssignDiffType(diffType DiffType) error {
|
||||||
|
@ -32,7 +32,7 @@ func NewCommandView(name string, gui *gocui.Gui) (commandview *CommandView) {
|
|||||||
return 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
|
// set view options
|
||||||
view.view = v
|
view.view = v
|
||||||
@ -80,8 +80,7 @@ func (view *CommandView) KeyHelp() string {
|
|||||||
|
|
||||||
func (view *CommandView) Render() error {
|
func (view *CommandView) Render() error {
|
||||||
view.gui.Update(func(g *gocui.Gui) error {
|
view.gui.Update(func(g *gocui.Gui) error {
|
||||||
view.view.Clear()
|
fmt.Fprintln(view.view, "")
|
||||||
fmt.Fprintln(view.view, "Filter: ")
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
@ -4,9 +4,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/fatih/color"
|
"github.com/fatih/color"
|
||||||
@ -108,12 +105,6 @@ func (view *FileTreeView) setLayer(layerIndex int) error {
|
|||||||
}
|
}
|
||||||
view.ModelTree.VisitDepthChildFirst(visitor, nil)
|
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.view.SetCursor(0, 0)
|
||||||
view.TreeIndex = 0
|
view.TreeIndex = 0
|
||||||
view.ModelTree = newTree
|
view.ModelTree = newTree
|
||||||
@ -197,31 +188,61 @@ func (view *FileTreeView) toggleShowDiffType(diffType filetree.DiffType) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func filterRegex() *regexp.Regexp {
|
func filterRegex() *regexp.Regexp {
|
||||||
|
debugPrint("Entered filterRegex()")
|
||||||
if Views.Command == nil || Views.Command.view == nil {
|
if Views.Command == nil || Views.Command.view == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var filterBytes []byte
|
filterString := strings.TrimSpace(Views.Command.view.Buffer())
|
||||||
read, err := Views.Command.view.Read(filterBytes)
|
if len(filterString) < 1 {
|
||||||
if read > 0 && err == nil {
|
debugPrint(fmt.Sprintf("returing nil from fitlerRegex() because string is too short (%s)", filterString))
|
||||||
regex, err := regexp.Compile(string(filterBytes))
|
return nil
|
||||||
if err == nil {
|
}
|
||||||
return regex
|
|
||||||
|
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() {
|
func (view *FileTreeView) updateViewTree() {
|
||||||
regex := filterRegex()
|
regex := filterRegex()
|
||||||
|
if regex == nil {
|
||||||
|
debugPrint("Nil regex in updateViewTree()")
|
||||||
|
}
|
||||||
// keep the view selection in parity with the current DiffType selection
|
// keep the view selection in parity with the current DiffType selection
|
||||||
view.ModelTree.VisitDepthChildFirst(func(node *filetree.FileNode) error {
|
view.ModelTree.VisitDepthChildFirst(func(node *filetree.FileNode) error {
|
||||||
node.Data.ViewInfo.Hidden = view.HiddenDiffTypes[node.Data.DiffType]
|
node.Data.ViewInfo.Hidden = view.HiddenDiffTypes[node.Data.DiffType]
|
||||||
if regex != nil {
|
visibleChild := false
|
||||||
match := regex.Find([]byte(node.Path()))
|
for _, child := range node.Children {
|
||||||
node.Data.ViewInfo.Hidden = match != nil
|
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
|
return nil
|
||||||
}, nil)
|
}, nil)
|
||||||
|
6
ui/ui.go
6
ui/ui.go
@ -10,7 +10,7 @@ import (
|
|||||||
"github.com/wagoodman/docker-image-explorer/image"
|
"github.com/wagoodman/docker-image-explorer/image"
|
||||||
)
|
)
|
||||||
|
|
||||||
const debug = false
|
const debug = true
|
||||||
|
|
||||||
var Formatting struct {
|
var Formatting struct {
|
||||||
Header func(...interface{}) string
|
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 {
|
func focusFilterView(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
debugPrint("focusFilterView()")
|
||||||
_, err := g.SetCurrentView(Views.Command.Name)
|
_, err := g.SetCurrentView(Views.Command.Name)
|
||||||
Render()
|
Render()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func returnToTreeView(g *gocui.Gui, v *gocui.View) error {
|
func returnToTreeView(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
debugPrint("returnToTreeView()")
|
||||||
_, err := g.SetCurrentView(Views.Tree.Name)
|
_, err := g.SetCurrentView(Views.Tree.Name)
|
||||||
Render()
|
Render()
|
||||||
return err
|
return err
|
||||||
@ -177,7 +179,7 @@ func layout(g *gocui.Gui) error {
|
|||||||
if err != gocui.ErrUnknownView {
|
if err != gocui.ErrUnknownView {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
Views.Command.Setup(view)
|
Views.Command.Setup(view, nil)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user