mirror of
https://github.com/vbatts/tar-split.git
synced 2025-10-25 00:10:56 +00:00
The Go implementation of gzip is the only known to produce compressed layers with the expected digest hashes. This change allows compressed tar layer files to be produced, which is useful for exporting layers from non-Go tools.
70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"compress/gzip"
|
|
"io"
|
|
"os"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/urfave/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
|
|
}
|
|
|
|
if c.Bool("compress") {
|
|
zipper := gzip.NewWriter(outputStream)
|
|
defer zipper.Close()
|
|
outputStream = zipper
|
|
}
|
|
|
|
// 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)
|
|
}
|