diff --git a/cmd/restic/format.go b/cmd/restic/format.go index 5a1f2ba8c..9f66d1c1d 100644 --- a/cmd/restic/format.go +++ b/cmd/restic/format.go @@ -68,17 +68,29 @@ func formatNode(prefix string, n *restic.Node, long bool) string { return filepath.Join(prefix, n.Name) } + var mode os.FileMode + var target string + switch n.Type { case "file": - return fmt.Sprintf("%s %5d %5d %6d %s %s", - n.Mode, n.UID, n.GID, n.Size, n.ModTime.Format(TimeFormat), filepath.Join(prefix, n.Name)) + mode = 0 case "dir": - return fmt.Sprintf("%s %5d %5d %6d %s %s", - n.Mode|os.ModeDir, n.UID, n.GID, n.Size, n.ModTime.Format(TimeFormat), filepath.Join(prefix, n.Name)) + mode = os.ModeDir case "symlink": - return fmt.Sprintf("%s %5d %5d %6d %s %s -> %s", - n.Mode|os.ModeSymlink, n.UID, n.GID, n.Size, n.ModTime.Format(TimeFormat), filepath.Join(prefix, n.Name), n.LinkTarget) - default: - return fmt.Sprintf("", n.Type, n.Name) + mode = os.ModeSymlink + target = fmt.Sprintf(" -> %v", n.LinkTarget) + case "dev": + mode = os.ModeDevice + case "chardev": + mode = os.ModeDevice | os.ModeCharDevice + case "fifo": + mode = os.ModeNamedPipe + case "socket": + mode = os.ModeSocket } + + return fmt.Sprintf("%s %5d %5d %6d %s %s%s", + mode|n.Mode, n.UID, n.GID, n.Size, + n.ModTime.Format(TimeFormat), filepath.Join(prefix, n.Name), + target) } diff --git a/internal/restic/node.go b/internal/restic/node.go index 0adf4a524..afa5d9792 100644 --- a/internal/restic/node.go +++ b/internal/restic/node.go @@ -61,16 +61,26 @@ func (n Nodes) Less(i, j int) bool { return n[i].Name < n[j].Name } func (n Nodes) Swap(i, j int) { n[i], n[j] = n[j], n[i] } func (node Node) String() string { + var mode os.FileMode switch node.Type { case "file": - return fmt.Sprintf("%s %5d %5d %6d %s %s", - node.Mode, node.UID, node.GID, node.Size, node.ModTime, node.Name) + mode = 0 case "dir": - return fmt.Sprintf("%s %5d %5d %6d %s %s", - node.Mode|os.ModeDir, node.UID, node.GID, node.Size, node.ModTime, node.Name) + mode = os.ModeDir + case "symlink": + mode = os.ModeSymlink + case "dev": + mode = os.ModeDevice + case "chardev": + mode = os.ModeDevice | os.ModeCharDevice + case "fifo": + mode = os.ModeNamedPipe + case "socket": + mode = os.ModeSocket } - return fmt.Sprintf("", node.Type, node.Name) + return fmt.Sprintf("%s %5d %5d %6d %s %s", + mode|node.Mode, node.UID, node.GID, node.Size, node.ModTime, node.Name) } // NodeFromFileInfo returns a new node from the given path and FileInfo. It