package cli import ( "fmt" "time" "github.com/urfave/cli/v2" "sneak.berlin/go/mfer/internal/log" "sneak.berlin/go/mfer/mfer" ) func (mfa *CLIApp) listManifestOperation(ctx *cli.Context) error { // Default to ErrorLevel for clean output log.SetLevel(log.ErrorLevel) longFormat := ctx.Bool("long") print0 := ctx.Bool("print0") pathOrURL, err := mfa.resolveManifestArg(ctx) if err != nil { return fmt.Errorf("list: %w", err) } rc, err := mfa.openManifestReader(pathOrURL) if err != nil { return fmt.Errorf("list: %w", err) } defer func() { _ = rc.Close() }() manifest, err := mfer.NewManifestFromReader(rc) if err != nil { return fmt.Errorf("list: failed to parse manifest: %w", err) } files := manifest.Files() // Determine line ending lineEnd := "\n" if print0 { lineEnd = "\x00" } for _, f := range files { if longFormat { // An entry may legitimately carry no mtime; render that as // mtimeAbsent rather than as the Unix epoch. mtimeStr := mtimeAbsent if mtime, ok := entryMtime(f); ok { mtimeStr = mtime.Format(time.RFC3339) } _, _ = fmt.Fprintf(mfa.Stdout, "%d\t%s\t%s%s", f.GetSize(), mtimeStr, f.GetPath(), lineEnd) } else { _, _ = fmt.Fprintf(mfa.Stdout, "%s%s", f.GetPath(), lineEnd) } } return nil }