diff --git a/ctpm/add.go b/ctpm/add.go index 702d827..b54c1f2 100644 --- a/ctpm/add.go +++ b/ctpm/add.go @@ -2,6 +2,7 @@ package ctpm import ( "archive/tar" + "context" "errors" "fmt" "github.com/Masterminds/semver/v3" @@ -20,7 +21,7 @@ import ( func Add(pc *config.ProjectConfig, opts AddOptions) error { for _, dep := range opts.Dependencies { - if err := addDependency(&pc.Manifest, dep, opts); err != nil { + if err := addDependency(context.TODO(), &pc.Manifest, dep, opts); err != nil { return fmt.Errorf("error adding %s: %w", dep, err) } } @@ -54,16 +55,18 @@ func createBuildDirectory(name, version string) error { return nil } -func addDependency(man *manifest.Manifest, dependency string, opts AddOptions) error { +func addDependency(ctx context.Context, man *manifest.Manifest, dependency string, opts AddOptions) error { options := buildOptions(opts) - name, version, err := getRequiredVersion(dependency, options) + reg := registry.NewClient(registry.Options{ + RegistryURL: options.RegistryURL, + }) + + name, version, err := getRequiredVersion(ctx, reg, dependency) if err != nil { return fmt.Errorf("error getting dependencies: %w", err) } var pkg *os.File - if pkg, err = registry.FetchPackage(name, version, registry.Options{ - RegistryURL: options.RegistryURL, - }); err != nil { + if pkg, err = reg.FetchPackage(ctx, name, version); err != nil { return fmt.Errorf("error fetching package: %w", err) } pkgDir, err := unpackPackage(pkg) @@ -169,16 +172,14 @@ func validateDependency(dep string) error { return errors.New("%s is not a valid dependency string") } -func getRequiredVersion(dep string, options AddOptions) (name string, version *semver.Version, err error) { - if err := validateDependency(dep); err != nil { +func getRequiredVersion(ctx context.Context, reg *registry.Client, pkg string) (name string, version *semver.Version, err error) { + if err := validateDependency(pkg); err != nil { return "", nil, err } - dependency := strings.Split(dep, "@") + dependency := strings.Split(pkg, "@") if len(dependency) == 1 { - version, err = registry.GetLastVersion(dep, registry.Options{ - RegistryURL: options.RegistryURL, - }) - name = dep + version, err = reg.GetLastVersion(ctx, pkg) + name = pkg return } name = dependency[0] diff --git a/env/dev.go b/env/dev.go index a011066..2f8cff5 100644 --- a/env/dev.go +++ b/env/dev.go @@ -4,5 +4,6 @@ package env const ( API_ENDPOINT = "http://localhost:4000/v1" - REGISTRY_ENDPOINT = "http://localhost:4444/v1" + REGISTRY_ENDPOINT = "http://localhost:4566" + REGISTRY_BUCKET_NAME = "registry-c3pm-io" ) diff --git a/env/prod.go b/env/prod.go index 0b20d76..8a4e51c 100644 --- a/env/prod.go +++ b/env/prod.go @@ -6,5 +6,7 @@ const ( //API_ENDPOINT is the URL of the C3PM API API_ENDPOINT = "https://c3pm.herokuapp.com/v1" //REGISTRY_ENDPOINT is the URL to an S3-compatible bucket that will be used as the package registry. - REGISTRY_ENDPOINT = "https://registry-c3pm-io.s3.fr-par.scw.cloud" + REGISTRY_ENDPOINT = "https://s3.fr-par.scw.cloud" + //REGISTRY_BUCKET_NAME is the name of the s3 bucket + REGISTRY_BUCKET_NAME = "registry-c3pm-io" ) diff --git a/go.mod b/go.mod index 5651a15..c8dadd8 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,10 @@ require ( github.com/AlecAivazis/survey/v2 v2.2.5 github.com/Masterminds/semver/v3 v3.1.1 github.com/alecthomas/kong v0.2.12 + github.com/aws/aws-sdk-go-v2 v1.2.0 + github.com/aws/aws-sdk-go-v2/config v1.1.1 + github.com/aws/aws-sdk-go-v2/service/s3 v1.2.0 + github.com/aws/smithy-go v1.1.0 github.com/bmatcuk/doublestar v1.3.4 github.com/hashicorp/go-cleanhttp v0.5.1 // indirect github.com/mattn/go-colorable v0.1.8 // indirect @@ -16,6 +20,7 @@ require ( github.com/onsi/gomega v1.10.1 github.com/pkg/errors v0.9.1 // indirect golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9 // indirect + golang.org/x/net v0.0.0-20201110031124-69a78807bb2b // indirect golang.org/x/sys v0.0.0-20201211090839-8ad439b19e0f // indirect golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect golang.org/x/text v0.3.4 // indirect diff --git a/go.sum b/go.sum index efc9bb7..832e3e3 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,31 @@ github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nB github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= github.com/alecthomas/kong v0.2.12 h1:X3kkCOXGUNzLmiu+nQtoxWqj4U2a39MpSJR3QdQXOwI= github.com/alecthomas/kong v0.2.12/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= +github.com/aws/aws-sdk-go-v2 v1.2.0 h1:BS+UYpbsElC82gB+2E2jiCBg36i8HlubTB/dO/moQ9c= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.1.1 h1:ZAoq32boMzcaTW9bcUacBswAmHTbvlvDJICgHFZuECo= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1 h1:NbvWIM1Mx6sNPTxowHgS2ewXCRp+NGTzUYb/96FZJbY= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2 h1:EtEU7WRaWliitZh2nmuxEXrN0Cb8EgPUFGIoTMeqbzI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.0.1 h1:q+3dVb1s3piv/Q/Ft0+OjU5iKItBRfCvU5wNLQUyIbA= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.0.1/go.mod h1:zurGx7QI3Bk2OFwswSXl3PtJDdgD3QzjkfskiukJ2Mg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2 h1:4AH9fFjUlVktQMznF+YN33aWNXaR4VgDXyP28qokJC0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.1.0 h1:6yUvdqgAAWoKAotui7AI4QvJASrjI6rkJtweSyjH6M4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.1.0/go.mod h1:q+4U7Z1uD6Iimym8uPQp0Ong/XICxInhzIKVSwn7bUU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.2.0 h1:p20kkvl+DwV3wYsnLGcmsspBzWGD6EsWKi/W+09Z1NI= +github.com/aws/aws-sdk-go-v2/service/s3 v1.2.0/go.mod h1:nHAD0aOk81kN3xdNYzKg4g9JISKSwRdUUDEXOgIojf4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1 h1:37QubsarExl5ZuCBlnRP+7l1tNwZPBSTqpTBrPH98RU= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1 h1:TJoIfnIFubCX0ACVeJ0w46HEH5MwjwYN4iFhuYIhfIY= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0 h1:D6CSsM3gdxaGaqXnPgOBCeL6Mophqzu7KJOu7zW78sU= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= +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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= @@ -27,6 +50,9 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= @@ -35,6 +61,10 @@ github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDG github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kr/pty v1.1.4 h1:5Myjjh3JY/NaAi4IsUbHADytDyl1VE1Y9PXDlL+P/VQ= @@ -72,12 +102,14 @@ 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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 h1:8dUaAV7K4uHsF56JQWkprecIQKdPHtR9jCHF5nB8uzc= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9 h1:sYNJzB4J8toYPQTM6pAkcmBRgw9SnQKP9oXCHfgy604= golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= @@ -86,6 +118,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2eP golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 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-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= @@ -104,6 +138,7 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201211090839-8ad439b19e0f h1:QdHQnPce6K4XQewki9WNbG5KOROuDzqO3NaYjI1cXJ0= golang.org/x/sys v0.0.0-20201211090839-8ad439b19e0f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -115,6 +150,7 @@ 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/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -134,6 +170,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/registry/registry.go b/registry/registry.go index a470e0a..ec2324d 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -3,12 +3,14 @@ package registry import ( - "encoding/xml" + "context" "fmt" "github.com/Masterminds/semver/v3" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/c3pm-labs/c3pm/env" "io" "io/ioutil" - "net/http" "os" "path/filepath" "sort" @@ -20,49 +22,35 @@ type Options struct { RegistryURL string } -//ListRegistryResponse is the representation of the XML structure returned by the registry. -type ListRegistryResponse struct { - Name string - Contents []struct { - Key string `xml:"Key"` - } `xml:"Contents"` +type Client struct { + s3Client *s3.Client +} + +func NewClient(opts Options) *Client { + s3Client := s3.New(s3.Options{ + UsePathStyle: true, + Region: "fr-par", + EndpointResolver: s3.EndpointResolverFromURL(opts.RegistryURL), + }) + + return &Client{s3Client: s3Client} } //GetLastVersion calls the registry to find the latest version published to the API. //The version found can be different to the version that has been published to the API in case of support of ancient versions. //For example, if a package is currently at version 3.3.0, but the maintainer last pushed version 2.7.3, a patch for version 2.7. //The version returned by GetLastVersion will be 3.3.0, because it is the highest SemVer version number. -func GetLastVersion(dependency string, options Options) (*semver.Version, error) { - client := http.Client{} - req, err := http.NewRequest("GET", options.RegistryURL, nil) +func (c *Client) GetLastVersion(ctx context.Context, pkgName string) (*semver.Version, error) { + resp, err := c.s3Client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{ + Bucket: aws.String(env.REGISTRY_BUCKET_NAME), + Prefix: aws.String(pkgName), + }) if err != nil { - return nil, fmt.Errorf("error creating version query: %w", err) + return nil, err } - q := req.URL.Query() - q.Add("typeList", "2") - q.Add("prefix", dependency) - req.URL.RawQuery = q.Encode() - resp, err := client.Do(req) - if err != nil { - return nil, fmt.Errorf("error fetching versions: %w", err) - } - defer resp.Body.Close() - var registryResponse ListRegistryResponse - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("error reading body: %w", err) - } - err = xml.Unmarshal(body, ®istryResponse) - if err != nil { - return nil, fmt.Errorf("error unmarshaling versions: %w", err) - } - if len(registryResponse.Contents) == 0 { - fmt.Printf("%s: package not found\n", dependency) - os.Exit(1) - } - vs := make([]*semver.Version, len(registryResponse.Contents)) - for i, r := range registryResponse.Contents { - version := filepath.Base(r.Key) + vs := make([]*semver.Version, len(resp.Contents)) + for i, r := range resp.Contents { + version := filepath.Base(*r.Key) v, err := semver.NewVersion(version) if err != nil { return nil, fmt.Errorf("error parsing version %s: %w", r, err) @@ -74,14 +62,19 @@ func GetLastVersion(dependency string, options Options) (*semver.Version, error) } //FetchPackage downloads a package given it's name and version number. -func FetchPackage(dependency string, version *semver.Version, options Options) (*os.File, error) { - client := http.Client{} - resp, err := client.Get(fmt.Sprintf("%s/%s/%s", options.RegistryURL, dependency, version.String())) +func (c *Client) FetchPackage(ctx context.Context, pkgName string, version *semver.Version) (*os.File, error) { + key := fmt.Sprintf("/%s/%s", pkgName, version.String()) + + resp, err := c.s3Client.GetObject(ctx, &s3.GetObjectInput{ + Bucket: aws.String(env.REGISTRY_BUCKET_NAME), + Key: aws.String(key), + }) if err != nil { - return nil, fmt.Errorf("error fetching package %s: %w", dependency, err) + return nil, err } + defer resp.Body.Close() - file, err := ioutil.TempFile("", fmt.Sprintf("%s.%s.*.tar", dependency, version.String())) + file, err := ioutil.TempFile("", fmt.Sprintf("%s.%s.*.tar", pkgName, version.String())) if err != nil { return nil, fmt.Errorf("error creating temporary package file: %w", err) } diff --git a/registry/registry_test.go b/registry/registry_test.go index 4a08478..9da310a 100644 --- a/registry/registry_test.go +++ b/registry/registry_test.go @@ -1,6 +1,7 @@ package registry_test import ( + "context" "encoding/xml" "github.com/Masterminds/semver/v3" "github.com/c3pm-labs/c3pm/registry" @@ -33,7 +34,8 @@ var _ = Describe("Add", func() { ) }) It("fetches the right version", func() { - version, err := registry.GetLastVersion("boost", options) + client := registry.NewClient(options) + version, err := client.GetLastVersion(context.TODO(), "boost") Ω(err).ShouldNot(HaveOccurred()) Ω(server.ReceivedRequests()).Should(HaveLen(1)) Ω(version).Should(Equal(semver.MustParse("1.0.0")))