diff --git a/cmd/in/main.go b/cmd/in/main.go index a537ed3..91d77c5 100644 --- a/cmd/in/main.go +++ b/cmd/in/main.go @@ -3,7 +3,9 @@ package main import ( "encoding/json" "fmt" + "io/ioutil" "os" + "path" "path/filepath" resource "github.com/concourse/registry-image-resource" @@ -86,12 +88,29 @@ func main() { rootfsFormat(dest, req, image) } + err = saveDigest(dest, image) + if err != nil { + logrus.Errorf("failed to save image digest: %s", err) + os.Exit(1) + return + } + json.NewEncoder(os.Stdout).Encode(InResponse{ Version: req.Version, Metadata: []resource.MetadataField{}, }) } +func saveDigest(dest string, image v1.Image) error { + digest, err := image.Digest() + if err != nil { + return err + } + + digestDest := path.Join(dest, "digest") + return ioutil.WriteFile(digestDest, []byte(digest.String()), 0644) +} + func ociFormat(dest string, req InRequest, image v1.Image) { tag, err := name.NewTag(req.Source.Repository+":"+req.Source.Tag(), name.WeakValidation) if err != nil { diff --git a/go.mod b/go.mod index 06d54a2..b1ff908 100644 --- a/go.mod +++ b/go.mod @@ -5,31 +5,24 @@ require ( github.com/concourse/go-archive v0.0.0-20180803203406-784931698f4f github.com/davecgh/go-spew v1.1.0 // indirect github.com/fatih/color v1.7.0 - 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-20180919161554-52f3c54ec23c - github.com/hpcloud/tail v1.0.0 // indirect + github.com/google/pprof v0.0.0-20181026152656-fde099a545de // indirect + github.com/ianlancetaylor/demangle v0.0.0-20180714043527-fcd258a6f0b4 // indirect github.com/kr/pretty v0.1.0 // indirect github.com/mattn/go-colorable v0.0.9 // indirect github.com/mattn/go-isatty v0.0.3 // indirect github.com/onsi/ginkgo v1.6.0 - github.com/onsi/gomega v1.4.1 + github.com/onsi/gomega v1.4.2 github.com/opencontainers/go-digest v1.0.0-rc1 // indirect github.com/opencontainers/image-spec v1.0.1 github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sirupsen/logrus v1.0.6 github.com/stretchr/testify v1.2.2 // indirect github.com/vbauerster/mpb v3.3.1+incompatible + golang.org/x/arch v0.0.0-20180920145803-b19384d3c130 // indirect golang.org/x/crypto v0.0.0-20180807104621-f027049dab0a // indirect - golang.org/x/net v0.0.0-20180801234040-f4c29de78a2a // indirect - golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect - golang.org/x/sys v0.0.0-20180806192500-2be389f392cd // 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/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 - gopkg.in/yaml.v2 v2.2.1 // indirect ) diff --git a/go.sum b/go.sum index a992059..bc6d985 100644 --- a/go.sum +++ b/go.sum @@ -10,12 +10,17 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/golang/protobuf v1.1.0 h1:0iH4Ffd/meGoXqF2lSAhZHt8X+cPgkfn/cb6Cce5Vpc= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-containerregistry v0.0.0-20180919161554-52f3c54ec23c h1:cFhR+IyTBe1xfu/gVA04ZjgvC37fDOgdeROZ7u9ekjM= github.com/google/go-containerregistry v0.0.0-20180919161554-52f3c54ec23c/go.mod h1:yZAFP63pRshzrEYLXLGPmUt0Ay+2zdjmMN1loCnRLUk= +github.com/google/pprof v0.0.0-20181026152656-fde099a545de h1:FNVzWlo4xE8V0835Fzciova4asrBAb86Kxdyw+eXlWk= +github.com/google/pprof v0.0.0-20181026152656-fde099a545de/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20180714043527-fcd258a6f0b4 h1:eWmTY5/yaZWgZR+HjyGOCXgM++IEwo/KgxxtYhai4LU= +github.com/ianlancetaylor/demangle v0.0.0-20180714043527-fcd258a6f0b4/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -29,6 +34,8 @@ 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= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= @@ -41,14 +48,20 @@ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/vbauerster/mpb v3.3.1+incompatible h1:895YxWn6TBP+leAp2kml6H+Rccyo6kXcqKZpbig1wuI= github.com/vbauerster/mpb v3.3.1+incompatible/go.mod h1:zAHG26FUhVKETRu+MWqYXcI70POlC6N8up9p1dID7SU= +golang.org/x/arch v0.0.0-20180920145803-b19384d3c130 h1:Vsc61gop4hfHdzQNolo6Fi/sw7TnJ2yl3ZR4i7bYirs= +golang.org/x/arch v0.0.0-20180920145803-b19384d3c130/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8= golang.org/x/crypto v0.0.0-20180807104621-f027049dab0a h1:PulT0Y50PcfTWomfsD39bSQyVrjjWdIuJKfyR4nOCJw= golang.org/x/crypto v0.0.0-20180807104621-f027049dab0a/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/net v0.0.0-20180801234040-f4c29de78a2a h1:8fCF9zjAir2SP3N+axz9xs+0r4V8dqPzqsWO10t8zoo= golang.org/x/net v0.0.0-20180801234040-f4c29de78a2a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180806192500-2be389f392cd h1:KFYUs6SCkSktZ+xJWb5YbuSCJLLphbTsg0kvyirtlQ8= golang.org/x/sys v0.0.0-20180806192500-2be389f392cd/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= diff --git a/in_test.go b/in_test.go index 0723fb0..ca27362 100644 --- a/in_test.go +++ b/in_test.go @@ -16,7 +16,7 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - resource "github.com/concourse/registry-image-resource" + "github.com/concourse/registry-image-resource" ) var _ = Describe("In", func() { @@ -217,4 +217,17 @@ var _ = Describe("In", func() { Expect(fetchedManifest.Config.Digest).To(Equal(manifest.Config.Digest)) }) }) + + Describe("saving the digest", func() { + BeforeEach(func() { + req.Source.Repository = "alpine" + req.Version.Digest = latestDigest(req.Source.Repository) + }) + + It("saves the digest to a file", func() { + digest, err := ioutil.ReadFile(filepath.Join(destDir, "digest")) + Expect(err).ToNot(HaveOccurred()) + Expect(string(digest)).To(Equal(req.Version.Digest)) + }) + }) })