diff --git a/examples/build-and-push/build-and-push.go b/examples/build-and-push/build-and-push.go index 5ea070d..ea88d44 100644 --- a/examples/build-and-push/build-and-push.go +++ b/examples/build-and-push/build-and-push.go @@ -7,12 +7,10 @@ import ( "path/filepath" "strings" - "github.com/docker/docker/client" - "github.com/apenella/go-docker-builder/pkg/build" - "github.com/apenella/go-docker-builder/pkg/push" - contextpath "github.com/apenella/go-docker-builder/pkg/build/context/path" + "github.com/apenella/go-docker-builder/pkg/push" + "github.com/docker/docker/client" ) // go-docker-builder example where is created a ubuntu image diff --git a/examples/build-path-context/build.go b/examples/build-path-context/build.go index 9909b7f..1d507fe 100644 --- a/examples/build-path-context/build.go +++ b/examples/build-path-context/build.go @@ -6,10 +6,9 @@ import ( "path/filepath" "strings" - "github.com/docker/docker/client" - "github.com/apenella/go-docker-builder/pkg/build" contextpath "github.com/apenella/go-docker-builder/pkg/build/context/path" + "github.com/docker/docker/client" ) // go-docker-builder example where is created a ubuntu image diff --git a/go.mod b/go.mod index bff8641..9d80448 100644 --- a/go.mod +++ b/go.mod @@ -6,11 +6,11 @@ require ( github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect github.com/Microsoft/go-winio v0.4.14 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect + github.com/apenella/go-common-utils/error v0.0.0-20200917063805-34b0ed3c4ce1 github.com/docker/distribution v2.7.1+incompatible // indirect github.com/docker/docker v0.0.0-20190822180741-9552f2b2fdde github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect - github.com/go-git/go-git v4.7.0+incompatible github.com/go-git/go-git/v5 v5.0.0 github.com/gogo/protobuf v1.3.1 // indirect github.com/google/go-cmp v0.4.0 // indirect @@ -18,12 +18,10 @@ require ( github.com/opencontainers/go-digest v1.0.0-rc1 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/spf13/afero v1.2.2 - github.com/stretchr/testify v1.5.1 + github.com/stretchr/testify v1.6.1 github.com/xanzy/ssh-agent v0.2.1 golang.org/x/net v0.0.0-20200421231249-e086a090c8fd // indirect golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect google.golang.org/grpc v1.29.1 // indirect - gopkg.in/src-d/go-git.v4 v4.13.1 // indirect gotest.tools v2.2.0+incompatible ) diff --git a/go.sum b/go.sum index 0c4710d..8774e6d 100644 --- a/go.sum +++ b/go.sum @@ -10,12 +10,13 @@ github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBb github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/apenella/go-common-utils/error v0.0.0-20200917063805-34b0ed3c4ce1 h1:lw/fwF65AaJVxyUTJShtBiZfaiafKde3QkR4im1glzQ= +github.com/apenella/go-common-utils/error v0.0.0-20200917063805-34b0ed3c4ce1/go.mod h1:Hj3S/BcSHKfv9VDMcrY7lsm9hGnb7cd70alSkl/Sv+4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -31,7 +32,6 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= @@ -40,11 +40,8 @@ github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy v4.2.0+incompatible h1:Z6QtVXd5tjxUtcODLugkJg4WaZnGg13CD8qB9pr+7q0= github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-git v4.7.0+incompatible h1:+W9rgGY4DOKKdX2x6HxSR7HNeTxqiKrOvKnuittYVdA= -github.com/go-git/go-git v4.7.0+incompatible/go.mod h1:6+421e08gnZWn30y26Vchf7efgYLe4dl5OQbBSUXShE= github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc= github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= github.com/go-git/go-git/v5 v5.0.0 h1:k5RWPm4iJwYtfWoxIJy4wJX9ON7ihPeZZYC1fLYDnpg= @@ -76,7 +73,6 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGi github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -88,36 +84,27 @@ github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2i 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= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= -github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -129,10 +116,6 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200421231249-e086a090c8fd h1:QPwSajcTUrFriMF1nJ3XzgoqakqQEsnZf9LdXdi2nkI= golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -147,7 +130,6 @@ golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b h1:ag/x1USPSsqHud38I9BAC88qdNLDHHtQ4mlgQIZPPNA= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -155,8 +137,6 @@ golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -165,7 +145,6 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -176,28 +155,21 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= 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/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= -gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= -gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= -gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/pkg/auth/docker/auth.go b/pkg/auth/docker/auth.go index 2d35b51..fa6462c 100644 --- a/pkg/auth/docker/auth.go +++ b/pkg/auth/docker/auth.go @@ -3,9 +3,9 @@ package auth import ( "encoding/base64" "encoding/json" - "errors" "strings" + errors "github.com/apenella/go-common-utils/error" dockertypes "github.com/docker/docker/api/types" ) @@ -13,11 +13,11 @@ import ( func GenerateAuthConfig(username, password string) (*dockertypes.AuthConfig, error) { if username == "" { - return nil, errors.New("(auth::GenerateUserPasswordAuthConfig) Username must be provided") + return nil, errors.New("(auth::GenerateUserPasswordAuthConfig)", "Username must be provided") } if password == "" { - return nil, errors.New("(auth::GenerateUserPasswordAuthConfig) Password must be provided") + return nil, errors.New("(auth::GenerateUserPasswordAuthConfig)", "Password must be provided") } authConfig := &dockertypes.AuthConfig{ @@ -31,11 +31,11 @@ func GenerateAuthConfig(username, password string) (*dockertypes.AuthConfig, err func GenerateUserPasswordAuthConfig(username, password string) (*dockertypes.AuthConfig, error) { if username == "" { - return nil, errors.New("(auth::GenerateUserPasswordAuthConfig) Username must be provided") + return nil, errors.New("(auth::GenerateUserPasswordAuthConfig)", "Username must be provided") } if password == "" { - return nil, errors.New("(auth::GenerateUserPasswordAuthConfig) Password must be provided") + return nil, errors.New("(auth::GenerateUserPasswordAuthConfig)", "Password must be provided") } authConfig := &dockertypes.AuthConfig{ @@ -55,12 +55,12 @@ func GenerateEncodedUserPasswordAuthConfig(username, password string) (*string, auth, err = GenerateUserPasswordAuthConfig(username, password) if err != nil { - return nil, errors.New("(auth::GenerateEncodedUserPasswordAuthConfig) " + err.Error()) + return nil, errors.New("(auth::GenerateEncodedUserPasswordAuthConfig)", "Error generation user password auth configuration", err) } encodedAuth, err = encodeAuthConfig(auth) if err != nil { - return nil, errors.New("(auth::GenerateEncodedUserPasswordAuthConfig) " + err.Error()) + return nil, errors.New("(auth::GenerateEncodedUserPasswordAuthConfig)", "Error encoding auth configuration", err) } return encodedAuth, nil @@ -70,7 +70,7 @@ func encodeAuthConfig(authConfig *dockertypes.AuthConfig) (*string, error) { encodedJSON, err := json.Marshal(authConfig) if err != nil { - return nil, errors.New("(auth::encodeAuthConfig) Error marshaling auth configuration. " + err.Error()) + return nil, errors.New("(auth::encodeAuthConfig)", "Error marshaling auth configuration", err) } authString := base64.URLEncoding.EncodeToString(encodedJSON) diff --git a/pkg/auth/git/key/key_auth.go b/pkg/auth/git/key/key_auth.go index b40256a..b287a79 100644 --- a/pkg/auth/git/key/key_auth.go +++ b/pkg/auth/git/key/key_auth.go @@ -1,8 +1,9 @@ package auth import ( - "errors" + "fmt" + errors "github.com/apenella/go-common-utils/error" "github.com/go-git/go-git/v5/plumbing/transport" ssh "github.com/go-git/go-git/v5/plumbing/transport/ssh" ) @@ -21,7 +22,7 @@ func (a *KeyAuth) Auth() (transport.AuthMethod, error) { key, err := ssh.NewPublicKeysFromFile(a.GitSSHUser, a.PkFile, a.PkPassword) if err != nil { - return nil, errors.New("(auth::SSHAgentAuth::Auth) Could not load key from file '" + a.PkFile + "'.\n " + err.Error()) + return nil, errors.New("(auth::SSHAgentAuth::Auth)", fmt.Sprintf("Could not load key from file '%s'", a.PkFile), err) } return key, nil diff --git a/pkg/auth/git/sshagent/sshagent_auth.go b/pkg/auth/git/sshagent/sshagent_auth.go index d81795f..0802113 100644 --- a/pkg/auth/git/sshagent/sshagent_auth.go +++ b/pkg/auth/git/sshagent/sshagent_auth.go @@ -1,8 +1,7 @@ package auth import ( - "errors" - + errors "github.com/apenella/go-common-utils/error" "github.com/go-git/go-git/v5/plumbing/transport" ssh "github.com/go-git/go-git/v5/plumbing/transport/ssh" sshagent "github.com/xanzy/ssh-agent" @@ -20,7 +19,7 @@ func (a *SSHAgentAuth) Auth() (transport.AuthMethod, error) { agent, err := ssh.NewSSHAgentAuth(a.GitSSHUser) if err != nil || !sshagent.Available() { - return nil, errors.New("(auth::SSHAgentAuth::Auth) Agent is not available.\n " + err.Error()) + return nil, errors.New("(auth::SSHAgentAuth::Auth)", "Agent is not available", err) } return agent, nil diff --git a/pkg/build/build.go b/pkg/build/build.go index 7084e4f..4d247cb 100644 --- a/pkg/build/build.go +++ b/pkg/build/build.go @@ -2,10 +2,11 @@ package build import ( "context" - "errors" + "fmt" "io" "os" + errors "github.com/apenella/go-common-utils/error" "github.com/apenella/go-docker-builder/pkg/push" "github.com/apenella/go-docker-builder/pkg/response" "github.com/apenella/go-docker-builder/pkg/types" @@ -44,7 +45,7 @@ func (b *DockerBuildCmd) Run() error { var contextReader io.Reader if b == nil { - return errors.New("(builder:Run) DockerBuilder is nil") + return errors.New("(builder:Run)", "DockerBuilder is nil") } if b.Writer == nil { @@ -58,7 +59,7 @@ func (b *DockerBuildCmd) Run() error { } if b.DockerBuildOptions.ImageName == "" { - return errors.New("(builder:Run) An image name is required to build an image") + return errors.New("(builder:Run)", "An image name is required to build an image") } if b.DockerBuildOptions.Tags == nil { @@ -73,7 +74,7 @@ func (b *DockerBuildCmd) Run() error { contextReader, err = b.DockerBuildOptions.DockerBuildContext.Reader() if err != nil { - return errors.New("(builder:Run) Error generating a build context reader. " + err.Error()) + return errors.New("(builder:Run)", "Error generating a build context reader", err) } buildOptions := dockertypes.ImageBuildOptions{ @@ -90,13 +91,13 @@ func (b *DockerBuildCmd) Run() error { buildResponse, err := b.Cli.ImageBuild(b.Context, contextReader, buildOptions) if err != nil { - return errors.New("(builder:Run) Error building '" + b.DockerBuildOptions.ImageName + "'. " + err.Error()) + return errors.New("(builder:Run)", fmt.Sprintf("Error building '%s'", b.DockerBuildOptions.ImageName), err) } defer buildResponse.Body.Close() err = b.Response.Write(b.Writer, buildResponse.Body) if err != nil { - return errors.New("(builder:Run) " + err.Error()) + return errors.New("(builder:Run)", fmt.Sprintf("Error writing build response for '%s'", b.DockerBuildOptions.ImageName), err) } if b.DockerBuildOptions.PushAfterBuild { @@ -110,7 +111,7 @@ func (b *DockerBuildCmd) Run() error { err = dockerPush.Run() if err != nil { - return errors.New("(builder:Run) " + err.Error()) + return errors.New("(builder:Run)", fmt.Sprintf("Error pushing image '%s'", b.DockerBuildOptions.ImageName), err) } } diff --git a/pkg/build/buildOptions.go b/pkg/build/buildOptions.go index 2fe09b7..d0d84ed 100644 --- a/pkg/build/buildOptions.go +++ b/pkg/build/buildOptions.go @@ -1,8 +1,9 @@ package build import ( - "errors" + "fmt" + errors "github.com/apenella/go-common-utils/error" auth "github.com/apenella/go-docker-builder/pkg/auth/docker" "github.com/apenella/go-docker-builder/pkg/build/context" @@ -36,7 +37,7 @@ func (o *DockerBuildOptions) AddBuildArgs(arg string, value string) error { _, exists := o.BuildArgs[arg] if exists { - return errors.New("(builder::AddBuildArgs) Argument '" + arg + "' already defined") + return errors.New("(builder::AddBuildArgs)", fmt.Sprintf("Argument '%s' already defined", arg)) } o.BuildArgs[arg] = &value @@ -62,7 +63,7 @@ func (o *DockerBuildOptions) AddAuth(username, password, registry string) error authConfig, err := auth.GenerateUserPasswordAuthConfig(username, password) if err != nil { - return errors.New("(build::AddAuth) " + err.Error()) + return errors.New("(build::AddAuth)", "Error generation user password auth configuration", err) } o.Auth[registry] = *authConfig diff --git a/pkg/build/buildOptions_test.go b/pkg/build/buildOptions_test.go index 48a4f25..5af7df7 100644 --- a/pkg/build/buildOptions_test.go +++ b/pkg/build/buildOptions_test.go @@ -1,9 +1,9 @@ package build import ( - "errors" "testing" + errors "github.com/apenella/go-common-utils/error" dockertypes "github.com/docker/docker/api/types" "github.com/stretchr/testify/assert" ) @@ -49,7 +49,7 @@ func TestAddBuildArgs(t *testing.T) { arg: "argument", value: "value", }, - err: errors.New("(builder::AddBuildArgs) Argument 'argument' already defined"), + err: errors.New("(builder::AddBuildArgs)", "Argument 'argument' already defined"), }, } for _, test := range tests { diff --git a/pkg/build/context/git/git.go b/pkg/build/context/git/git.go index c571a77..3b76580 100644 --- a/pkg/build/context/git/git.go +++ b/pkg/build/context/git/git.go @@ -3,10 +3,10 @@ package git import ( "archive/tar" "bytes" - "errors" "fmt" "io" + errors "github.com/apenella/go-common-utils/error" auth "github.com/apenella/go-docker-builder/pkg/auth/git" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" @@ -51,7 +51,7 @@ func (c *GitBuildContext) Reader() (io.Reader, error) { if c.Auth != nil { auth, err := c.Auth.Auth() if err != nil { - return nil, errors.New("(context::git::Reader) Error getting authorization method." + err.Error()) + return nil, errors.New("(context::git::Reader)", "Error getting authorization method", err) } cloneOption.Auth = auth @@ -59,23 +59,23 @@ func (c *GitBuildContext) Reader() (io.Reader, error) { repo, err := git.Clone(gitstorage, nil, cloneOption) if err != nil { - return nil, errors.New("(context::git::Reader) Error cloning '" + c.Repository + "'." + err.Error()) + return nil, errors.New("(context::git::Reader)", fmt.Sprintf("Error cloning repository '%s'", c.Repository), err) } referenceHead, err := repo.Head() if err != nil { - return nil, errors.New("(context::git::Reader) Error getting reference '" + referenceName.String() + "' HEAD." + err.Error()) + return nil, errors.New("(context::git::Reader)", fmt.Sprintf("Error getting reference '%s' HEAD", referenceName.String()), err) } commit, err := repo.CommitObject(referenceHead.Hash()) if err != nil { - return nil, errors.New("(context::git::Reader) Error getting commit '" + referenceHead.Hash().String() + "'. " + err.Error()) + return nil, errors.New("(context::git::Reader)", fmt.Sprintf("Error getting commit '%s'", referenceHead.Hash().String()), err) } filesIterator, err := commit.Files() defer filesIterator.Close() if err != nil { - return nil, errors.New("(context::git::Reader) Error getting files iterator") + return nil, errors.New("(context::git::Reader)", "Error getting files iterator") } tw := tar.NewWriter(&tarBuff) @@ -87,12 +87,12 @@ func (c *GitBuildContext) Reader() (io.Reader, error) { fileContents, err := file.Contents() if err != nil { - return errors.New("(context::git::Reader) Error achiving '" + file.Name + "' contents. " + err.Error()) + return errors.New("(context::git::Reader)", fmt.Sprintf("Error achiving '%s' contents", file.Name), err) } _, err = buff.WriteString(fileContents) if err != nil { - return errors.New("(context::git::Reader) Error writting '" + file.Name + "' contents to temporal buffer. " + err.Error()) + return errors.New("(context::git::Reader)", fmt.Sprintf("Error writting '%s' contents to temporal buffer", file.Name), err) } header := &tar.Header{ @@ -102,7 +102,7 @@ func (c *GitBuildContext) Reader() (io.Reader, error) { } if err := tw.WriteHeader(header); err != nil { - return errors.New("(context::git::Reader) Error writing '" + file.Name + "' header. " + err.Error()) + return errors.New("(context::git::Reader)", fmt.Sprintf("Error writing '%s' header. ", file.Name), err) } // write file content into tar writer fmt.Fprint(tw, buff.String()) @@ -112,7 +112,7 @@ func (c *GitBuildContext) Reader() (io.Reader, error) { return nil }) if err != nil { - return nil, errors.New("(context::git::Reader) Error packaging repository files. " + err.Error()) + return nil, errors.New("(context::git::Reader)", "Error packaging repository files", err) } return bytes.NewReader(tarBuff.Bytes()), nil diff --git a/pkg/build/context/path/path.go b/pkg/build/context/path/path.go index a9f2509..328793b 100644 --- a/pkg/build/context/path/path.go +++ b/pkg/build/context/path/path.go @@ -1,10 +1,11 @@ package path import ( - "errors" + "fmt" "io" "os" + errors "github.com/apenella/go-common-utils/error" "github.com/apenella/go-docker-builder/pkg/common/tar" ) @@ -19,12 +20,12 @@ func (c *PathBuildContext) Reader() (io.Reader, error) { context, err := os.Open(c.Path) if err != nil { - return nil, errors.New("(context::path::Reader) Error opening '" + c.Path + "'. " + err.Error()) + return nil, errors.New("(context::path::Reader)", fmt.Sprintf("Error opening '%s'", c.Path), err) } reader, err := tar.Tar(context) if err != nil { - return nil, errors.New("(context::path::Reader) Error archieving '" + c.Path + "'. " + err.Error()) + return nil, errors.New("(context::path::Reader)", fmt.Sprintf("Error archieving '%s'", c.Path), err) } return reader, nil diff --git a/pkg/build/context/url/url.go b/pkg/build/context/url/url.go index 4145af0..6fd4189 100644 --- a/pkg/build/context/url/url.go +++ b/pkg/build/context/url/url.go @@ -1,8 +1,9 @@ package url import ( - "errors" "io" + + errors "github.com/apenella/go-common-utils/error" ) // URLBuildContext creates a build context from url @@ -13,5 +14,5 @@ type URLBuildContext struct { // Reader return a context reader func (c *URLBuildContext) Reader() (io.Reader, error) { - return nil, errors.New("(context::url::Tar) URL context not available") + return nil, errors.New("(context::url::Tar)", "URL context not available") } diff --git a/pkg/common/tar/tar.go b/pkg/common/tar/tar.go index a21d6cf..dc1bf47 100644 --- a/pkg/common/tar/tar.go +++ b/pkg/common/tar/tar.go @@ -3,10 +3,12 @@ package tar import ( "archive/tar" "bytes" - "errors" + "fmt" "io" "os" "path/filepath" + + errors "github.com/apenella/go-common-utils/error" ) // Tar return an tar io.Reader from the gived directory. It returns an error when the file is not a directory. @@ -19,12 +21,12 @@ func Tar(path *os.File) (io.Reader, error) { // ensure the src actually exists before trying to tar it stat, err = os.Stat(path.Name()) if err != nil { - return nil, errors.New("(common::tar::Tar) '" + path.Name() + "' stat. " + err.Error()) + return nil, errors.New("(common::tar::Tar)", fmt.Sprintf("Stat error for '%s'", path.Name()), err) } // context to tar must be a directory if !stat.IsDir() { - return nil, errors.New("(common::tar::Tar) '" + path.Name() + "' must be a directory") + return nil, errors.New("(common::tar::Tar)", fmt.Sprintf("'%s' must be a directory", path.Name())) } tw := tar.NewWriter(&tarBuff) @@ -32,7 +34,7 @@ func Tar(path *os.File) (io.Reader, error) { err = filepath.Walk(path.Name(), func(file string, fi os.FileInfo, err error) error { if err != nil { - return errors.New("(common::tar::Tar::Walk) Error at the beginning of the walk. " + err.Error()) + return errors.New("(common::tar::Tar::Walk)", "Error at the beginning of the walk", err) } if !fi.Mode().IsRegular() { @@ -41,27 +43,27 @@ func Tar(path *os.File) (io.Reader, error) { header, err := tar.FileInfoHeader(fi, fi.Name()) if err != nil { - return errors.New("(common::tar::Tar::Walk) Error creating '" + file + "' header. " + err.Error()) + return errors.New("(common::tar::Tar::Walk)", fmt.Sprintf("Error creating '%s' header", file), err) } relativePath, err := filepath.Rel(path.Name(), file) if err != nil { - return errors.New("(common::tar::Tar::Walk) A relative path on'" + file + "' could not be made from '" + path.Name() + "'. " + err.Error()) + return errors.New("(common::tar::Tar::Walk)", fmt.Sprintf("A relative path on '%s' could not be made from '%s'", file, path.Name()), err) } header.Name = relativePath // write the header if err := tw.WriteHeader(header); err != nil { - return errors.New("(common::tar::Tar::Walk) Error writing '" + file + "' header. " + err.Error()) + return errors.New("(common::tar::Tar::Walk)", fmt.Sprintf("Error writing '%s' header", file), err) } // open files for taring f, err := os.Open(file) if err != nil { - return errors.New("(common::tar::Tar::Walk) Error opening '" + file + "'. " + err.Error()) + return errors.New("(common::tar::Tar::Walk)", fmt.Sprintf("Error opening '%s'", file), err) } if _, err := io.Copy(tw, f); err != nil { - return errors.New("(common::tar::Tar::Walk) Error copying '" + file + "' into tar. " + err.Error()) + return errors.New("(common::tar::Tar::Walk)", fmt.Sprintf("Error copying '%s' into tar", file), err) } // manually close here after each file operation; defering would cause each file close // to wait until all operations have completed. @@ -70,7 +72,7 @@ func Tar(path *os.File) (io.Reader, error) { return nil }) if err != nil { - return nil, errors.New("(common::tar::Tar) Error exploring '" + path.Name() + "'. " + err.Error()) + return nil, errors.New("(common::tar::Tar)", fmt.Sprintf("Error exploring '%s'", path.Name()), err) } return bytes.NewReader(tarBuff.Bytes()), nil diff --git a/pkg/push/push.go b/pkg/push/push.go index d2ef1f0..e143ef9 100644 --- a/pkg/push/push.go +++ b/pkg/push/push.go @@ -2,11 +2,11 @@ package push import ( "context" - "errors" "fmt" "io" "os" + errors "github.com/apenella/go-common-utils/error" "github.com/apenella/go-docker-builder/pkg/response" "github.com/apenella/go-docker-builder/pkg/types" dockertypes "github.com/docker/docker/api/types" @@ -25,7 +25,7 @@ type DockerPushCmd struct { func (p *DockerPushCmd) Run() error { if p == nil { - return errors.New("(pusher:Run) DockerBuilder is nil") + return errors.New("(pusher:Run)", "DockerBuilder is nil") } if p.Writer == nil { @@ -46,24 +46,24 @@ func (p *DockerPushCmd) Run() error { pushResponse, err := p.Cli.ImagePush(p.Context, p.DockerPushOptions.ImageName, pushOptions) if err != nil { - return errors.New("(pusher:Run) Error push '" + p.DockerPushOptions.ImageName + "'. " + err.Error()) + return errors.New("(pusher:Run)", fmt.Sprintf("Error pushing image '%s'", p.DockerPushOptions.ImageName), err) } defer pushResponse.Close() err = p.Response.Write(p.Writer, pushResponse) if err != nil { - return errors.New("(builder:Run) " + err.Error()) + return errors.New("(builder:Run)", fmt.Sprintf("Error writing push response for '%s'", p.DockerPushOptions.ImageName), err) } for _, tag := range p.DockerPushOptions.Tags { pushResponse, err = p.Cli.ImagePush(p.Context, tag, pushOptions) if err != nil { - return errors.New("(pusher:Run) Error push '" + tag + "'. " + err.Error()) + return errors.New("(pusher:Run)", fmt.Sprintf("Error pushing image '%s'", tag), err) } err = p.Response.Write(p.Writer, pushResponse) if err != nil { - return errors.New("(builder:Run) " + err.Error()) + return errors.New("(builder:Run)", fmt.Sprintf("Error writing push response for '%s'", tag), err) } } diff --git a/pkg/push/pushOptions.go b/pkg/push/pushOptions.go index 2d4ec14..09b1b91 100644 --- a/pkg/push/pushOptions.go +++ b/pkg/push/pushOptions.go @@ -1,8 +1,7 @@ package push import ( - "errors" - + errors "github.com/apenella/go-common-utils/error" auth "github.com/apenella/go-docker-builder/pkg/auth/docker" ) @@ -21,7 +20,7 @@ func (o *DockerPushOptions) AddAuth(username, password string) error { auth, err := auth.GenerateEncodedUserPasswordAuthConfig(username, password) if err != nil { - return errors.New("(push::AddAuth) " + err.Error()) + return errors.New("(push::AddAuth)", "Error generating encoded user password auth configuration", err) } o.RegistryAuth = auth diff --git a/pkg/response/response.go b/pkg/response/response.go index 7da4341..3674d7b 100644 --- a/pkg/response/response.go +++ b/pkg/response/response.go @@ -3,10 +3,10 @@ package response import ( "bufio" "encoding/json" - "errors" "fmt" "io" + errors "github.com/apenella/go-common-utils/error" "github.com/apenella/go-docker-builder/pkg/types" ) @@ -25,13 +25,21 @@ func (d *DefaultResponse) Write(w io.Writer, r io.ReadCloser) error { line := scanner.Bytes() err := json.Unmarshal(line, &streamMessage) if err != nil { - return errors.New("(responser:Response) Error unmarshalling line '" + string(line) + "' " + err.Error()) + return errors.New("(responser:Response)", fmt.Sprintf("Error unmarshalling line '%s'", string(line)), err) } - if string(line) != lineBefore { - fmt.Fprintf(w, "%s \u2500\u2500 %s\n", prefix, streamMessage.String()) + + streamMessageStr := streamMessage.String() + + if streamMessageStr != lineBefore { + fmt.Fprintf(w, "\n%s \u2500\u2500 %s %s", prefix, streamMessage.String(), streamMessage.ProgressString()) + } else { + fmt.Fprintf(w, "\r%s \u2500\u2500 %s %s", prefix, streamMessage.String(), streamMessage.ProgressString()) } - lineBefore = string(line) + + lineBefore = streamMessageStr } + // print empty line at the end + fmt.Println() return nil } diff --git a/pkg/types/responseBodyStreamAuxMessage.go b/pkg/types/responseBodyStreamAuxMessage.go index 7ef4d60..35e927b 100644 --- a/pkg/types/responseBodyStreamAuxMessage.go +++ b/pkg/types/responseBodyStreamAuxMessage.go @@ -1,5 +1,7 @@ package types +import "fmt" + // BuildResponseBodyStreamAuxMessage contains the ImageBuild's aux data from buildResponse type ResponseBodyStreamAuxMessage struct { // ID is response body stream aux's id @@ -10,7 +12,7 @@ type ResponseBodyStreamAuxMessage struct { func (m *ResponseBodyStreamAuxMessage) String() string { if m.ID != "" { - return " \u2023 " + m.ID + return fmt.Sprintf(" %s %s", separator, m.ID) } return "" } diff --git a/pkg/types/responseBodyStreamErrorDetailMessage.go b/pkg/types/responseBodyStreamErrorDetailMessage.go index cff888a..2ea17ae 100644 --- a/pkg/types/responseBodyStreamErrorDetailMessage.go +++ b/pkg/types/responseBodyStreamErrorDetailMessage.go @@ -1,5 +1,11 @@ package types +import "fmt" + +const ( + errorPrefix = "[ERROR]" +) + // BuildResponseBodyStreamAuxMessage contains the ImageBuild's aux data from buildResponse type ResponseBodyStreamErrorDetailMessage struct { // ID is response body stream aux's id @@ -10,7 +16,8 @@ type ResponseBodyStreamErrorDetailMessage struct { func (m *ResponseBodyStreamErrorDetailMessage) String() string { if m.Message != "" { - return "[ERROR] " + m.Message + return fmt.Sprintf("%s %s", errorPrefix, m.Message) } + return "" } diff --git a/pkg/types/responseBodyStreamMessage.go b/pkg/types/responseBodyStreamMessage.go index 9fea76c..4092121 100644 --- a/pkg/types/responseBodyStreamMessage.go +++ b/pkg/types/responseBodyStreamMessage.go @@ -1,27 +1,40 @@ package types -import "strings" +import ( + "fmt" + "strings" +) // ResponseBodyStreamMessage contains the ImageBuild's body data from buildResponse type ResponseBodyStreamMessage struct { + // Aux represents the aux value on response body stream message + Aux *ResponseBodyStreamAuxMessage `json:"aux"` + // ErrorDetail + ErrorDetail *ResponseBodyStreamErrorDetailMessage `json:"errorDetail"` + // ID identify layer + ID string `json:"id"` + // Progress contains the progress bar + Progress string `json:"progress"` // Status represents the status value on response body stream message Status string `json:"status"` // Stream represents the stream value on response body stream message - Stream string `json:"stream"` - ErrorDetail *ResponseBodyStreamErrorDetailMessage `json:"errorDetail"` - // Aux represents the aux value on response body stream message - Aux *ResponseBodyStreamAuxMessage `json:"aux"` + Stream string `json:"stream"` } // String return ResponseBodyStreamMessage object as string func (m *ResponseBodyStreamMessage) String() string { + if m.Status != "" { + str := fmt.Sprintf("%s ", separator) + if m.ID != "" { + str = fmt.Sprintf("%s [%s] ", str, strings.TrimSpace(m.ID)) + } + str = fmt.Sprintf("%s %s ", str, strings.TrimSpace(m.Status)) + return str + } if m.Stream != "" { return strings.TrimSpace(m.Stream) } - if m.Status != "" { - return " \u2023 " + strings.TrimSpace(m.Status) - } if m.Aux != nil { return m.Aux.String() } @@ -31,3 +44,14 @@ func (m *ResponseBodyStreamMessage) String() string { return "" } + +// ProgressString returns progress bar +func (m *ResponseBodyStreamMessage) ProgressString() string { + str := "" + + if m.Progress != "" { + return strings.TrimSpace(m.Progress) + } + + return str +} diff --git a/pkg/types/responser.go b/pkg/types/responser.go index cefeff2..72dc579 100644 --- a/pkg/types/responser.go +++ b/pkg/types/responser.go @@ -2,6 +2,10 @@ package types import "io" +const ( + separator string = "\u2023" +) + type Responser interface { Write(io.Writer, io.ReadCloser) error }