github.com/mckael/restic@v0.8.3/cmd/restic/format.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "time" 8 9 "github.com/restic/restic/internal/restic" 10 ) 11 12 func formatBytes(c uint64) string { 13 b := float64(c) 14 15 switch { 16 case c > 1<<40: 17 return fmt.Sprintf("%.3f TiB", b/(1<<40)) 18 case c > 1<<30: 19 return fmt.Sprintf("%.3f GiB", b/(1<<30)) 20 case c > 1<<20: 21 return fmt.Sprintf("%.3f MiB", b/(1<<20)) 22 case c > 1<<10: 23 return fmt.Sprintf("%.3f KiB", b/(1<<10)) 24 default: 25 return fmt.Sprintf("%dB", c) 26 } 27 } 28 29 func formatSeconds(sec uint64) string { 30 hours := sec / 3600 31 sec -= hours * 3600 32 min := sec / 60 33 sec -= min * 60 34 if hours > 0 { 35 return fmt.Sprintf("%d:%02d:%02d", hours, min, sec) 36 } 37 38 return fmt.Sprintf("%d:%02d", min, sec) 39 } 40 41 func formatPercent(numerator uint64, denominator uint64) string { 42 if denominator == 0 { 43 return "" 44 } 45 46 percent := 100.0 * float64(numerator) / float64(denominator) 47 48 if percent > 100 { 49 percent = 100 50 } 51 52 return fmt.Sprintf("%3.2f%%", percent) 53 } 54 55 func formatRate(bytes uint64, duration time.Duration) string { 56 sec := float64(duration) / float64(time.Second) 57 rate := float64(bytes) / sec / (1 << 20) 58 return fmt.Sprintf("%.2fMiB/s", rate) 59 } 60 61 func formatDuration(d time.Duration) string { 62 sec := uint64(d / time.Second) 63 return formatSeconds(sec) 64 } 65 66 func formatNode(prefix string, n *restic.Node, long bool) string { 67 if !long { 68 return filepath.Join(prefix, n.Name) 69 } 70 71 var mode os.FileMode 72 var target string 73 74 switch n.Type { 75 case "file": 76 mode = 0 77 case "dir": 78 mode = os.ModeDir 79 case "symlink": 80 mode = os.ModeSymlink 81 target = fmt.Sprintf(" -> %v", n.LinkTarget) 82 case "dev": 83 mode = os.ModeDevice 84 case "chardev": 85 mode = os.ModeDevice | os.ModeCharDevice 86 case "fifo": 87 mode = os.ModeNamedPipe 88 case "socket": 89 mode = os.ModeSocket 90 } 91 92 return fmt.Sprintf("%s %5d %5d %6d %s %s%s", 93 mode|n.Mode, n.UID, n.GID, n.Size, 94 n.ModTime.Format(TimeFormat), filepath.Join(prefix, n.Name), 95 target) 96 }