efficiency now takes into account removed dirs
This commit is contained in:
parent
fad2354e89
commit
183c687c06
@ -1,6 +1,7 @@
|
|||||||
package filetree
|
package filetree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
"sort"
|
"sort"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -36,6 +37,7 @@ func (efs EfficiencySlice) Less(i, j int) bool {
|
|||||||
func Efficiency(trees []*FileTree) (float64, EfficiencySlice) {
|
func Efficiency(trees []*FileTree) (float64, EfficiencySlice) {
|
||||||
efficiencyMap := make(map[string]*EfficiencyData)
|
efficiencyMap := make(map[string]*EfficiencyData)
|
||||||
inefficientMatches := make(EfficiencySlice, 0)
|
inefficientMatches := make(EfficiencySlice, 0)
|
||||||
|
currentTree := 0
|
||||||
|
|
||||||
visitor := func(node *FileNode) error {
|
visitor := func(node *FileNode) error {
|
||||||
path := node.Path()
|
path := node.Path()
|
||||||
@ -47,9 +49,34 @@ func Efficiency(trees []*FileTree) (float64, EfficiencySlice) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
data := efficiencyMap[path]
|
data := efficiencyMap[path]
|
||||||
data.CumulativeSize += node.Data.FileInfo.TarHeader.Size
|
|
||||||
if data.minDiscoveredSize < 0 || node.Data.FileInfo.TarHeader.Size < data.minDiscoveredSize {
|
// this node may have had children that were deleted, however, we won't explicitly list out every child, only
|
||||||
data.minDiscoveredSize = node.Data.FileInfo.TarHeader.Size
|
// the top-most parent with the cumulative size. These operations will need to be done on the full (stacked)
|
||||||
|
// tree.
|
||||||
|
// Note: whiteout files may also represent directories, so we need to find out if this was previously a file or dir.
|
||||||
|
var sizeBytes int64
|
||||||
|
|
||||||
|
if node.IsWhiteout() {
|
||||||
|
sizer := func(curNode *FileNode) error {
|
||||||
|
sizeBytes += curNode.Data.FileInfo.TarHeader.FileInfo().Size()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
stackedTree := StackRange(trees, 0, currentTree-1)
|
||||||
|
previousTreeNode, err := stackedTree.GetNode(node.Path())
|
||||||
|
if err != nil {
|
||||||
|
logrus.Fatal(err)
|
||||||
|
}
|
||||||
|
if previousTreeNode.Data.FileInfo.TarHeader.FileInfo().IsDir() {
|
||||||
|
previousTreeNode.VisitDepthChildFirst(sizer, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
sizeBytes = node.Data.FileInfo.TarHeader.FileInfo().Size()
|
||||||
|
}
|
||||||
|
|
||||||
|
data.CumulativeSize += sizeBytes
|
||||||
|
if data.minDiscoveredSize < 0 || sizeBytes < data.minDiscoveredSize {
|
||||||
|
data.minDiscoveredSize = sizeBytes
|
||||||
}
|
}
|
||||||
data.Nodes = append(data.Nodes, node)
|
data.Nodes = append(data.Nodes, node)
|
||||||
|
|
||||||
@ -62,7 +89,8 @@ func Efficiency(trees []*FileTree) (float64, EfficiencySlice) {
|
|||||||
visitEvaluator := func(node *FileNode) bool {
|
visitEvaluator := func(node *FileNode) bool {
|
||||||
return node.IsLeaf()
|
return node.IsLeaf()
|
||||||
}
|
}
|
||||||
for _, tree := range trees {
|
for idx, tree := range trees {
|
||||||
|
currentTree = idx
|
||||||
tree.VisitDepthChildFirst(visitor, visitEvaluator)
|
tree.VisitDepthChildFirst(visitor, visitEvaluator)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ func (view *DetailsView) CursorUp() error {
|
|||||||
// Update refreshes the state objects for future rendering. Note: we only need to update this view upon the initial tree load
|
// Update refreshes the state objects for future rendering. Note: we only need to update this view upon the initial tree load
|
||||||
func (view *DetailsView) Update() error {
|
func (view *DetailsView) Update() error {
|
||||||
layerTrees := Views.Tree.RefTrees
|
layerTrees := Views.Tree.RefTrees
|
||||||
view.efficiency, view.inefficiencies = filetree.Efficiency(layerTrees[:len(layerTrees)-1])
|
view.efficiency, view.inefficiencies = filetree.Efficiency(layerTrees)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,9 +98,6 @@ func (view *DetailsView) Render() error {
|
|||||||
inefficiencyReport := fmt.Sprintf(Formatting.Header(template), "Count", "Total Space", "Path")
|
inefficiencyReport := fmt.Sprintf(Formatting.Header(template), "Count", "Total Space", "Path")
|
||||||
for idx := len(view.inefficiencies) - 1; idx >= 0; idx-- {
|
for idx := len(view.inefficiencies) - 1; idx >= 0; idx-- {
|
||||||
data := view.inefficiencies[idx]
|
data := view.inefficiencies[idx]
|
||||||
if data.CumulativeSize == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
trueInefficiencies++
|
trueInefficiencies++
|
||||||
wastedSpace += data.CumulativeSize
|
wastedSpace += data.CumulativeSize
|
||||||
inefficiencyReport += fmt.Sprintf(template, strconv.Itoa(len(data.Nodes)), humanize.Bytes(uint64(data.CumulativeSize)), data.Path)
|
inefficiencyReport += fmt.Sprintf(template, strconv.Itoa(len(data.Nodes)), humanize.Bytes(uint64(data.CumulativeSize)), data.Path)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user