From 2a97e2b08a05b50e55c8049676f9eb46ef2216b4 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Sun, 4 Jan 2015 20:11:32 +0100 Subject: [PATCH] Add tree.Stat() --- progress.go | 22 ++++++++++++++++++++++ tree.go | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/progress.go b/progress.go index 29db56624..8bb427808 100644 --- a/progress.go +++ b/progress.go @@ -1,6 +1,7 @@ package restic import ( + "fmt" "sync" "time" ) @@ -163,3 +164,24 @@ func (s *Stat) Add(other Stat) { s.Files += other.Files s.Other += other.Other } + +func (s Stat) String() string { + b := float64(s.Bytes) + var str string + + switch { + case s.Bytes > 1<<40: + str = fmt.Sprintf("%.3f TiB", b/(1<<40)) + case s.Bytes > 1<<30: + str = fmt.Sprintf("%.3f GiB", b/(1<<30)) + case s.Bytes > 1<<20: + str = fmt.Sprintf("%.3f MiB", b/(1<<20)) + case s.Bytes > 1<<10: + str = fmt.Sprintf("%.3f KiB", b/(1<<10)) + default: + str = fmt.Sprintf("%dB", s.Bytes) + } + + return fmt.Sprintf("Stat(%d files, %d dirs, %d other, %v)", + s.Files, s.Dirs, s.Other, str) +} diff --git a/tree.go b/tree.go index 87a1ce106..db51404be 100644 --- a/tree.go +++ b/tree.go @@ -151,6 +151,24 @@ func (t Tree) Find(name string) (*Node, error) { return node, err } +func (t Tree) Stat() Stat { + s := Stat{} + for _, n := range t { + switch n.Type { + case "file": + s.Files++ + s.Bytes += n.Size + case "dir": + s.Dirs++ + s.Add(n.Tree.Stat()) + default: + s.Other++ + } + } + + return s +} + func (node *Node) fill_extra(path string, fi os.FileInfo) (err error) { stat, ok := fi.Sys().(*syscall.Stat_t) if !ok {