mirror of
https://github.com/taigrr/arc
synced 2025-01-18 04:33:13 -08:00
73 lines
1.2 KiB
Go
73 lines
1.2 KiB
Go
// Copyright (C) 2016 - Will Glozer. All rights reserved.
|
|
|
|
package main
|
|
|
|
import (
|
|
"archive/tar"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
var (
|
|
ErrVerifyFailed = errors.New("archive: verify failed")
|
|
ErrNoEntryFound = errors.New("archive: no entry found")
|
|
)
|
|
|
|
func (c *Cmd) List(arc *RegexFilter) error {
|
|
matches := 0
|
|
|
|
for arc.Next() {
|
|
h := arc.Header
|
|
switch {
|
|
case c.Verbose > 0:
|
|
const layout = "%s %-6d %-6d %8s %s %s\n"
|
|
mode := mode(h)
|
|
size := size(h)
|
|
date := h.ModTime.Format("2006-01-02 15:04")
|
|
name := name(h)
|
|
fmt.Printf(layout, mode, h.Uid, h.Gid, size, date, name)
|
|
default:
|
|
fmt.Println(h.Name)
|
|
}
|
|
matches++
|
|
}
|
|
|
|
switch {
|
|
case arc.Error != nil:
|
|
return arc.Error
|
|
case !arc.Verify():
|
|
return ErrVerifyFailed
|
|
case matches == 0:
|
|
return ErrNoEntryFound
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func mode(h *tar.Header) string {
|
|
mode := os.FileMode(h.Mode)
|
|
switch h.Typeflag {
|
|
case tar.TypeDir:
|
|
mode |= os.ModeDir
|
|
case tar.TypeSymlink:
|
|
mode |= os.ModeSymlink
|
|
}
|
|
return mode.String()
|
|
}
|
|
|
|
func size(h *tar.Header) string {
|
|
if h.Size == 0 {
|
|
return "0"
|
|
}
|
|
return ByteSize(h.Size).String()
|
|
}
|
|
|
|
func name(h *tar.Header) string {
|
|
name := h.Name
|
|
if h.Typeflag == tar.TypeSymlink {
|
|
name += " -> " + h.Linkname
|
|
}
|
|
return name
|
|
}
|