Compare commits

..

2 commits

Author SHA1 Message Date
644c71f7d9
Use the max height of the terminal 2020-03-08 21:43:01 +01:00
36dbfead9c
Improve cli experience 2020-03-08 20:58:13 +01:00
2 changed files with 73 additions and 8 deletions

View file

@ -3,9 +3,12 @@ package main
import ( import (
"flag" "flag"
"fmt" "fmt"
"log"
"os"
"time" "time"
"git.lattuga.net/blallo/ruspa/tree" "git.lattuga.net/blallo/ruspa/tree"
"golang.org/x/crypto/ssh/terminal"
) )
type UnitValue struct { type UnitValue struct {
@ -41,15 +44,38 @@ func (u *UnitValue) Set(value string) error {
} }
} }
func min(a, b int) int {
if a < b {
return a
}
return b
}
func main() { func main() {
var path string var path string
var depth int var depth int
var root tree.Node var root tree.Node
var interval time.Duration
var unit = &UnitValue{unit: "KB"} var unit = &UnitValue{unit: "KB"}
flag.StringVar(&path, "path", ".", "Path from where to start the walk from") cli := flag.NewFlagSet(os.Args[0], flag.ExitOnError)
flag.IntVar(&depth, "depth", 0, "Depth to display") cli.IntVar(&depth, "depth", 0, "Depth to display")
flag.Var(unit, "unit", "Unit in which to report size") cli.Var(unit, "unit", "Unit in which to report size")
flag.Parse() cli.DurationVar(&interval, "interval", 100*time.Millisecond, "The update interval")
cli.Usage = func() {
fmt.Fprintf(cli.Output(), "Usage:\n%s [opts] [PATH]\n\n PATH: the root path to start from. Defaults to $PWD.\n\nopts:\n", os.Args[0])
cli.PrintDefaults()
}
cli.Parse(os.Args[1:])
switch narg := cli.NArg(); narg {
case 0:
path = "."
case 1:
path = cli.Args()[0]
default:
fmt.Fprintln(os.Stderr, "Too many arguments")
os.Exit(-1)
}
if depth == 0 || !tree.AnyDirectoryDownThere(path) { if depth == 0 || !tree.AnyDirectoryDownThere(path) {
root = tree.NewSingle(path) root = tree.NewSingle(path)
@ -57,13 +83,27 @@ func main() {
root = tree.NewTop(path) root = tree.NewTop(path)
} }
root.SetUnit(unit.String()) root.SetUnit(unit.String())
go root.Spawn(depth) out := log.New(os.Stdout, "", 0)
go root.Spawn(depth)
_, height, err := terminal.GetSize(int(os.Stdin.Fd()))
if err != nil {
fmt.Fprintln(os.Stderr, "Could not get terminal size")
os.Exit(1)
}
firstRound := true
for { for {
select { select {
case <-time.After(500 * time.Millisecond): case <-time.After(interval):
fmt.Printf("\033[H\033[2J") if !firstRound {
fmt.Println(root) depth := min(root.Depth()+2, height)
out.Printf("\r\033[%dA", depth)
} else {
out.Print("\r\033[A")
}
out.Print(root)
firstRound = false
if root.Complete() { if root.Complete() {
return return
} }

View file

@ -35,6 +35,7 @@ type Node interface {
Level() int Level() int
Name() string Name() string
Complete() bool Complete() bool
Depth() int
} }
////////////////////////////// //////////////////////////////
@ -128,6 +129,14 @@ func (t *Top) Complete() bool {
return true return true
} }
func (t *Top) Depth() int {
var depth int
for _, child := range t.tree {
depth += child.Depth()
}
return depth
}
func (t *Top) String() string { func (t *Top) String() string {
var out string var out string
var lines []string var lines []string
@ -280,6 +289,14 @@ func (i *Intermediate) Complete() bool {
return true return true
} }
func (i *Intermediate) Depth() int {
var depth int
for _, child := range i.tree {
depth += child.Depth()
}
return depth
}
func (i *Intermediate) String() string { func (i *Intermediate) String() string {
var lines []string var lines []string
out := fmt.Sprintf("(%s) %s\n", fmtSize(i.Size(), i.GetUnit()), i.Name()) out := fmt.Sprintf("(%s) %s\n", fmtSize(i.Size(), i.GetUnit()), i.Name())
@ -409,6 +426,10 @@ func (b *Bottom) Complete() bool {
return b.complete return b.complete
} }
func (b *Bottom) Depth() int {
return 1
}
func (b *Bottom) String() string { func (b *Bottom) String() string {
return fmt.Sprintf("(%s) %s", fmtSize(b.Size(), b.GetUnit()), b.Name()) return fmt.Sprintf("(%s) %s", fmtSize(b.Size(), b.GetUnit()), b.Name())
} }
@ -476,6 +497,10 @@ func (s *Single) Complete() bool {
return s.complete return s.complete
} }
func (s *Single) Depth() int {
return 1
}
func (s *Single) String() string { func (s *Single) String() string {
return fmt.Sprintf("(%s) %s\n", fmtSize(s.Size(), s.GetUnit()), s.Name()) return fmt.Sprintf("(%s) %s\n", fmtSize(s.Size(), s.GetUnit()), s.Name())
} }