Explorar o código

add colors, progress bars, and logs

Alex Suraci %!s(int64=7) %!d(string=hai) anos
pai
achega
5a60474f2b
Modificáronse 6 ficheiros con 79 adicións e 10 borrados
  1. 3 0
      cmd/check/main.go
  2. 23 7
      cmd/in/main.go
  3. 38 2
      cmd/in/unpack.go
  4. 4 0
      cmd/out/main.go
  5. 4 1
      go.mod
  6. 7 0
      go.sum

+ 3 - 0
cmd/check/main.go

@@ -19,6 +19,9 @@ type CheckResponse []resource.Version
 
 func main() {
 	logrus.SetOutput(os.Stderr)
+	logrus.SetFormatter(&logrus.TextFormatter{
+		ForceColors: true,
+	})
 
 	var req CheckRequest
 	err := json.NewDecoder(os.Stdin).Decode(&req)

+ 23 - 7
cmd/in/main.go

@@ -33,6 +33,9 @@ type MetadataField struct {
 
 func main() {
 	logrus.SetOutput(os.Stderr)
+	logrus.SetFormatter(&logrus.TextFormatter{
+		ForceColors: true,
+	})
 
 	var req InRequest
 	err := json.NewDecoder(os.Stdin).Decode(&req)
@@ -53,30 +56,36 @@ func main() {
 		return
 	}
 
+	logrus.Infof("fetching %s", ref)
+
 	image, err := remote.Image(n)
 	if err != nil {
-		logrus.Errorf("Failed to locate remote image: %s", err)
+		logrus.Errorf("failed to locate remote image: %s", err)
 		os.Exit(1)
 		return
 	}
 
+	logrus.Infof("unpacking image")
+
 	err = unpackImage(filepath.Join(dest, "rootfs"), image)
 	if err != nil {
-		logrus.Errorf("Failed to extract image: %s", err)
+		logrus.Errorf("failed to extract image: %s", err)
 		os.Exit(1)
 		return
 	}
 
-	meta, err := os.Create(filepath.Join(dest, "metadata.json"))
+	logrus.Infof("writing metadata")
+
+	cfg, err := image.ConfigFile()
 	if err != nil {
-		logrus.Errorf("Failed to create image metadata: %s", err)
+		logrus.Errorf("failed to inspect image config: %s", err)
 		os.Exit(1)
 		return
 	}
 
-	cfg, err := image.ConfigFile()
+	meta, err := os.Create(filepath.Join(dest, "metadata.json"))
 	if err != nil {
-		logrus.Errorf("Failed to inspect image config: %s", err)
+		logrus.Errorf("failed to create image metadata: %s", err)
 		os.Exit(1)
 		return
 	}
@@ -86,7 +95,14 @@ func main() {
 		User: cfg.ContainerConfig.User,
 	})
 	if err != nil {
-		logrus.Errorf("Failed to write image metadata: %s", err)
+		logrus.Errorf("failed to write image metadata: %s", err)
+		os.Exit(1)
+		return
+	}
+
+	err = meta.Close()
+	if err != nil {
+		logrus.Errorf("failed to close image metadata file: %s", err)
 		os.Exit(1)
 		return
 	}

+ 38 - 2
cmd/in/unpack.go

@@ -2,12 +2,15 @@ package main
 
 import (
 	"archive/tar"
+	"compress/gzip"
 	"io"
+	"os"
 	"path/filepath"
 	"strings"
 
 	"github.com/concourse/go-archive/tarfs"
 	"github.com/google/go-containerregistry/pkg/v1"
+	pb "gopkg.in/cheggaaa/pb.v1"
 )
 
 const whiteoutPrefix = ".wh."
@@ -26,12 +29,33 @@ func unpackImage(dest string, img v1.Image) error {
 	for i := len(layers) - 1; i >= 0; i-- {
 		layer := layers[i]
 
-		r, err := layer.Uncompressed()
+		size, err := layer.Size()
 		if err != nil {
 			return err
 		}
 
-		tr := tar.NewReader(r)
+		digest, err := layer.Digest()
+		if err != nil {
+			return err
+		}
+
+		bar := pb.New64(size).SetUnits(pb.U_BYTES)
+		bar.Output = os.Stderr
+		bar.Prefix(digest.Hex[0:12])
+
+		r, err := layer.Compressed()
+		if err != nil {
+			return err
+		}
+
+		bar.Start()
+
+		gr, err := gzip.NewReader(bar.NewProxyReader(r))
+		if err != nil {
+			return err
+		}
+
+		tr := tar.NewReader(gr)
 
 		for {
 			hdr, err := tr.Next()
@@ -70,6 +94,18 @@ func unpackImage(dest string, img v1.Image) error {
 				return err
 			}
 		}
+
+		err = gr.Close()
+		if err != nil {
+			return err
+		}
+
+		err = r.Close()
+		if err != nil {
+			return err
+		}
+
+		bar.Finish()
 	}
 
 	return nil

+ 4 - 0
cmd/out/main.go

@@ -8,6 +8,10 @@ import (
 
 func main() {
 	logrus.SetOutput(os.Stderr)
+	logrus.SetFormatter(&logrus.TextFormatter{
+		ForceColors: true,
+	})
+
 	logrus.Error("not implemented")
 	os.Exit(1)
 }

+ 4 - 1
go.mod

@@ -1,13 +1,14 @@
 module github.com/concourse/registry-image-resource
 
 require (
-	github.com/concourse/go-archive v0.0.0-20180803050304-8400900bd01d
+	github.com/concourse/go-archive v0.0.0-20180803203406-784931698f4f
 	github.com/davecgh/go-spew v1.1.0 // indirect
 	github.com/fsnotify/fsnotify v1.4.7 // indirect
 	github.com/golang/protobuf v1.1.0 // indirect
 	github.com/google/go-cmp v0.2.0 // indirect
 	github.com/google/go-containerregistry v0.0.0-20180801194910-5f7b0e489541
 	github.com/hpcloud/tail v1.0.0 // indirect
+	github.com/mattn/go-runewidth v0.0.2 // indirect
 	github.com/onsi/ginkgo v1.6.0 // indirect
 	github.com/onsi/gomega v1.4.1 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
@@ -19,6 +20,8 @@ require (
 	golang.org/x/sys v0.0.0-20180802203216-0ffbfd41fbef // indirect
 	golang.org/x/text v0.3.0 // indirect
 	gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect
+	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
+	gopkg.in/cheggaaa/pb.v1 v1.0.25
 	gopkg.in/fsnotify.v1 v1.4.7 // indirect
 	gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect
 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect

+ 7 - 0
go.sum

@@ -1,5 +1,7 @@
 github.com/concourse/go-archive v0.0.0-20180803050304-8400900bd01d h1:Pv7E5Y4zVdyd2yAnVC2pVwMbCBPsvwoUe62rhdVn8MM=
 github.com/concourse/go-archive v0.0.0-20180803050304-8400900bd01d/go.mod h1:Xfo080IPQBmVz3I5ehjCddW3phA2mwv0NFwlpjf5CO8=
+github.com/concourse/go-archive v0.0.0-20180803203406-784931698f4f h1:Z7s60kZd9kuWiosivO9QPGH1vmfC/lzLDiuWIy0MT+o=
+github.com/concourse/go-archive v0.0.0-20180803203406-784931698f4f/go.mod h1:Xfo080IPQBmVz3I5ehjCddW3phA2mwv0NFwlpjf5CO8=
 github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
@@ -12,6 +14,8 @@ github.com/google/go-containerregistry v0.0.0-20180801194910-5f7b0e489541 h1:smM
 github.com/google/go-containerregistry v0.0.0-20180801194910-5f7b0e489541/go.mod h1:yZAFP63pRshzrEYLXLGPmUt0Ay+2zdjmMN1loCnRLUk=
 github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/mattn/go-runewidth v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o=
+github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/gomega v1.4.1 h1:PZSj/UFNaVp3KxrzHOcS7oyuWA7LoOY/77yCTEFu21U=
@@ -36,6 +40,9 @@ gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNat
 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I=
+gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
 gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0=