diff --git a/src/python/supply/supply.go b/src/python/supply/supply.go index f9bef58f..44cb9499 100644 --- a/src/python/supply/supply.go +++ b/src/python/supply/supply.go @@ -747,14 +747,14 @@ func (s *Supplier) InstallCommonBuildDependencies() error { if err := s.Installer.InstallOnlyVersion("pip", tempPath); err != nil { return err } - if err := s.Installer.InstallOnlyVersion("flit-core", tempPath); err != nil { - return err - } - - s.Log.Info("Installing build-time dependency flit-core (bootstrap)") - args := []string{tempPath, "--no-build-isolation"} - if err := s.runPipInstall(args...); err != nil { - return fmt.Errorf("could not bootstrap-install flit-core: %v", err) + for _, dep := range []string{"flit-core", "poetry-core"} { + if err := s.Installer.InstallOnlyVersion(dep, tempPath); err != nil { + return fmt.Errorf("could not prepare build-time dependency %s: %v", dep, err) + } + s.Log.Info("Installing build-time dependency %s (bootstrap)", dep) + if err := s.runPipInstall(tempPath, "--no-build-isolation"); err != nil { + return fmt.Errorf("could not bootstrap-install %s: %v", dep, err) + } } for _, dep := range []string{"wheel", "setuptools"} { @@ -764,6 +764,8 @@ func (s *Supplier) InstallCommonBuildDependencies() error { return fmt.Errorf("could not install build-time dependency %s: %v", dep, err) } } + + return nil } diff --git a/src/python/supply/supply_test.go b/src/python/supply/supply_test.go index 366268d5..a8d15d41 100644 --- a/src/python/supply/supply_test.go +++ b/src/python/supply/supply_test.go @@ -633,10 +633,12 @@ MarkupSafe==2.0.1 Describe("InstallCommonBuildDependencies", func() { Context("successful installation", func() { - It("bootstraps flit-core, wheel and setuptools", func() { + It("bootstraps flit-core, poetry-core, wheel and setuptools", func() { mockInstaller.EXPECT().InstallOnlyVersion("pip", "/tmp/common_build_deps") mockInstaller.EXPECT().InstallOnlyVersion("flit-core", "/tmp/common_build_deps") mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/common_build_deps", "--no-build-isolation") + mockInstaller.EXPECT().InstallOnlyVersion("poetry-core", "/tmp/common_build_deps") + mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/common_build_deps", "--no-build-isolation") mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "wheel", "--no-index", "--no-build-isolation", "--upgrade-strategy=only-if-needed", "--find-links=/tmp/common_build_deps") mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "setuptools", "--no-index", "--no-build-isolation", "--upgrade-strategy=only-if-needed", "--find-links=/tmp/common_build_deps") @@ -644,20 +646,43 @@ MarkupSafe==2.0.1 }) }) - Context("flit-core bootstrap fails", func() { - It("returns a useful error message", func() { - mockInstaller.EXPECT().InstallOnlyVersion("pip", "/tmp/common_build_deps") - mockInstaller.EXPECT().InstallOnlyVersion("flit-core", "/tmp/common_build_deps") - mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/common_build_deps", "--no-build-isolation").Return(fmt.Errorf("bootstrap-error")) - Expect(supplier.InstallCommonBuildDependencies()).To(MatchError("could not bootstrap-install flit-core: bootstrap-error")) + Context("flit-core bootstrap fails", func() { + It("returns a useful error message", func() { + mockInstaller.EXPECT().InstallOnlyVersion("pip", "/tmp/common_build_deps") + mockInstaller.EXPECT().InstallOnlyVersion("flit-core", "/tmp/common_build_deps") + mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/common_build_deps", "--no-build-isolation").Return(fmt.Errorf("bootstrap-error")) + Expect(supplier.InstallCommonBuildDependencies()).To(MatchError("could not bootstrap-install flit-core: bootstrap-error")) + }) + }) + + Context("poetry-core preparation fails", func() { + It("returns a useful error message", func() { + mockInstaller.EXPECT().InstallOnlyVersion("pip", "/tmp/common_build_deps") + mockInstaller.EXPECT().InstallOnlyVersion("flit-core", "/tmp/common_build_deps") + mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/common_build_deps", "--no-build-isolation") + mockInstaller.EXPECT().InstallOnlyVersion("poetry-core", "/tmp/common_build_deps").Return(fmt.Errorf("prepare-error")) + Expect(supplier.InstallCommonBuildDependencies()).To(MatchError("could not prepare build-time dependency poetry-core: prepare-error")) + }) + }) + + Context("poetry-core bootstrap fails", func() { + It("returns a useful error message", func() { + mockInstaller.EXPECT().InstallOnlyVersion("pip", "/tmp/common_build_deps") + mockInstaller.EXPECT().InstallOnlyVersion("flit-core", "/tmp/common_build_deps") + mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/common_build_deps", "--no-build-isolation") + mockInstaller.EXPECT().InstallOnlyVersion("poetry-core", "/tmp/common_build_deps") + mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/common_build_deps", "--no-build-isolation").Return(fmt.Errorf("poetry-error")) + Expect(supplier.InstallCommonBuildDependencies()).To(MatchError("could not bootstrap-install poetry-core: poetry-error")) + }) }) - }) Context("wheel installation fails", func() { It("returns a useful error message", func() { mockInstaller.EXPECT().InstallOnlyVersion("pip", "/tmp/common_build_deps") mockInstaller.EXPECT().InstallOnlyVersion("flit-core", "/tmp/common_build_deps") mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/common_build_deps", "--no-build-isolation") + mockInstaller.EXPECT().InstallOnlyVersion("poetry-core", "/tmp/common_build_deps") + mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/common_build_deps", "--no-build-isolation") mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "wheel", "--no-index", "--no-build-isolation", "--upgrade-strategy=only-if-needed", "--find-links=/tmp/common_build_deps").Return(fmt.Errorf("some-pip-error")) Expect(supplier.InstallCommonBuildDependencies()).To(MatchError("could not install build-time dependency wheel: some-pip-error")) })