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  }