package main import ( "archive/tar" "io" "log" "os" "path" flag "github.com/spf13/pflag" ) type processParams struct { prefix string concatenate bool cleanPath bool } func main() { var verbose int var params processParams flag.CountVarP(&verbose, "verbose", "v", "add verbosity") flag.StringVarP(¶ms.prefix, "prefix", "p", "", "adds prefix to filenames") flag.BoolVarP(¶ms.concatenate, "concatenate", "c", false, "concatenate tar archives") flag.BoolVarP(¶ms.cleanPath, "clean-path", "", false, "clean tar entry path") flag.Parse() logger := NewLogger(LevelEnum(verbose) + 2) if err := process(params, logger); err != nil { log.Fatal(err) } } func process(params processParams, logger *Logger) error { tr := tar.NewReader(os.Stdin) tw := tar.NewWriter(os.Stdout) defer tw.Close() for { hdr, err := tr.Next() if err == io.EOF { if params.concatenate { tr = tar.NewReader(os.Stdin) hdr, err = tr.Next() if err == io.EOF { break } else if err != nil { return err } } else { break } } else if err != nil { return err } logger.Infof(`TarEntry.name = %s`, hdr.Name) if params.cleanPath { hdr.Name = path.Clean("/" + hdr.Name)[1:] } hdr.Name = params.prefix + hdr.Name if err = tw.WriteHeader(hdr); err != nil { return err } if _, err := io.Copy(tw, tr); err != nil { return err } } if err := tw.Flush(); err != nil { return err } return nil }