forked from mirrors/tar-split
64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"compress/gzip"
|
|
"io"
|
|
"os"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/codegangsta/cli"
|
|
"github.com/vbatts/tar-split/tar/asm"
|
|
"github.com/vbatts/tar-split/tar/storage"
|
|
)
|
|
|
|
func CommandAsm(c *cli.Context) {
|
|
if len(c.Args()) > 0 {
|
|
logrus.Warnf("%d additional arguments passed are ignored", len(c.Args()))
|
|
}
|
|
if len(c.String("input")) == 0 {
|
|
logrus.Fatalf("--input filename must be set")
|
|
}
|
|
if len(c.String("output")) == 0 {
|
|
logrus.Fatalf("--output filename must be set ([FILENAME|-])")
|
|
}
|
|
if len(c.String("path")) == 0 {
|
|
logrus.Fatalf("--path must be set")
|
|
}
|
|
|
|
var outputStream io.Writer
|
|
if c.String("output") == "-" {
|
|
outputStream = os.Stdout
|
|
} else {
|
|
fh, err := os.Create(c.String("output"))
|
|
if err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
defer fh.Close()
|
|
outputStream = fh
|
|
}
|
|
|
|
// Get the tar metadata reader
|
|
mf, err := os.Open(c.String("input"))
|
|
if err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
defer mf.Close()
|
|
mfz, err := gzip.NewReader(mf)
|
|
if err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
defer mfz.Close()
|
|
|
|
metaUnpacker := storage.NewJSONUnpacker(mfz)
|
|
// XXX maybe get the absolute path here
|
|
fileGetter := storage.NewPathFileGetter(c.String("path"))
|
|
|
|
ots := asm.NewOutputTarStream(fileGetter, metaUnpacker)
|
|
defer ots.Close()
|
|
i, err := io.Copy(outputStream, ots)
|
|
if err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
|
|
logrus.Infof("created %s from %s and %s (wrote %d bytes)", c.String("output"), c.String("path"), c.String("input"), i)
|
|
}
|