From 0645046749d01b979be67edf8e35b3d72988add7 Mon Sep 17 00:00:00 2001 From: Pascal Zimmermann Date: Tue, 10 Mar 2026 21:03:19 +0100 Subject: [PATCH 1/7] feat: Add flit-core support Signed-off-by: Pascal Zimmermann # Conflicts: # manifest.yml # Conflicts: # go.mod # go.sum --- README.md | 4 +++- src/python/supply/supply.go | 2 +- src/python/supply/supply_test.go | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 897a55aba..5adcb0293 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,9 @@ To build this buildpack, run the following commands from the buildpack's directo 1. Install buildpack-packager ```bash - go install github.com/cloudfoundry/libbuildpack/packager/buildpack-packager + go get github.com/cloudfoundry/libbuildpack + cd ~/go/src/github.com/cloudfoundry/libbuildpack && GO111MODULE=on go mod download + cd packager/buildpack-packager && GO111MODULE=on go install ``` 1. Build the buildpack diff --git a/src/python/supply/supply.go b/src/python/supply/supply.go index b36a48fd9..32b513c49 100644 --- a/src/python/supply/supply.go +++ b/src/python/supply/supply.go @@ -743,7 +743,7 @@ func (s *Supplier) RunPipVendored() error { // dependencies - wheel and setuptools. These are packaged by the dependency // pipeline within the "pip" dependency. func (s *Supplier) InstallCommonBuildDependencies() error { - var commonDeps = []string{"wheel", "setuptools"} + var commonDeps = []string{"wheel", "setuptools", "flit-core"} tempPath := filepath.Join("/tmp", "common_build_deps") if err := s.Installer.InstallOnlyVersion("pip", tempPath); err != nil { return err diff --git a/src/python/supply/supply_test.go b/src/python/supply/supply_test.go index b7947dc30..9b37a64cc 100644 --- a/src/python/supply/supply_test.go +++ b/src/python/supply/supply_test.go @@ -633,10 +633,11 @@ MarkupSafe==2.0.1 Describe("InstallCommonBuildDependencies", func() { Context("successful installation", func() { - It("runs command to install wheel and setuptools", func() { + It("runs command to install wheel, setuptools and flit-core", func() { mockInstaller.EXPECT().InstallOnlyVersion("pip", "/tmp/common_build_deps") mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "wheel", "--no-index", "--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", "--upgrade-strategy=only-if-needed", "--find-links=/tmp/common_build_deps") + mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "flit-core", "--no-index", "--upgrade-strategy=only-if-needed", "--find-links=/tmp/common_build_deps") Expect(supplier.InstallCommonBuildDependencies()).To(Succeed()) }) From 31ae47f9e1a48d94c3eafe2c72d9ae28bd09031e Mon Sep 17 00:00:00 2001 From: Pascal Zimmermann Date: Tue, 17 Mar 2026 23:17:03 +0100 Subject: [PATCH 2/7] feat: Revert the vendors and the go.mod deps --- .../libbuildpack/bratshelper/data.go | 3 +- .../libbuildpack/bratshelper/language.go | 4 +-- .../libbuildpack/bratshelper/modify.go | 5 ++-- .../libbuildpack/bratshelper/utils.go | 4 +-- .../cloudfoundry/libbuildpack/cutlass/cf.go | 6 ++-- .../libbuildpack/cutlass/docker.go | 3 +- .../libbuildpack/cutlass/glow/archiver.go | 4 +-- .../libbuildpack/cutlass/proxy.go | 4 +-- .../libbuildpack/cutlass/test_helpers.go | 10 +++++-- .../libbuildpack/cutlass/utils.go | 3 +- .../cloudfoundry/libbuildpack/installer.go | 3 +- .../cloudfoundry/libbuildpack/json.go | 4 +-- .../cloudfoundry/libbuildpack/manifest.go | 3 +- .../libbuildpack/packager/bindata.go | 3 +- .../libbuildpack/packager/cfbindata.go | 5 ++-- .../libbuildpack/packager/packager.go | 11 +++---- .../libbuildpack/packager/summary.go | 4 +-- .../libbuildpack/snapshot/snapshot.go | 3 +- .../cloudfoundry/libbuildpack/stager.go | 21 +++++++------- .../cloudfoundry/libbuildpack/util.go | 29 ++++++++----------- .../cloudfoundry/libbuildpack/yaml.go | 4 +-- vendor/modules.txt | 2 +- 22 files changed, 74 insertions(+), 64 deletions(-) diff --git a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/data.go b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/data.go index 81f8f59f2..ff8c21ed9 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/data.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/data.go @@ -3,6 +3,7 @@ package bratshelper import ( "encoding/json" "fmt" + "io/ioutil" "os" "path/filepath" "strings" @@ -35,7 +36,7 @@ func InitBpData(stack string, stackAssociationSupported bool) *BpData { Data.BpDir, err = cutlass.FindRoot() Expect(err).NotTo(HaveOccurred()) - file, err := os.ReadFile(filepath.Join(Data.BpDir, "manifest.yml")) + file, err := ioutil.ReadFile(filepath.Join(Data.BpDir, "manifest.yml")) Expect(err).ToNot(HaveOccurred()) obj := make(map[string]interface{}) Expect(yaml.Unmarshal(file, &obj)).To(Succeed()) diff --git a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/language.go b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/language.go index dfef2f68f..ba85d2d4a 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/language.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/language.go @@ -1,7 +1,7 @@ package bratshelper import ( - "os" + "io/ioutil" "path/filepath" "github.com/cloudfoundry/libbuildpack/cutlass" @@ -13,7 +13,7 @@ var cachedLanguage string func bpLanguage() string { if cachedLanguage == "" { - file, err := os.ReadFile(filepath.Join(bpDir(), "manifest.yml")) + file, err := ioutil.ReadFile(filepath.Join(bpDir(), "manifest.yml")) Expect(err).ToNot(HaveOccurred()) obj := make(map[string]interface{}) Expect(yaml.Unmarshal(file, &obj)).To(Succeed()) diff --git a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/modify.go b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/modify.go index 432e6261a..8d3b2a276 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/modify.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/modify.go @@ -4,6 +4,7 @@ import ( "archive/zip" "bytes" "io" + "io/ioutil" "os" yaml "gopkg.in/yaml.v2" @@ -69,7 +70,7 @@ func modifyZipfile(path string, cb func(path string, r io.Reader) (io.Reader, er } defer r.Close() - newfile, err := os.CreateTemp("", "buildpack.zip") + newfile, err := ioutil.TempFile("", "buildpack.zip") if err != nil { return "", err } @@ -116,7 +117,7 @@ func modifyZipfile(path string, cb func(path string, r io.Reader) (io.Reader, er } func changeManifest(r io.Reader, cb func(*Manifest)) (io.Reader, error) { - data, err := io.ReadAll(r) + data, err := ioutil.ReadAll(r) if err != nil { return nil, err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/utils.go b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/utils.go index 9cc52dc99..97062ba25 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/utils.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/utils.go @@ -1,7 +1,7 @@ package bratshelper import ( - "os" + "io/ioutil" "path/filepath" "time" @@ -22,7 +22,7 @@ func DestroyApp(app *cutlass.App) { func AddDotProfileScriptToApp(dir string) { profilePath := filepath.Join(dir, ".profile") - Expect(os.WriteFile(profilePath, []byte(`#!/usr/bin/env bash + Expect(ioutil.WriteFile(profilePath, []byte(`#!/usr/bin/env bash echo PROFILE_SCRIPT_IS_PRESENT_AND_RAN `), 0755)).To(Succeed()) } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/cf.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/cf.go index 899430419..b05f8a14f 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/cf.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/cf.go @@ -5,7 +5,7 @@ import ( "crypto/tls" "encoding/json" "fmt" - "io" + "io/ioutil" "net/http" "os" "os/exec" @@ -254,7 +254,7 @@ func (a *App) SpaceGUID() (string, error) { if cfHome == "" { cfHome = os.Getenv("HOME") } - bytes, err := os.ReadFile(filepath.Join(cfHome, ".cf", "config.json")) + bytes, err := ioutil.ReadFile(filepath.Join(cfHome, ".cf", "config.json")) if err != nil { return "", err } @@ -466,7 +466,7 @@ func (a *App) Get(path string, headers map[string]string) (string, map[string][] return "", map[string][]string{}, err } defer resp.Body.Close() - data, err := io.ReadAll(resp.Body) + data, err := ioutil.ReadAll(resp.Body) if err != nil { return "", map[string][]string{}, err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/docker.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/docker.go index 51f2eb88d..ef87b9c7b 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/docker.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/docker.go @@ -3,6 +3,7 @@ package cutlass import ( "fmt" "io" + "io/ioutil" "math/rand" "os" "os/exec" @@ -50,7 +51,7 @@ func InternetTrafficForNetwork(networkName, fixturePath, buildpackPath string, e session := DefaultLogger.Session("internet-traffic-for-network", data) session.Debug("preparing-docker-build-context") - tmpDir, err := os.MkdirTemp("", "docker-context") + tmpDir, err := ioutil.TempDir("", "docker-context") if err != nil { return nil, false, nil, fmt.Errorf("failed to create docker context directory: %s", err) } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/glow/archiver.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/glow/archiver.go index 27b02e937..486d97afc 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/glow/archiver.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/glow/archiver.go @@ -2,7 +2,7 @@ package glow import ( "fmt" - "os" + "io/ioutil" "path/filepath" "regexp" ) @@ -25,7 +25,7 @@ func NewArchiver(packager Packager) Archiver { } func (a Archiver) Archive(dir, stack, tag string, cached bool) (string, error) { - version, err := os.ReadFile(filepath.Join(dir, "VERSION")) + version, err := ioutil.ReadFile(filepath.Join(dir, "VERSION")) if err != nil { return "", err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/proxy.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/proxy.go index 5af10288e..f588a54b8 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/proxy.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/proxy.go @@ -2,10 +2,10 @@ package cutlass import ( "fmt" + "io/ioutil" "net" "net/http/httptest" "net/url" - "os" "github.com/elazarl/goproxy" ) @@ -34,7 +34,7 @@ func main() { proxyURL, err := url.Parse(p.URL) listenMsg := fmt.Sprintf("Listening on Port: %s", proxyURL.Port()) fmt.Println(listenMsg) - if err := os.WriteFile("server.log", []byte(listenMsg), 0644); err != nil { + if err := ioutil.WriteFile("server.log", []byte(listenMsg), 0644); err != nil { fmt.Println("Failed to write to log") } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/test_helpers.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/test_helpers.go index ddef3a53b..30cea8b12 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/test_helpers.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/test_helpers.go @@ -5,7 +5,9 @@ import ( "bytes" "fmt" "io" + "io/ioutil" "log" + "math/rand" "os" "path/filepath" "strings" @@ -109,7 +111,7 @@ func PackageUniquelyVersionedBuildpack(stack string, stackAssociationSupported b return VersionedBuildpackPackage{}, fmt.Errorf("Failed to find root: %v", err) } - data, err := os.ReadFile(filepath.Join(bpDir, "VERSION")) + data, err := ioutil.ReadFile(filepath.Join(bpDir, "VERSION")) if err != nil { return VersionedBuildpackPackage{}, fmt.Errorf("Failed to read VERSION file: %v", err) } @@ -218,7 +220,7 @@ func CopyCfHome() error { if cf_home == "" { cf_home = os.Getenv("HOME") } - cf_home_new, err := os.MkdirTemp("", "cf-home-copy") + cf_home_new, err := ioutil.TempDir("", "cf-home-copy") if err != nil { return err } @@ -233,6 +235,8 @@ func CopyCfHome() error { } func SeedRandom() { + seed := int64(time.Now().Nanosecond() + os.Getpid()) + rand.Seed(seed) } func RemovePackagedBuildpack(buildpack VersionedBuildpackPackage) error { @@ -261,7 +265,7 @@ func readVersionFromZip(filePath string) (string, error) { return "", err } - out, err := io.ReadAll(rc) + out, err := ioutil.ReadAll(rc) if err != nil { return "", err diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/utils.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/utils.go index aa13ba96b..172b8e089 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/utils.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/utils.go @@ -2,6 +2,7 @@ package cutlass import ( "io" + "io/ioutil" "math/rand" "os" "path/filepath" @@ -11,7 +12,7 @@ import ( ) func CopyFixture(srcDir string) (string, error) { - destDir, err := os.MkdirTemp("", "cutlass-fixture-copy") + destDir, err := ioutil.TempDir("", "cutlass-fixture-copy") if err != nil { return "", err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/installer.go b/vendor/github.com/cloudfoundry/libbuildpack/installer.go index ebcf2d406..365b8d11b 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/installer.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/installer.go @@ -4,6 +4,7 @@ import ( "crypto/sha256" "encoding/hex" "fmt" + "io/ioutil" "os" "path/filepath" "strings" @@ -46,7 +47,7 @@ func (i *Installer) InstallDependency(dep Dependency, outputDir string) error { func (i *Installer) InstallDependencyWithStrip(dep Dependency, outputDir string, stripComponents int) error { i.manifest.log.BeginStep("Installing %s %s", dep.Name, dep.Version) - tmpDir, err := os.MkdirTemp("", "downloads") + tmpDir, err := ioutil.TempDir("", "downloads") if err != nil { return err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/json.go b/vendor/github.com/cloudfoundry/libbuildpack/json.go index 7e747cb12..d6d124f82 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/json.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/json.go @@ -3,7 +3,7 @@ package libbuildpack import ( "bytes" "encoding/json" - "os" + "io/ioutil" ) type JSON struct { @@ -30,7 +30,7 @@ func removeBOM(b []byte) []byte { } func (j *JSON) Load(file string, obj interface{}) error { - data, err := os.ReadFile(file) + data, err := ioutil.ReadFile(file) if err != nil { return err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/manifest.go b/vendor/github.com/cloudfoundry/libbuildpack/manifest.go index 3381cbb06..0629e0533 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/manifest.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/manifest.go @@ -2,6 +2,7 @@ package libbuildpack import ( "fmt" + "io/ioutil" "os" "path/filepath" "strings" @@ -178,7 +179,7 @@ func (m *Manifest) Language() string { } func (m *Manifest) Version() (string, error) { - version, err := os.ReadFile(filepath.Join(m.manifestRootDir, "VERSION")) + version, err := ioutil.ReadFile(filepath.Join(m.manifestRootDir, "VERSION")) if err != nil { return "", fmt.Errorf("unable to read VERSION file %s", err) } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/packager/bindata.go b/vendor/github.com/cloudfoundry/libbuildpack/packager/bindata.go index 4a2eb0923..7ec30cca3 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/packager/bindata.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/packager/bindata.go @@ -41,6 +41,7 @@ import ( "compress/gzip" "fmt" "io" + "io/ioutil" "os" "path/filepath" "strings" @@ -994,7 +995,7 @@ func RestoreAsset(dir, name string) error { if err != nil { return err } - err = os.WriteFile(_filePath(dir, name), data, info.Mode()) + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) if err != nil { return err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/packager/cfbindata.go b/vendor/github.com/cloudfoundry/libbuildpack/packager/cfbindata.go index 85ead2f15..56c17e599 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/packager/cfbindata.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/packager/cfbindata.go @@ -8,6 +8,7 @@ import ( "crypto/sha256" "encoding/hex" "fmt" + "io/ioutil" "os" "path/filepath" "strings" @@ -56,7 +57,7 @@ func OurRestoreAsset(dir, name string, funcMap template.FuncMap, shas map[string } oldSha256 := "" - if oldContents, err := os.ReadFile(_filePath(dir, name)); err == nil { + if oldContents, err := ioutil.ReadFile(_filePath(dir, name)); err == nil { oldSha256 = checksumHex(oldContents) } @@ -71,7 +72,7 @@ func OurRestoreAsset(dir, name string, funcMap template.FuncMap, shas map[string return err } - if err := os.WriteFile(_filePath(dir, name), b.Bytes(), info.Mode()); err != nil { + if err := ioutil.WriteFile(_filePath(dir, name), b.Bytes(), info.Mode()); err != nil { return err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/packager/packager.go b/vendor/github.com/cloudfoundry/libbuildpack/packager/packager.go index 2f0810686..755aa71a8 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/packager/packager.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/packager/packager.go @@ -9,6 +9,7 @@ import ( "encoding/hex" "fmt" "io" + "io/ioutil" "log" "net/http" "net/url" @@ -26,7 +27,7 @@ type sha struct { } func readManifest(bpDir string) (Manifest, error) { - data, err := os.ReadFile(filepath.Join(bpDir, "manifest.yml")) + data, err := ioutil.ReadFile(filepath.Join(bpDir, "manifest.yml")) if err != nil { return Manifest{}, err } @@ -52,7 +53,7 @@ func CompileExtensionPackage(bpDir, version string, cached bool, stack string) ( return "", fmt.Errorf("Failed to copy %s: %v", bpDir, err) } - err = os.WriteFile(filepath.Join(dir, "VERSION"), []byte(version), 0644) + err = ioutil.WriteFile(filepath.Join(dir, "VERSION"), []byte(version), 0644) if err != nil { return "", fmt.Errorf("Failed to write VERSION file: %v", err) } @@ -167,7 +168,7 @@ func Package(bpDir, cacheDir, version, stack string, cached bool) (string, error } defer os.RemoveAll(dir) - err = os.WriteFile(filepath.Join(dir, "VERSION"), []byte(version), 0644) + err = ioutil.WriteFile(filepath.Join(dir, "VERSION"), []byte(version), 0644) if err != nil { return "", err } @@ -303,7 +304,7 @@ func DownloadFromURI(uri, fileName string) error { } func checkSha256(filePath, expectedSha256 string) error { - content, err := os.ReadFile(filePath) + content, err := ioutil.ReadFile(filePath) if err != nil { return err } @@ -372,7 +373,7 @@ func ZipFiles(filename string, files []File) error { } func CopyDirectory(srcDir string) (string, error) { - destDir, err := os.MkdirTemp("", "buildpack-packager") + destDir, err := ioutil.TempDir("", "buildpack-packager") if err != nil { return "", err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/packager/summary.go b/vendor/github.com/cloudfoundry/libbuildpack/packager/summary.go index 7381c30cf..468855092 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/packager/summary.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/packager/summary.go @@ -2,7 +2,7 @@ package packager import ( "fmt" - "os" + "io/ioutil" "path/filepath" "sort" "strings" @@ -12,7 +12,7 @@ import ( func Summary(bpDir string) (string, error) { manifest := Manifest{} - data, err := os.ReadFile(filepath.Join(bpDir, "manifest.yml")) + data, err := ioutil.ReadFile(filepath.Join(bpDir, "manifest.yml")) if err != nil { return "", err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/snapshot/snapshot.go b/vendor/github.com/cloudfoundry/libbuildpack/snapshot/snapshot.go index 2c7a7a74e..4f87c4f4e 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/snapshot/snapshot.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/snapshot/snapshot.go @@ -4,6 +4,7 @@ import ( "crypto/md5" "fmt" "io" + "io/ioutil" "os" "path/filepath" "strings" @@ -38,7 +39,7 @@ func Dir(dir string, logger Logger) *DirSnapshot { dirSnapshot.initialChecksum = checksum } - dirSnapshot.command.Execute(dir, io.Discard, io.Discard, "touch", "/tmp/checkpoint") + dirSnapshot.command.Execute(dir, ioutil.Discard, ioutil.Discard, "touch", "/tmp/checkpoint") } return dirSnapshot diff --git a/vendor/github.com/cloudfoundry/libbuildpack/stager.go b/vendor/github.com/cloudfoundry/libbuildpack/stager.go index 38a9d54a8..f9c63e3f7 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/stager.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/stager.go @@ -3,6 +3,7 @@ package libbuildpack import ( "errors" "fmt" + "io/ioutil" "os" "path/filepath" "strings" @@ -94,7 +95,7 @@ func (s *Stager) WriteEnvFile(envVar, envVal string) error { } - return os.WriteFile(filepath.Join(envDir, envVar), []byte(envVal), 0644) + return ioutil.WriteFile(filepath.Join(envDir, envVar), []byte(envVal), 0644) } func (s *Stager) LinkDirectoryInDepDir(destDir, depSubDir string) error { @@ -103,7 +104,7 @@ func (s *Stager) LinkDirectoryInDepDir(destDir, depSubDir string) error { return err } - files, err := os.ReadDir(destDir) + files, err := ioutil.ReadDir(destDir) if err != nil { return err } @@ -152,7 +153,7 @@ func (s *Stager) StagingComplete() { } func (s *Stager) ClearCache() error { - files, err := os.ReadDir(s.cacheDir) + files, err := ioutil.ReadDir(s.cacheDir) if err != nil { if os.IsNotExist(err) { return nil @@ -171,7 +172,7 @@ func (s *Stager) ClearCache() error { } func (s *Stager) ClearDepDir() error { - files, err := os.ReadDir(s.DepDir()) + files, err := ioutil.ReadDir(s.DepDir()) if err != nil { return err } @@ -233,14 +234,14 @@ func (s *Stager) SetStagingEnvironment() error { } for _, dir := range depsPaths { - files, err := os.ReadDir(dir) + files, err := ioutil.ReadDir(dir) if err != nil { return err } for _, file := range files { - if file.Type().IsRegular() { - val, err := os.ReadFile(filepath.Join(dir, file.Name())) + if file.Mode().IsRegular() { + val, err := ioutil.ReadFile(filepath.Join(dir, file.Name())) if err != nil { return err } @@ -292,13 +293,13 @@ func (s *Stager) SetLaunchEnvironment() error { depsIdx := sections[len(sections)-2] - files, err := os.ReadDir(dir) + files, err := ioutil.ReadDir(dir) if err != nil { return err } for _, file := range files { - if file.Type().IsRegular() { + if file.Mode().IsRegular() { src := filepath.Join(dir, file.Name()) dest := filepath.Join(s.profileDir, depsIdx+"_"+file.Name()) @@ -321,7 +322,7 @@ func (s *Stager) BuildpackVersion() (string, error) { } func existingDepsDirs(depsDir, subDir, prefix string) ([]string, error) { - files, err := os.ReadDir(depsDir) + files, err := ioutil.ReadDir(depsDir) if err != nil { return nil, err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/util.go b/vendor/github.com/cloudfoundry/libbuildpack/util.go index 93b442863..686103266 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/util.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/util.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "io" + "io/ioutil" "math/rand" "net/http" "net/url" @@ -21,13 +22,17 @@ import ( backoff "github.com/cenkalti/backoff/v4" ) +func init() { + rand.Seed(time.Now().UnixNano()) +} + func MoveDirectory(srcDir, destDir string) error { destExists, _ := FileExists(destDir) if !destExists { return os.Rename(srcDir, destDir) } - files, err := os.ReadDir(srcDir) + files, err := ioutil.ReadDir(srcDir) if err != nil { return err } @@ -38,7 +43,7 @@ func MoveDirectory(srcDir, destDir string) error { if exists, err := FileExists(dest); err != nil { return err } else if !exists { - if m := f.Type(); m&os.ModeSymlink != 0 { + if m := f.Mode(); m&os.ModeSymlink != 0 { if err = moveSymlinks(src, dest); err != nil { return err } @@ -64,7 +69,7 @@ func CopyDirectory(srcDir, destDir string) error { return errors.New("destination dir must exist") } - files, err := os.ReadDir(srcDir) + files, err := ioutil.ReadDir(srcDir) if err != nil { return err } @@ -73,16 +78,12 @@ func CopyDirectory(srcDir, destDir string) error { src := filepath.Join(srcDir, f.Name()) dest := filepath.Join(destDir, f.Name()) - if m := f.Type(); m&os.ModeSymlink != 0 { + if m := f.Mode(); m&os.ModeSymlink != 0 { if err = moveSymlinks(src, dest); err != nil { return err } } else if f.IsDir() { - fi, err := f.Info() - if err != nil { - return err - } - err = os.MkdirAll(dest, fi.Mode()) + err = os.MkdirAll(dest, f.Mode()) if err != nil { return err } @@ -95,13 +96,7 @@ func CopyDirectory(srcDir, destDir string) error { return err } - fi, err := f.Info() - if err != nil { - rc.Close() - return err - } - - err = writeToFile(rc, dest, fi.Mode()) + err = writeToFile(rc, dest, f.Mode()) if err != nil { rc.Close() return err @@ -505,7 +500,7 @@ func filterURI(rawURL string) (string, error) { } func CheckSha256(filePath, expectedSha256 string) error { - content, err := os.ReadFile(filePath) + content, err := ioutil.ReadFile(filePath) if err != nil { return err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/yaml.go b/vendor/github.com/cloudfoundry/libbuildpack/yaml.go index 368ce12d0..8cbe8cb75 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/yaml.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/yaml.go @@ -2,7 +2,7 @@ package libbuildpack import ( "bytes" - "os" + "io/ioutil" yaml "gopkg.in/yaml.v2" ) @@ -15,7 +15,7 @@ func NewYAML() *YAML { } func (y *YAML) Load(file string, obj interface{}) error { - data, err := os.ReadFile(file) + data, err := ioutil.ReadFile(file) if err != nil { return err } diff --git a/vendor/modules.txt b/vendor/modules.txt index 9803a1092..e2f145fc1 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -23,7 +23,7 @@ github.com/blang/semver # github.com/cenkalti/backoff/v4 v4.3.0 ## explicit; go 1.18 github.com/cenkalti/backoff/v4 -# github.com/cloudfoundry/libbuildpack v0.0.0-20260306125332-dcaf55eb6f33 +# github.com/cloudfoundry/libbuildpack v0.0.0-20260306121953-8ab9253c8181 ## explicit; go 1.22.5 github.com/cloudfoundry/libbuildpack github.com/cloudfoundry/libbuildpack/ansicleaner From 927cd394a732843fd1adb305976b8167435444d2 Mon Sep 17 00:00:00 2001 From: Pascal Zimmermann Date: Wed, 18 Mar 2026 15:17:58 +0100 Subject: [PATCH 3/7] docs: Update the documentation --- CONTRIBUTING.md | 2 +- README.md | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c6cf6d375..c7116b9a2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ All pull request authors must have a Contributor License Agreement (CLA) on-file with us. Please sign the Contributor License Agreements for Cloud Foundry ([Individual or Corporate](https://www.cloudfoundry.org/community/cla/)) via the EasyCLA application when you submit your first Pull Request. -When sending signed CLA please provide your github username in case of individual CLA or the list of github usernames that can make pull requests on behalf of your organization. +When sending signed CLA please provide your Github username in case of individual CLA or the list of Github usernames that can make pull requests on behalf of your organization. If you are confident that you're covered under a Corporate CLA, please make sure you've publicized your membership in the appropriate Github Org, per these instructions. diff --git a/README.md b/README.md index 5adcb0293..3b3d1c67f 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,20 @@ This buildpack supports running Django and Flask apps. Official buildpack documentation can be found at [python buildpack docs](http://docs.cloudfoundry.org/buildpacks/python/index.html). +## Adding new dependencies + +If you want to add a new dependency to the buildpack, please add it to the [config.yml](https://github.com/ZPascal/buildpacks-ci/blob/81d4f7942a9e4f01196ab654b6a5f89681015d41/pipelines/dependency-builds/config.yml#L272) file. For example, if you want to add a new version of Python, add an entry like the following: + +```yaml +python: + lines: + - line: 3.14.X + deprecation_date: 2030-10-07 + link: https://peps.python.org/pep-0745/ +``` + +The new dependency will be automatically added to the buildpack [manifest.yml](manifest.yml) file. + ### Building the Buildpack To build this buildpack, run the following commands from the buildpack's directory: @@ -24,9 +38,7 @@ To build this buildpack, run the following commands from the buildpack's directo 1. Install buildpack-packager ```bash - go get github.com/cloudfoundry/libbuildpack - cd ~/go/src/github.com/cloudfoundry/libbuildpack && GO111MODULE=on go mod download - cd packager/buildpack-packager && GO111MODULE=on go install + go install github.com/cloudfoundry/libbuildpack/packager/buildpack-packager@latest ``` 1. Build the buildpack From 343c9d3dbcf2df6a8f3f9ebf94713f076cc43521 Mon Sep 17 00:00:00 2001 From: Pascal Zimmermann Date: Mon, 20 Apr 2026 09:55:56 +0200 Subject: [PATCH 4/7] fix: Reset the vendors Signed-off-by: Pascal Zimmermann --- .../libbuildpack/bratshelper/data.go | 3 +- .../libbuildpack/bratshelper/language.go | 4 +-- .../libbuildpack/bratshelper/modify.go | 5 ++-- .../libbuildpack/bratshelper/utils.go | 4 +-- .../cloudfoundry/libbuildpack/cutlass/cf.go | 6 ++-- .../libbuildpack/cutlass/docker.go | 3 +- .../libbuildpack/cutlass/glow/archiver.go | 4 +-- .../libbuildpack/cutlass/proxy.go | 4 +-- .../libbuildpack/cutlass/test_helpers.go | 10 ++----- .../libbuildpack/cutlass/utils.go | 3 +- .../cloudfoundry/libbuildpack/installer.go | 3 +- .../cloudfoundry/libbuildpack/json.go | 4 +-- .../cloudfoundry/libbuildpack/manifest.go | 3 +- .../libbuildpack/packager/bindata.go | 3 +- .../libbuildpack/packager/cfbindata.go | 5 ++-- .../libbuildpack/packager/packager.go | 11 ++++--- .../libbuildpack/packager/summary.go | 4 +-- .../libbuildpack/snapshot/snapshot.go | 3 +- .../cloudfoundry/libbuildpack/stager.go | 21 +++++++------- .../cloudfoundry/libbuildpack/util.go | 29 +++++++++++-------- .../cloudfoundry/libbuildpack/yaml.go | 4 +-- vendor/modules.txt | 2 +- 22 files changed, 64 insertions(+), 74 deletions(-) diff --git a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/data.go b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/data.go index ff8c21ed9..81f8f59f2 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/data.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/data.go @@ -3,7 +3,6 @@ package bratshelper import ( "encoding/json" "fmt" - "io/ioutil" "os" "path/filepath" "strings" @@ -36,7 +35,7 @@ func InitBpData(stack string, stackAssociationSupported bool) *BpData { Data.BpDir, err = cutlass.FindRoot() Expect(err).NotTo(HaveOccurred()) - file, err := ioutil.ReadFile(filepath.Join(Data.BpDir, "manifest.yml")) + file, err := os.ReadFile(filepath.Join(Data.BpDir, "manifest.yml")) Expect(err).ToNot(HaveOccurred()) obj := make(map[string]interface{}) Expect(yaml.Unmarshal(file, &obj)).To(Succeed()) diff --git a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/language.go b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/language.go index ba85d2d4a..dfef2f68f 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/language.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/language.go @@ -1,7 +1,7 @@ package bratshelper import ( - "io/ioutil" + "os" "path/filepath" "github.com/cloudfoundry/libbuildpack/cutlass" @@ -13,7 +13,7 @@ var cachedLanguage string func bpLanguage() string { if cachedLanguage == "" { - file, err := ioutil.ReadFile(filepath.Join(bpDir(), "manifest.yml")) + file, err := os.ReadFile(filepath.Join(bpDir(), "manifest.yml")) Expect(err).ToNot(HaveOccurred()) obj := make(map[string]interface{}) Expect(yaml.Unmarshal(file, &obj)).To(Succeed()) diff --git a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/modify.go b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/modify.go index 8d3b2a276..432e6261a 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/modify.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/modify.go @@ -4,7 +4,6 @@ import ( "archive/zip" "bytes" "io" - "io/ioutil" "os" yaml "gopkg.in/yaml.v2" @@ -70,7 +69,7 @@ func modifyZipfile(path string, cb func(path string, r io.Reader) (io.Reader, er } defer r.Close() - newfile, err := ioutil.TempFile("", "buildpack.zip") + newfile, err := os.CreateTemp("", "buildpack.zip") if err != nil { return "", err } @@ -117,7 +116,7 @@ func modifyZipfile(path string, cb func(path string, r io.Reader) (io.Reader, er } func changeManifest(r io.Reader, cb func(*Manifest)) (io.Reader, error) { - data, err := ioutil.ReadAll(r) + data, err := io.ReadAll(r) if err != nil { return nil, err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/utils.go b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/utils.go index 97062ba25..9cc52dc99 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/utils.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/bratshelper/utils.go @@ -1,7 +1,7 @@ package bratshelper import ( - "io/ioutil" + "os" "path/filepath" "time" @@ -22,7 +22,7 @@ func DestroyApp(app *cutlass.App) { func AddDotProfileScriptToApp(dir string) { profilePath := filepath.Join(dir, ".profile") - Expect(ioutil.WriteFile(profilePath, []byte(`#!/usr/bin/env bash + Expect(os.WriteFile(profilePath, []byte(`#!/usr/bin/env bash echo PROFILE_SCRIPT_IS_PRESENT_AND_RAN `), 0755)).To(Succeed()) } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/cf.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/cf.go index b05f8a14f..899430419 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/cf.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/cf.go @@ -5,7 +5,7 @@ import ( "crypto/tls" "encoding/json" "fmt" - "io/ioutil" + "io" "net/http" "os" "os/exec" @@ -254,7 +254,7 @@ func (a *App) SpaceGUID() (string, error) { if cfHome == "" { cfHome = os.Getenv("HOME") } - bytes, err := ioutil.ReadFile(filepath.Join(cfHome, ".cf", "config.json")) + bytes, err := os.ReadFile(filepath.Join(cfHome, ".cf", "config.json")) if err != nil { return "", err } @@ -466,7 +466,7 @@ func (a *App) Get(path string, headers map[string]string) (string, map[string][] return "", map[string][]string{}, err } defer resp.Body.Close() - data, err := ioutil.ReadAll(resp.Body) + data, err := io.ReadAll(resp.Body) if err != nil { return "", map[string][]string{}, err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/docker.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/docker.go index ef87b9c7b..51f2eb88d 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/docker.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/docker.go @@ -3,7 +3,6 @@ package cutlass import ( "fmt" "io" - "io/ioutil" "math/rand" "os" "os/exec" @@ -51,7 +50,7 @@ func InternetTrafficForNetwork(networkName, fixturePath, buildpackPath string, e session := DefaultLogger.Session("internet-traffic-for-network", data) session.Debug("preparing-docker-build-context") - tmpDir, err := ioutil.TempDir("", "docker-context") + tmpDir, err := os.MkdirTemp("", "docker-context") if err != nil { return nil, false, nil, fmt.Errorf("failed to create docker context directory: %s", err) } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/glow/archiver.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/glow/archiver.go index 486d97afc..27b02e937 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/glow/archiver.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/glow/archiver.go @@ -2,7 +2,7 @@ package glow import ( "fmt" - "io/ioutil" + "os" "path/filepath" "regexp" ) @@ -25,7 +25,7 @@ func NewArchiver(packager Packager) Archiver { } func (a Archiver) Archive(dir, stack, tag string, cached bool) (string, error) { - version, err := ioutil.ReadFile(filepath.Join(dir, "VERSION")) + version, err := os.ReadFile(filepath.Join(dir, "VERSION")) if err != nil { return "", err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/proxy.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/proxy.go index f588a54b8..5af10288e 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/proxy.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/proxy.go @@ -2,10 +2,10 @@ package cutlass import ( "fmt" - "io/ioutil" "net" "net/http/httptest" "net/url" + "os" "github.com/elazarl/goproxy" ) @@ -34,7 +34,7 @@ func main() { proxyURL, err := url.Parse(p.URL) listenMsg := fmt.Sprintf("Listening on Port: %s", proxyURL.Port()) fmt.Println(listenMsg) - if err := ioutil.WriteFile("server.log", []byte(listenMsg), 0644); err != nil { + if err := os.WriteFile("server.log", []byte(listenMsg), 0644); err != nil { fmt.Println("Failed to write to log") } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/test_helpers.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/test_helpers.go index 30cea8b12..ddef3a53b 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/test_helpers.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/test_helpers.go @@ -5,9 +5,7 @@ import ( "bytes" "fmt" "io" - "io/ioutil" "log" - "math/rand" "os" "path/filepath" "strings" @@ -111,7 +109,7 @@ func PackageUniquelyVersionedBuildpack(stack string, stackAssociationSupported b return VersionedBuildpackPackage{}, fmt.Errorf("Failed to find root: %v", err) } - data, err := ioutil.ReadFile(filepath.Join(bpDir, "VERSION")) + data, err := os.ReadFile(filepath.Join(bpDir, "VERSION")) if err != nil { return VersionedBuildpackPackage{}, fmt.Errorf("Failed to read VERSION file: %v", err) } @@ -220,7 +218,7 @@ func CopyCfHome() error { if cf_home == "" { cf_home = os.Getenv("HOME") } - cf_home_new, err := ioutil.TempDir("", "cf-home-copy") + cf_home_new, err := os.MkdirTemp("", "cf-home-copy") if err != nil { return err } @@ -235,8 +233,6 @@ func CopyCfHome() error { } func SeedRandom() { - seed := int64(time.Now().Nanosecond() + os.Getpid()) - rand.Seed(seed) } func RemovePackagedBuildpack(buildpack VersionedBuildpackPackage) error { @@ -265,7 +261,7 @@ func readVersionFromZip(filePath string) (string, error) { return "", err } - out, err := ioutil.ReadAll(rc) + out, err := io.ReadAll(rc) if err != nil { return "", err diff --git a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/utils.go b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/utils.go index 172b8e089..aa13ba96b 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/cutlass/utils.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/cutlass/utils.go @@ -2,7 +2,6 @@ package cutlass import ( "io" - "io/ioutil" "math/rand" "os" "path/filepath" @@ -12,7 +11,7 @@ import ( ) func CopyFixture(srcDir string) (string, error) { - destDir, err := ioutil.TempDir("", "cutlass-fixture-copy") + destDir, err := os.MkdirTemp("", "cutlass-fixture-copy") if err != nil { return "", err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/installer.go b/vendor/github.com/cloudfoundry/libbuildpack/installer.go index 365b8d11b..ebcf2d406 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/installer.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/installer.go @@ -4,7 +4,6 @@ import ( "crypto/sha256" "encoding/hex" "fmt" - "io/ioutil" "os" "path/filepath" "strings" @@ -47,7 +46,7 @@ func (i *Installer) InstallDependency(dep Dependency, outputDir string) error { func (i *Installer) InstallDependencyWithStrip(dep Dependency, outputDir string, stripComponents int) error { i.manifest.log.BeginStep("Installing %s %s", dep.Name, dep.Version) - tmpDir, err := ioutil.TempDir("", "downloads") + tmpDir, err := os.MkdirTemp("", "downloads") if err != nil { return err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/json.go b/vendor/github.com/cloudfoundry/libbuildpack/json.go index d6d124f82..7e747cb12 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/json.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/json.go @@ -3,7 +3,7 @@ package libbuildpack import ( "bytes" "encoding/json" - "io/ioutil" + "os" ) type JSON struct { @@ -30,7 +30,7 @@ func removeBOM(b []byte) []byte { } func (j *JSON) Load(file string, obj interface{}) error { - data, err := ioutil.ReadFile(file) + data, err := os.ReadFile(file) if err != nil { return err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/manifest.go b/vendor/github.com/cloudfoundry/libbuildpack/manifest.go index 0629e0533..3381cbb06 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/manifest.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/manifest.go @@ -2,7 +2,6 @@ package libbuildpack import ( "fmt" - "io/ioutil" "os" "path/filepath" "strings" @@ -179,7 +178,7 @@ func (m *Manifest) Language() string { } func (m *Manifest) Version() (string, error) { - version, err := ioutil.ReadFile(filepath.Join(m.manifestRootDir, "VERSION")) + version, err := os.ReadFile(filepath.Join(m.manifestRootDir, "VERSION")) if err != nil { return "", fmt.Errorf("unable to read VERSION file %s", err) } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/packager/bindata.go b/vendor/github.com/cloudfoundry/libbuildpack/packager/bindata.go index 7ec30cca3..4a2eb0923 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/packager/bindata.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/packager/bindata.go @@ -41,7 +41,6 @@ import ( "compress/gzip" "fmt" "io" - "io/ioutil" "os" "path/filepath" "strings" @@ -995,7 +994,7 @@ func RestoreAsset(dir, name string) error { if err != nil { return err } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + err = os.WriteFile(_filePath(dir, name), data, info.Mode()) if err != nil { return err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/packager/cfbindata.go b/vendor/github.com/cloudfoundry/libbuildpack/packager/cfbindata.go index 56c17e599..85ead2f15 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/packager/cfbindata.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/packager/cfbindata.go @@ -8,7 +8,6 @@ import ( "crypto/sha256" "encoding/hex" "fmt" - "io/ioutil" "os" "path/filepath" "strings" @@ -57,7 +56,7 @@ func OurRestoreAsset(dir, name string, funcMap template.FuncMap, shas map[string } oldSha256 := "" - if oldContents, err := ioutil.ReadFile(_filePath(dir, name)); err == nil { + if oldContents, err := os.ReadFile(_filePath(dir, name)); err == nil { oldSha256 = checksumHex(oldContents) } @@ -72,7 +71,7 @@ func OurRestoreAsset(dir, name string, funcMap template.FuncMap, shas map[string return err } - if err := ioutil.WriteFile(_filePath(dir, name), b.Bytes(), info.Mode()); err != nil { + if err := os.WriteFile(_filePath(dir, name), b.Bytes(), info.Mode()); err != nil { return err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/packager/packager.go b/vendor/github.com/cloudfoundry/libbuildpack/packager/packager.go index 755aa71a8..2f0810686 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/packager/packager.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/packager/packager.go @@ -9,7 +9,6 @@ import ( "encoding/hex" "fmt" "io" - "io/ioutil" "log" "net/http" "net/url" @@ -27,7 +26,7 @@ type sha struct { } func readManifest(bpDir string) (Manifest, error) { - data, err := ioutil.ReadFile(filepath.Join(bpDir, "manifest.yml")) + data, err := os.ReadFile(filepath.Join(bpDir, "manifest.yml")) if err != nil { return Manifest{}, err } @@ -53,7 +52,7 @@ func CompileExtensionPackage(bpDir, version string, cached bool, stack string) ( return "", fmt.Errorf("Failed to copy %s: %v", bpDir, err) } - err = ioutil.WriteFile(filepath.Join(dir, "VERSION"), []byte(version), 0644) + err = os.WriteFile(filepath.Join(dir, "VERSION"), []byte(version), 0644) if err != nil { return "", fmt.Errorf("Failed to write VERSION file: %v", err) } @@ -168,7 +167,7 @@ func Package(bpDir, cacheDir, version, stack string, cached bool) (string, error } defer os.RemoveAll(dir) - err = ioutil.WriteFile(filepath.Join(dir, "VERSION"), []byte(version), 0644) + err = os.WriteFile(filepath.Join(dir, "VERSION"), []byte(version), 0644) if err != nil { return "", err } @@ -304,7 +303,7 @@ func DownloadFromURI(uri, fileName string) error { } func checkSha256(filePath, expectedSha256 string) error { - content, err := ioutil.ReadFile(filePath) + content, err := os.ReadFile(filePath) if err != nil { return err } @@ -373,7 +372,7 @@ func ZipFiles(filename string, files []File) error { } func CopyDirectory(srcDir string) (string, error) { - destDir, err := ioutil.TempDir("", "buildpack-packager") + destDir, err := os.MkdirTemp("", "buildpack-packager") if err != nil { return "", err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/packager/summary.go b/vendor/github.com/cloudfoundry/libbuildpack/packager/summary.go index 468855092..7381c30cf 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/packager/summary.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/packager/summary.go @@ -2,7 +2,7 @@ package packager import ( "fmt" - "io/ioutil" + "os" "path/filepath" "sort" "strings" @@ -12,7 +12,7 @@ import ( func Summary(bpDir string) (string, error) { manifest := Manifest{} - data, err := ioutil.ReadFile(filepath.Join(bpDir, "manifest.yml")) + data, err := os.ReadFile(filepath.Join(bpDir, "manifest.yml")) if err != nil { return "", err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/snapshot/snapshot.go b/vendor/github.com/cloudfoundry/libbuildpack/snapshot/snapshot.go index 4f87c4f4e..2c7a7a74e 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/snapshot/snapshot.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/snapshot/snapshot.go @@ -4,7 +4,6 @@ import ( "crypto/md5" "fmt" "io" - "io/ioutil" "os" "path/filepath" "strings" @@ -39,7 +38,7 @@ func Dir(dir string, logger Logger) *DirSnapshot { dirSnapshot.initialChecksum = checksum } - dirSnapshot.command.Execute(dir, ioutil.Discard, ioutil.Discard, "touch", "/tmp/checkpoint") + dirSnapshot.command.Execute(dir, io.Discard, io.Discard, "touch", "/tmp/checkpoint") } return dirSnapshot diff --git a/vendor/github.com/cloudfoundry/libbuildpack/stager.go b/vendor/github.com/cloudfoundry/libbuildpack/stager.go index f9c63e3f7..38a9d54a8 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/stager.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/stager.go @@ -3,7 +3,6 @@ package libbuildpack import ( "errors" "fmt" - "io/ioutil" "os" "path/filepath" "strings" @@ -95,7 +94,7 @@ func (s *Stager) WriteEnvFile(envVar, envVal string) error { } - return ioutil.WriteFile(filepath.Join(envDir, envVar), []byte(envVal), 0644) + return os.WriteFile(filepath.Join(envDir, envVar), []byte(envVal), 0644) } func (s *Stager) LinkDirectoryInDepDir(destDir, depSubDir string) error { @@ -104,7 +103,7 @@ func (s *Stager) LinkDirectoryInDepDir(destDir, depSubDir string) error { return err } - files, err := ioutil.ReadDir(destDir) + files, err := os.ReadDir(destDir) if err != nil { return err } @@ -153,7 +152,7 @@ func (s *Stager) StagingComplete() { } func (s *Stager) ClearCache() error { - files, err := ioutil.ReadDir(s.cacheDir) + files, err := os.ReadDir(s.cacheDir) if err != nil { if os.IsNotExist(err) { return nil @@ -172,7 +171,7 @@ func (s *Stager) ClearCache() error { } func (s *Stager) ClearDepDir() error { - files, err := ioutil.ReadDir(s.DepDir()) + files, err := os.ReadDir(s.DepDir()) if err != nil { return err } @@ -234,14 +233,14 @@ func (s *Stager) SetStagingEnvironment() error { } for _, dir := range depsPaths { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return err } for _, file := range files { - if file.Mode().IsRegular() { - val, err := ioutil.ReadFile(filepath.Join(dir, file.Name())) + if file.Type().IsRegular() { + val, err := os.ReadFile(filepath.Join(dir, file.Name())) if err != nil { return err } @@ -293,13 +292,13 @@ func (s *Stager) SetLaunchEnvironment() error { depsIdx := sections[len(sections)-2] - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return err } for _, file := range files { - if file.Mode().IsRegular() { + if file.Type().IsRegular() { src := filepath.Join(dir, file.Name()) dest := filepath.Join(s.profileDir, depsIdx+"_"+file.Name()) @@ -322,7 +321,7 @@ func (s *Stager) BuildpackVersion() (string, error) { } func existingDepsDirs(depsDir, subDir, prefix string) ([]string, error) { - files, err := ioutil.ReadDir(depsDir) + files, err := os.ReadDir(depsDir) if err != nil { return nil, err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/util.go b/vendor/github.com/cloudfoundry/libbuildpack/util.go index 686103266..93b442863 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/util.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/util.go @@ -9,7 +9,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "math/rand" "net/http" "net/url" @@ -22,17 +21,13 @@ import ( backoff "github.com/cenkalti/backoff/v4" ) -func init() { - rand.Seed(time.Now().UnixNano()) -} - func MoveDirectory(srcDir, destDir string) error { destExists, _ := FileExists(destDir) if !destExists { return os.Rename(srcDir, destDir) } - files, err := ioutil.ReadDir(srcDir) + files, err := os.ReadDir(srcDir) if err != nil { return err } @@ -43,7 +38,7 @@ func MoveDirectory(srcDir, destDir string) error { if exists, err := FileExists(dest); err != nil { return err } else if !exists { - if m := f.Mode(); m&os.ModeSymlink != 0 { + if m := f.Type(); m&os.ModeSymlink != 0 { if err = moveSymlinks(src, dest); err != nil { return err } @@ -69,7 +64,7 @@ func CopyDirectory(srcDir, destDir string) error { return errors.New("destination dir must exist") } - files, err := ioutil.ReadDir(srcDir) + files, err := os.ReadDir(srcDir) if err != nil { return err } @@ -78,12 +73,16 @@ func CopyDirectory(srcDir, destDir string) error { src := filepath.Join(srcDir, f.Name()) dest := filepath.Join(destDir, f.Name()) - if m := f.Mode(); m&os.ModeSymlink != 0 { + if m := f.Type(); m&os.ModeSymlink != 0 { if err = moveSymlinks(src, dest); err != nil { return err } } else if f.IsDir() { - err = os.MkdirAll(dest, f.Mode()) + fi, err := f.Info() + if err != nil { + return err + } + err = os.MkdirAll(dest, fi.Mode()) if err != nil { return err } @@ -96,7 +95,13 @@ func CopyDirectory(srcDir, destDir string) error { return err } - err = writeToFile(rc, dest, f.Mode()) + fi, err := f.Info() + if err != nil { + rc.Close() + return err + } + + err = writeToFile(rc, dest, fi.Mode()) if err != nil { rc.Close() return err @@ -500,7 +505,7 @@ func filterURI(rawURL string) (string, error) { } func CheckSha256(filePath, expectedSha256 string) error { - content, err := ioutil.ReadFile(filePath) + content, err := os.ReadFile(filePath) if err != nil { return err } diff --git a/vendor/github.com/cloudfoundry/libbuildpack/yaml.go b/vendor/github.com/cloudfoundry/libbuildpack/yaml.go index 8cbe8cb75..368ce12d0 100644 --- a/vendor/github.com/cloudfoundry/libbuildpack/yaml.go +++ b/vendor/github.com/cloudfoundry/libbuildpack/yaml.go @@ -2,7 +2,7 @@ package libbuildpack import ( "bytes" - "io/ioutil" + "os" yaml "gopkg.in/yaml.v2" ) @@ -15,7 +15,7 @@ func NewYAML() *YAML { } func (y *YAML) Load(file string, obj interface{}) error { - data, err := ioutil.ReadFile(file) + data, err := os.ReadFile(file) if err != nil { return err } diff --git a/vendor/modules.txt b/vendor/modules.txt index e2f145fc1..9803a1092 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -23,7 +23,7 @@ github.com/blang/semver # github.com/cenkalti/backoff/v4 v4.3.0 ## explicit; go 1.18 github.com/cenkalti/backoff/v4 -# github.com/cloudfoundry/libbuildpack v0.0.0-20260306121953-8ab9253c8181 +# github.com/cloudfoundry/libbuildpack v0.0.0-20260306125332-dcaf55eb6f33 ## explicit; go 1.22.5 github.com/cloudfoundry/libbuildpack github.com/cloudfoundry/libbuildpack/ansicleaner From cd8b7abf20f033464b083b04539bc49b9343a478 Mon Sep 17 00:00:00 2001 From: Pascal Zimmermann Date: Mon, 20 Apr 2026 09:58:42 +0200 Subject: [PATCH 5/7] docs: Adjust the docs Signed-off-by: Pascal Zimmermann --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b3d1c67f..eda068e0b 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Official buildpack documentation can be found at [python buildpack docs](http:// ## Adding new dependencies -If you want to add a new dependency to the buildpack, please add it to the [config.yml](https://github.com/ZPascal/buildpacks-ci/blob/81d4f7942a9e4f01196ab654b6a5f89681015d41/pipelines/dependency-builds/config.yml#L272) file. For example, if you want to add a new version of Python, add an entry like the following: +If you want to add a new dependency to the buildpack, please add it to the [config.yml](https://github.com/cloudfoundry/buildpacks-ci/blob/5a63d13df09f83d5dff7c71d0a12c3e2dc798d39/pipelines/dependency-builds/config.yml#L272) file. For example, if you want to add a new version of Python, add an entry like the following: ```yaml python: From 894b2680a23fb270af45fb8707f8a324a5d70911 Mon Sep 17 00:00:00 2001 From: Pascal Zimmermann Date: Tue, 21 Apr 2026 21:58:40 +0200 Subject: [PATCH 6/7] feat: Add poetry-core bootstrap support for offline sdist deployments --- manifest.yml | 125 +++++++++++++++++++------------ src/python/supply/supply.go | 61 ++++++++++++++- src/python/supply/supply_test.go | 60 +++++++++++++-- 3 files changed, 187 insertions(+), 59 deletions(-) diff --git a/manifest.yml b/manifest.yml index 0347326cf..8b6384259 100644 --- a/manifest.yml +++ b/manifest.yml @@ -24,6 +24,10 @@ dependency_deprecation_dates: name: python date: 2030-10-07 link: https://peps.python.org/pep-0745/ +- version_line: 3.9.x + name: python + date: 2025-10-05 + link: https://www.python.org/dev/peps/pep-0596/ dependencies: - name: flit-core version: 3.12.0 @@ -98,21 +102,45 @@ dependencies: source: https://files.pythonhosted.org/packages/ca/5b/8ce5227713d692913c186d9a3164eee0236fbc3eaca87d7e2bd5dbb1da36/pipenv-2024.4.1.tar.gz source_sha256: e8ea6105c1cdda7d5c19df7bd6439a006751f3d4e017602c791e7b51314adf84 - name: pipenv - version: 2026.5.2 - uri: https://buildpacks.cloudfoundry.org/dependencies/pipenv/pipenv_2026.5.2_linux_noarch_cflinuxfs4_74c1a3ab.tgz - sha256: 74c1a3ab922ae87de22698eeec0aaa7ba54a1b7af767144eb52d34ef0c7acab5 + version: 2026.0.3 + uri: https://buildpacks.cloudfoundry.org/dependencies/pipenv/pipenv_2026.0.3_linux_noarch_cflinuxfs4_d8aebaca.tgz + sha256: d8aebacaafc6a876704920748c4918443d3a07ae70e9039937bfbbfacf7e12d0 cf_stacks: - cflinuxfs4 - source: https://files.pythonhosted.org/packages/00/bf/9e5a536eae91adcbed6ee9c44861250bdfdc42bf2663680ce44cf5253fdb/pipenv-2026.5.2.tar.gz - source_sha256: cf5985038a4cc4a1ffe9b48a2e580d2595245823dcc5684d07b1a53929ab47cc + source: https://files.pythonhosted.org/packages/90/03/8958464e0d366530477f07fd041ef6b9df56f3ea9c56d0db24cc8cd87fff/pipenv-2026.0.3.tar.gz + source_sha256: 9a39d13a41ed8e4368ad50620941191f357319c8ffb7df45875c7c5dc6604ff6 - name: pipenv - version: 2026.5.2 - uri: https://buildpacks.cloudfoundry.org/dependencies/pipenv/pipenv_2026.5.2_linux_noarch_cflinuxfs5_569f70b0.tgz - sha256: 569f70b09c3b3440c6385aad160bef6b3539fd7b6211a73bfe41600d8b3fdfad + version: 2026.0.3 + uri: https://buildpacks.cloudfoundry.org/dependencies/pipenv/pipenv_2026.0.3_linux_noarch_cflinuxfs5_23a2629d.tgz + sha256: 23a2629da1873b0ffb25b79a5cce94263615437a7fc8a3be8f63550376ea6bd7 + cf_stacks: + - cflinuxfs5 + source: https://files.pythonhosted.org/packages/90/03/8958464e0d366530477f07fd041ef6b9df56f3ea9c56d0db24cc8cd87fff/pipenv-2026.0.3.tar.gz + source_sha256: 9a39d13a41ed8e4368ad50620941191f357319c8ffb7df45875c7c5dc6604ff6 +- name: python + version: 3.9.24 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.9.24_linux_x64_cflinuxfs3_e7fcaa7e.tgz + sha256: e7fcaa7ebfab1610a902c86a886515b8db074039284bdf6deb54353d664a5e79 + cf_stacks: + - cflinuxfs3 + source: https://www.python.org/ftp/python/3.9.24/Python-3.9.24.tgz + source_sha256: 9a32cfc683aecaadbd9ed891ac2af9451ff37f48a00a2d8e1f4ecd9c2a1ffdcb +- name: python + version: 3.9.25 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.9.25_linux_x64_cflinuxfs4_47183960.tgz + sha256: 47183960e453a25d6e30b763a6e868f812b58234ba747f2a380c241109b8856c + cf_stacks: + - cflinuxfs4 + source: https://www.python.org/ftp/python/3.9.25/Python-3.9.25.tgz + source_sha256: a7438eabd3a48139f42d4e058096af8d880b0bb6e8fb8c78838892e4ce5583f2 +- name: python + version: 3.10.9 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.10.9_linux_x64_cflinuxfs5_2b1ef984.tgz + sha256: 2b1ef9845d7f2a48ea757358b747a8a3b2620df008f6773bcede3ac4e171af59 cf_stacks: - cflinuxfs5 - source: https://files.pythonhosted.org/packages/00/bf/9e5a536eae91adcbed6ee9c44861250bdfdc42bf2663680ce44cf5253fdb/pipenv-2026.5.2.tar.gz - source_sha256: cf5985038a4cc4a1ffe9b48a2e580d2595245823dcc5684d07b1a53929ab47cc + source: https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz + source_sha256: 4ccd7e46c8898f4c7862910a1703aa0e63525913a519abb2f55e26220a914d88 - name: python version: 3.10.19 uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.10.19_linux_x64_cflinuxfs3_d754b71d.tgz @@ -122,21 +150,13 @@ dependencies: source: https://www.python.org/ftp/python/3.10.19/Python-3.10.19.tgz source_sha256: a078fb2d7a216071ebbe2e34b5f5355dd6b6e9b0cd1bacc4a41c63990c5a0eec - name: python - version: 3.10.20 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.10.20_linux_x64_cflinuxfs4_b4c18ea7.tgz - sha256: b4c18ea789c68f583899138a65f08dc1a576376239002cf1b01519e445fb7164 + version: 3.10.19 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.10.19_linux_x64_cflinuxfs4_b9b2cdae.tgz + sha256: b9b2cdae0b86f5e921e5cb22be81b466812d77548dc732434ee0575443f4f038 cf_stacks: - cflinuxfs4 - source: https://www.python.org/ftp/python/3.10.20/Python-3.10.20.tgz - source_sha256: 4ff5fd4c5bab803b935019f3e31d7219cebd6f870d00389cea53b88bbe935d1a -- name: python - version: 3.10.20 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.10.20_linux_x64_cflinuxfs5_8bb35886.tgz - sha256: 8bb358865558b85b8561c8b1cc08575dec51bf847d01be2d425e1295a7234de5 - cf_stacks: - - cflinuxfs5 - source: https://www.python.org/ftp/python/3.10.20/Python-3.10.20.tgz - source_sha256: 4ff5fd4c5bab803b935019f3e31d7219cebd6f870d00389cea53b88bbe935d1a + source: https://www.python.org/ftp/python/3.10.19/Python-3.10.19.tgz + source_sha256: a078fb2d7a216071ebbe2e34b5f5355dd6b6e9b0cd1bacc4a41c63990c5a0eec - name: python version: 3.11.14 uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.11.14_linux_x64_cflinuxfs3_294394be.tgz @@ -186,21 +206,21 @@ dependencies: source: https://www.python.org/ftp/python/3.13.9/Python-3.13.9.tgz source_sha256: c4c066af19c98fb7835d473bebd7e23be84f6e9874d47db9e39a68ee5d0ce35c - name: python - version: 3.13.13 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.13.13_linux_x64_cflinuxfs4_8311abbf.tgz - sha256: 8311abbf60e3c061a70eabca62ccddba613ee0eeac790ec6f7e42b75213a05f1 + version: 3.13.12 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.13.12_linux_x64_cflinuxfs4_13421a49.tgz + sha256: 13421a490598ca03f9242df1230023737d401a456c1b6429721f7e88607032b3 cf_stacks: - cflinuxfs4 - source: https://www.python.org/ftp/python/3.13.13/Python-3.13.13.tgz - source_sha256: f9cde7b0e2ec8165d7326e2a0f59ea2686ce9d0c617dbbb3d66a7e54d31b74b9 + source: https://www.python.org/ftp/python/3.13.12/Python-3.13.12.tgz + source_sha256: 12e7cb170ad2d1a69aee96a1cc7fc8de5b1e97a2bdac51683a3db016ec9a2996 - name: python - version: 3.13.13 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.13.13_linux_x64_cflinuxfs5_953e784f.tgz - sha256: 953e784f168dfcb66192b209181f2bbf4f9b6e554edb1938d367d7b1498aaa5f + version: 3.13.12 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.13.12_linux_x64_cflinuxfs5_d923c02a.tgz + sha256: d923c02aa27386583a1ecea31220a1aaadb7cc323be32dc8f71b1dd5ba81af62 cf_stacks: - cflinuxfs5 - source: https://www.python.org/ftp/python/3.13.13/Python-3.13.13.tgz - source_sha256: f9cde7b0e2ec8165d7326e2a0f59ea2686ce9d0c617dbbb3d66a7e54d31b74b9 + source: https://www.python.org/ftp/python/3.13.12/Python-3.13.12.tgz + source_sha256: 12e7cb170ad2d1a69aee96a1cc7fc8de5b1e97a2bdac51683a3db016ec9a2996 - name: python version: 3.14.2 uri: https://buildpack-dependencies.tanzu.vmware.com/cf/python/python_3.14.2_linux_x64_cflinuxfs3_82c1798d.tgz @@ -210,30 +230,39 @@ dependencies: source: https://www.python.org/ftp/python/3.14.2/Python-3.14.2.tgz source_sha256: c609e078adab90e2c6bacb6afafacd5eaf60cd94cf670f1e159565725fcd448d - name: python - version: 3.14.4 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.14.4_linux_x64_cflinuxfs4_c99dfa05.tgz - sha256: c99dfa053d8b47dab158af2e072d0a4c80c6593443cb97e759e45de1934afc96 + version: 3.14.3 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.14.3_linux_x64_cflinuxfs4_a54b3e20.tgz + sha256: a54b3e20698a979d70fdc15af5a426b6bcf861ba6f37055e1da535c6562a8122 cf_stacks: - cflinuxfs4 - source: https://www.python.org/ftp/python/3.14.4/Python-3.14.4.tgz - source_sha256: b4c059d5895f030e7df9663894ce3732bfa1b32cd3ab2883980266a45ce3cb3b + source: https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tgz + source_sha256: d7fe130d0501ae047ca318fa92aa642603ab6f217901015a1df6ce650d5470cd - name: python - version: 3.14.4 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.14.4_linux_x64_cflinuxfs5_ae27ea8c.tgz - sha256: ae27ea8c3e4b063be4f1dfbfcb37b65fe55be0c9812f275f56e68df96e7283ec + version: 3.14.3 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.14.3_linux_x64_cflinuxfs5_62e6a7a7.tgz + sha256: 62e6a7a7a369c77412c1db87799128cd87a27bbfd14969c01ff4719a7bd7049f cf_stacks: - cflinuxfs5 - source: https://www.python.org/ftp/python/3.14.4/Python-3.14.4.tgz - source_sha256: b4c059d5895f030e7df9663894ce3732bfa1b32cd3ab2883980266a45ce3cb3b + source: https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tgz + source_sha256: d7fe130d0501ae047ca318fa92aa642603ab6f217901015a1df6ce650d5470cd +- name: setuptools + version: 80.9.0 + uri: https://buildpacks.cloudfoundry.org/dependencies/setuptools/setuptools_80.9.0_linux_noarch_any-stack_db9ec7d3.tgz + sha256: db9ec7d3c1b8e1494852b7228c3de7dd7449a1c4a53297ea9633a117eedf6787 + cf_stacks: + - cflinuxfs4 + - cflinuxfs3 + source: https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz + source_sha256: f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c - name: setuptools - version: 82.0.1 - uri: https://buildpacks.cloudfoundry.org/dependencies/setuptools/setuptools_82.0.1_linux_noarch_any-stack_934b4323.tgz - sha256: 934b4323475131e04577a24eff3774f75a1219948f49c63afcd5e35a507d8ba7 + version: 82.0.0 + uri: https://buildpacks.cloudfoundry.org/dependencies/setuptools/setuptools_82.0.0_linux_noarch_any-stack_284f639c.tgz + sha256: 284f639c6d85d6f159daa5eb35a28f0351f185ffebb50bd6deebf73d8d3ca444 cf_stacks: - cflinuxfs4 - cflinuxfs5 - source: https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz - source_sha256: 7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9 + source: https://files.pythonhosted.org/packages/82/f3/748f4d6f65d1756b9ae577f329c951cda23fb900e4de9f70900ced962085/setuptools-82.0.0.tar.gz + source_sha256: 22e0a2d69474c6ae4feb01951cb69d515ed23728cf96d05513d36e42b62b37cb include_files: - CHANGELOG - CONTRIBUTING.md diff --git a/src/python/supply/supply.go b/src/python/supply/supply.go index 32b513c49..5dcdd7442 100644 --- a/src/python/supply/supply.go +++ b/src/python/supply/supply.go @@ -743,19 +743,74 @@ func (s *Supplier) RunPipVendored() error { // dependencies - wheel and setuptools. These are packaged by the dependency // pipeline within the "pip" dependency. func (s *Supplier) InstallCommonBuildDependencies() error { - var commonDeps = []string{"wheel", "setuptools", "flit-core"} + // wheel and setuptools are packaged as pip-installable sdists inside the + // "pip" dependency tarball. flit-core is a separate dependency whose + // tarball contains the raw Python source tree (not an sdist/wheel for pip). + // + // Bootstrap strategy: + // 1. Extract the pip tarball → /tmp/common_build_deps (wheel/setuptools sdists land here) + // 2. Extract the flit-core tarball → /tmp/common_build_deps + // → /tmp/common_build_deps/flit_core/ (source) + pyproject.toml + // 3. Set PYTHONPATH=/tmp/common_build_deps so flit_core is importable. + // 4. pip install /tmp/common_build_deps --no-build-isolation + // → builds flit_core wheel using itself from PYTHONPATH and installs it. + // 5. pip install wheel setuptools --no-index --no-build-isolation --find-links=tempPath + // → flit_core is now a real installed package, so wheel's build succeeds. tempPath := filepath.Join("/tmp", "common_build_deps") if err := s.Installer.InstallOnlyVersion("pip", tempPath); err != nil { return err } + if err := s.Installer.InstallOnlyVersion("flit-core", tempPath); err != nil { + return err + } + + // Step 3: make flit_core source importable. + prevPythonPath := os.Getenv("PYTHONPATH") + newPythonPath := tempPath + if prevPythonPath != "" { + newPythonPath = tempPath + string(os.PathListSeparator) + prevPythonPath + } + os.Setenv("PYTHONPATH", newPythonPath) + defer os.Setenv("PYTHONPATH", prevPythonPath) - for _, dep := range commonDeps { + // Step 4: install flit_core from its source directory via bootstrap. + s.Log.Info("Installing build-time dependency flit-core (bootstrap)") + if err := s.runPipInstall(tempPath, "--no-build-isolation"); err != nil { + return fmt.Errorf("could not bootstrap-install flit-core: %v", err) + } + + // Step 5: install wheel and setuptools (now flit_core is installed). + for _, dep := range []string{"wheel", "setuptools"} { s.Log.Info("Installing build-time dependency %s", dep) - args := []string{dep, "--no-index", "--upgrade-strategy=only-if-needed", fmt.Sprintf("--find-links=%s", tempPath)} + args := []string{dep, "--no-index", "--no-build-isolation", "--upgrade-strategy=only-if-needed", fmt.Sprintf("--find-links=%s", tempPath)} if err := s.runPipInstall(args...); err != nil { return fmt.Errorf("could not install build-time dependency %s: %v", dep, err) } } + + // Step 6: install poetry-core. + // poetry-core is bundled in the buildpack under vendor_bundled/poetry-core_2.1.3.tgz. + // Its pyproject.toml declares backend-path = ["src"] and requires = [], + // so it self-bootstraps with --no-build-isolation (no build deps required). + bpDir, err := libbuildpack.GetBuildpackDir() + if err != nil { + return fmt.Errorf("could not determine buildpack dir for poetry-core bootstrap: %v", err) + } + poetryCoreTar := filepath.Join(bpDir, "vendor_bundled", "poetry-core_2.1.3.tgz") + poetryCoreSrc := filepath.Join("/tmp", "poetry_core_src") + if err := os.MkdirAll(poetryCoreSrc, 0755); err != nil { + return fmt.Errorf("could not create poetry-core src dir: %v", err) + } + s.Log.Info("Extracting bundled poetry-core from %s", poetryCoreTar) + if err := s.Command.Execute("/", indentWriter(os.Stdout), indentWriter(os.Stderr), + "tar", "xzf", poetryCoreTar, "-C", poetryCoreSrc); err != nil { + return fmt.Errorf("could not extract poetry-core tarball: %v", err) + } + s.Log.Info("Installing build-time dependency poetry-core (bootstrap)") + if err := s.runPipInstall(poetryCoreSrc, "--no-build-isolation"); err != nil { + return fmt.Errorf("could not bootstrap-install poetry-core: %v", err) + } + return nil } diff --git a/src/python/supply/supply_test.go b/src/python/supply/supply_test.go index 9b37a64cc..cab17d389 100644 --- a/src/python/supply/supply_test.go +++ b/src/python/supply/supply_test.go @@ -632,27 +632,71 @@ MarkupSafe==2.0.1 }) Describe("InstallCommonBuildDependencies", func() { + var bpDir string + + BeforeEach(func() { + bpDir, err = os.MkdirTemp("", "python-buildpack.bp.") + Expect(err).To(BeNil()) + DeferCleanup(os.RemoveAll, bpDir) + // Create the vendor_bundled directory with a dummy poetry-core tarball + Expect(os.MkdirAll(filepath.Join(bpDir, "vendor_bundled"), 0755)).To(Succeed()) + Expect(os.WriteFile(filepath.Join(bpDir, "vendor_bundled", "poetry-core_2.1.3.tgz"), []byte("dummy"), 0644)).To(Succeed()) + // GetBuildpackDir() reads BUILDPACK_DIR env var if set + os.Setenv("BUILDPACK_DIR", bpDir) + DeferCleanup(os.Unsetenv, "BUILDPACK_DIR") + }) + Context("successful installation", func() { - It("runs command to install wheel, setuptools and flit-core", func() { + It("bootstraps flit-core, wheel, setuptools and poetry-core", func() { + // Step 1+2: install pip and flit-core dependency tarballs mockInstaller.EXPECT().InstallOnlyVersion("pip", "/tmp/common_build_deps") - mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "wheel", "--no-index", "--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", "--upgrade-strategy=only-if-needed", "--find-links=/tmp/common_build_deps") - mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "flit-core", "--no-index", "--upgrade-strategy=only-if-needed", "--find-links=/tmp/common_build_deps") + mockInstaller.EXPECT().InstallOnlyVersion("flit-core", "/tmp/common_build_deps") + // Step 4: bootstrap flit_core from source + mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/common_build_deps", "--no-build-isolation") + // Step 5: install wheel and setuptools + 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") + // Step 6: extract and bootstrap poetry-core + poetryCoreTar := filepath.Join(bpDir, "vendor_bundled", "poetry-core_2.1.3.tgz") + mockCommand.EXPECT().Execute("/", gomock.Any(), gomock.Any(), "tar", "xzf", poetryCoreTar, "-C", "/tmp/poetry_core_src") + mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/poetry_core_src", "--no-build-isolation") Expect(supplier.InstallCommonBuildDependencies()).To(Succeed()) }) }) - Context("installation fails", func() { - BeforeEach(func() { - mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "wheel", "--no-index", "--upgrade-strategy=only-if-needed", "--find-links=/tmp/common_build_deps").Return(fmt.Errorf("some-pip-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("wheel installation fails", func() { It("returns a useful error message", func() { - mockInstaller.EXPECT().InstallOnlyVersion(gomock.Any(), gomock.Any()).Times(1) + 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") + 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")) }) }) + + 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") + 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") + poetryCoreTar := filepath.Join(bpDir, "vendor_bundled", "poetry-core_2.1.3.tgz") + mockCommand.EXPECT().Execute("/", gomock.Any(), gomock.Any(), "tar", "xzf", poetryCoreTar, "-C", "/tmp/poetry_core_src") + mockCommand.EXPECT().Execute(buildDir, gomock.Any(), gomock.Any(), "python", "-m", "pip", "install", "/tmp/poetry_core_src", "--no-build-isolation").Return(fmt.Errorf("poetry-error")) + Expect(supplier.InstallCommonBuildDependencies()).To(MatchError("could not bootstrap-install poetry-core: poetry-error")) + }) + }) }) Describe("CreateDefaultEnv", func() { From 027110f3e4d552e2adf322d686510282c275e4b3 Mon Sep 17 00:00:00 2001 From: Pascal Zimmermann Date: Tue, 21 Apr 2026 22:59:42 +0200 Subject: [PATCH 7/7] fix: Reset the manifest.yml --- manifest.yml | 125 ++++++++++++++++++++------------------------------- 1 file changed, 48 insertions(+), 77 deletions(-) diff --git a/manifest.yml b/manifest.yml index 8b6384259..0347326cf 100644 --- a/manifest.yml +++ b/manifest.yml @@ -24,10 +24,6 @@ dependency_deprecation_dates: name: python date: 2030-10-07 link: https://peps.python.org/pep-0745/ -- version_line: 3.9.x - name: python - date: 2025-10-05 - link: https://www.python.org/dev/peps/pep-0596/ dependencies: - name: flit-core version: 3.12.0 @@ -102,45 +98,21 @@ dependencies: source: https://files.pythonhosted.org/packages/ca/5b/8ce5227713d692913c186d9a3164eee0236fbc3eaca87d7e2bd5dbb1da36/pipenv-2024.4.1.tar.gz source_sha256: e8ea6105c1cdda7d5c19df7bd6439a006751f3d4e017602c791e7b51314adf84 - name: pipenv - version: 2026.0.3 - uri: https://buildpacks.cloudfoundry.org/dependencies/pipenv/pipenv_2026.0.3_linux_noarch_cflinuxfs4_d8aebaca.tgz - sha256: d8aebacaafc6a876704920748c4918443d3a07ae70e9039937bfbbfacf7e12d0 + version: 2026.5.2 + uri: https://buildpacks.cloudfoundry.org/dependencies/pipenv/pipenv_2026.5.2_linux_noarch_cflinuxfs4_74c1a3ab.tgz + sha256: 74c1a3ab922ae87de22698eeec0aaa7ba54a1b7af767144eb52d34ef0c7acab5 cf_stacks: - cflinuxfs4 - source: https://files.pythonhosted.org/packages/90/03/8958464e0d366530477f07fd041ef6b9df56f3ea9c56d0db24cc8cd87fff/pipenv-2026.0.3.tar.gz - source_sha256: 9a39d13a41ed8e4368ad50620941191f357319c8ffb7df45875c7c5dc6604ff6 + source: https://files.pythonhosted.org/packages/00/bf/9e5a536eae91adcbed6ee9c44861250bdfdc42bf2663680ce44cf5253fdb/pipenv-2026.5.2.tar.gz + source_sha256: cf5985038a4cc4a1ffe9b48a2e580d2595245823dcc5684d07b1a53929ab47cc - name: pipenv - version: 2026.0.3 - uri: https://buildpacks.cloudfoundry.org/dependencies/pipenv/pipenv_2026.0.3_linux_noarch_cflinuxfs5_23a2629d.tgz - sha256: 23a2629da1873b0ffb25b79a5cce94263615437a7fc8a3be8f63550376ea6bd7 - cf_stacks: - - cflinuxfs5 - source: https://files.pythonhosted.org/packages/90/03/8958464e0d366530477f07fd041ef6b9df56f3ea9c56d0db24cc8cd87fff/pipenv-2026.0.3.tar.gz - source_sha256: 9a39d13a41ed8e4368ad50620941191f357319c8ffb7df45875c7c5dc6604ff6 -- name: python - version: 3.9.24 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.9.24_linux_x64_cflinuxfs3_e7fcaa7e.tgz - sha256: e7fcaa7ebfab1610a902c86a886515b8db074039284bdf6deb54353d664a5e79 - cf_stacks: - - cflinuxfs3 - source: https://www.python.org/ftp/python/3.9.24/Python-3.9.24.tgz - source_sha256: 9a32cfc683aecaadbd9ed891ac2af9451ff37f48a00a2d8e1f4ecd9c2a1ffdcb -- name: python - version: 3.9.25 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.9.25_linux_x64_cflinuxfs4_47183960.tgz - sha256: 47183960e453a25d6e30b763a6e868f812b58234ba747f2a380c241109b8856c - cf_stacks: - - cflinuxfs4 - source: https://www.python.org/ftp/python/3.9.25/Python-3.9.25.tgz - source_sha256: a7438eabd3a48139f42d4e058096af8d880b0bb6e8fb8c78838892e4ce5583f2 -- name: python - version: 3.10.9 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.10.9_linux_x64_cflinuxfs5_2b1ef984.tgz - sha256: 2b1ef9845d7f2a48ea757358b747a8a3b2620df008f6773bcede3ac4e171af59 + version: 2026.5.2 + uri: https://buildpacks.cloudfoundry.org/dependencies/pipenv/pipenv_2026.5.2_linux_noarch_cflinuxfs5_569f70b0.tgz + sha256: 569f70b09c3b3440c6385aad160bef6b3539fd7b6211a73bfe41600d8b3fdfad cf_stacks: - cflinuxfs5 - source: https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz - source_sha256: 4ccd7e46c8898f4c7862910a1703aa0e63525913a519abb2f55e26220a914d88 + source: https://files.pythonhosted.org/packages/00/bf/9e5a536eae91adcbed6ee9c44861250bdfdc42bf2663680ce44cf5253fdb/pipenv-2026.5.2.tar.gz + source_sha256: cf5985038a4cc4a1ffe9b48a2e580d2595245823dcc5684d07b1a53929ab47cc - name: python version: 3.10.19 uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.10.19_linux_x64_cflinuxfs3_d754b71d.tgz @@ -150,13 +122,21 @@ dependencies: source: https://www.python.org/ftp/python/3.10.19/Python-3.10.19.tgz source_sha256: a078fb2d7a216071ebbe2e34b5f5355dd6b6e9b0cd1bacc4a41c63990c5a0eec - name: python - version: 3.10.19 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.10.19_linux_x64_cflinuxfs4_b9b2cdae.tgz - sha256: b9b2cdae0b86f5e921e5cb22be81b466812d77548dc732434ee0575443f4f038 + version: 3.10.20 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.10.20_linux_x64_cflinuxfs4_b4c18ea7.tgz + sha256: b4c18ea789c68f583899138a65f08dc1a576376239002cf1b01519e445fb7164 cf_stacks: - cflinuxfs4 - source: https://www.python.org/ftp/python/3.10.19/Python-3.10.19.tgz - source_sha256: a078fb2d7a216071ebbe2e34b5f5355dd6b6e9b0cd1bacc4a41c63990c5a0eec + source: https://www.python.org/ftp/python/3.10.20/Python-3.10.20.tgz + source_sha256: 4ff5fd4c5bab803b935019f3e31d7219cebd6f870d00389cea53b88bbe935d1a +- name: python + version: 3.10.20 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.10.20_linux_x64_cflinuxfs5_8bb35886.tgz + sha256: 8bb358865558b85b8561c8b1cc08575dec51bf847d01be2d425e1295a7234de5 + cf_stacks: + - cflinuxfs5 + source: https://www.python.org/ftp/python/3.10.20/Python-3.10.20.tgz + source_sha256: 4ff5fd4c5bab803b935019f3e31d7219cebd6f870d00389cea53b88bbe935d1a - name: python version: 3.11.14 uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.11.14_linux_x64_cflinuxfs3_294394be.tgz @@ -206,21 +186,21 @@ dependencies: source: https://www.python.org/ftp/python/3.13.9/Python-3.13.9.tgz source_sha256: c4c066af19c98fb7835d473bebd7e23be84f6e9874d47db9e39a68ee5d0ce35c - name: python - version: 3.13.12 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.13.12_linux_x64_cflinuxfs4_13421a49.tgz - sha256: 13421a490598ca03f9242df1230023737d401a456c1b6429721f7e88607032b3 + version: 3.13.13 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.13.13_linux_x64_cflinuxfs4_8311abbf.tgz + sha256: 8311abbf60e3c061a70eabca62ccddba613ee0eeac790ec6f7e42b75213a05f1 cf_stacks: - cflinuxfs4 - source: https://www.python.org/ftp/python/3.13.12/Python-3.13.12.tgz - source_sha256: 12e7cb170ad2d1a69aee96a1cc7fc8de5b1e97a2bdac51683a3db016ec9a2996 + source: https://www.python.org/ftp/python/3.13.13/Python-3.13.13.tgz + source_sha256: f9cde7b0e2ec8165d7326e2a0f59ea2686ce9d0c617dbbb3d66a7e54d31b74b9 - name: python - version: 3.13.12 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.13.12_linux_x64_cflinuxfs5_d923c02a.tgz - sha256: d923c02aa27386583a1ecea31220a1aaadb7cc323be32dc8f71b1dd5ba81af62 + version: 3.13.13 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.13.13_linux_x64_cflinuxfs5_953e784f.tgz + sha256: 953e784f168dfcb66192b209181f2bbf4f9b6e554edb1938d367d7b1498aaa5f cf_stacks: - cflinuxfs5 - source: https://www.python.org/ftp/python/3.13.12/Python-3.13.12.tgz - source_sha256: 12e7cb170ad2d1a69aee96a1cc7fc8de5b1e97a2bdac51683a3db016ec9a2996 + source: https://www.python.org/ftp/python/3.13.13/Python-3.13.13.tgz + source_sha256: f9cde7b0e2ec8165d7326e2a0f59ea2686ce9d0c617dbbb3d66a7e54d31b74b9 - name: python version: 3.14.2 uri: https://buildpack-dependencies.tanzu.vmware.com/cf/python/python_3.14.2_linux_x64_cflinuxfs3_82c1798d.tgz @@ -230,39 +210,30 @@ dependencies: source: https://www.python.org/ftp/python/3.14.2/Python-3.14.2.tgz source_sha256: c609e078adab90e2c6bacb6afafacd5eaf60cd94cf670f1e159565725fcd448d - name: python - version: 3.14.3 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.14.3_linux_x64_cflinuxfs4_a54b3e20.tgz - sha256: a54b3e20698a979d70fdc15af5a426b6bcf861ba6f37055e1da535c6562a8122 + version: 3.14.4 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.14.4_linux_x64_cflinuxfs4_c99dfa05.tgz + sha256: c99dfa053d8b47dab158af2e072d0a4c80c6593443cb97e759e45de1934afc96 cf_stacks: - cflinuxfs4 - source: https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tgz - source_sha256: d7fe130d0501ae047ca318fa92aa642603ab6f217901015a1df6ce650d5470cd + source: https://www.python.org/ftp/python/3.14.4/Python-3.14.4.tgz + source_sha256: b4c059d5895f030e7df9663894ce3732bfa1b32cd3ab2883980266a45ce3cb3b - name: python - version: 3.14.3 - uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.14.3_linux_x64_cflinuxfs5_62e6a7a7.tgz - sha256: 62e6a7a7a369c77412c1db87799128cd87a27bbfd14969c01ff4719a7bd7049f + version: 3.14.4 + uri: https://buildpacks.cloudfoundry.org/dependencies/python/python_3.14.4_linux_x64_cflinuxfs5_ae27ea8c.tgz + sha256: ae27ea8c3e4b063be4f1dfbfcb37b65fe55be0c9812f275f56e68df96e7283ec cf_stacks: - cflinuxfs5 - source: https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tgz - source_sha256: d7fe130d0501ae047ca318fa92aa642603ab6f217901015a1df6ce650d5470cd -- name: setuptools - version: 80.9.0 - uri: https://buildpacks.cloudfoundry.org/dependencies/setuptools/setuptools_80.9.0_linux_noarch_any-stack_db9ec7d3.tgz - sha256: db9ec7d3c1b8e1494852b7228c3de7dd7449a1c4a53297ea9633a117eedf6787 - cf_stacks: - - cflinuxfs4 - - cflinuxfs3 - source: https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz - source_sha256: f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c + source: https://www.python.org/ftp/python/3.14.4/Python-3.14.4.tgz + source_sha256: b4c059d5895f030e7df9663894ce3732bfa1b32cd3ab2883980266a45ce3cb3b - name: setuptools - version: 82.0.0 - uri: https://buildpacks.cloudfoundry.org/dependencies/setuptools/setuptools_82.0.0_linux_noarch_any-stack_284f639c.tgz - sha256: 284f639c6d85d6f159daa5eb35a28f0351f185ffebb50bd6deebf73d8d3ca444 + version: 82.0.1 + uri: https://buildpacks.cloudfoundry.org/dependencies/setuptools/setuptools_82.0.1_linux_noarch_any-stack_934b4323.tgz + sha256: 934b4323475131e04577a24eff3774f75a1219948f49c63afcd5e35a507d8ba7 cf_stacks: - cflinuxfs4 - cflinuxfs5 - source: https://files.pythonhosted.org/packages/82/f3/748f4d6f65d1756b9ae577f329c951cda23fb900e4de9f70900ced962085/setuptools-82.0.0.tar.gz - source_sha256: 22e0a2d69474c6ae4feb01951cb69d515ed23728cf96d05513d36e42b62b37cb + source: https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz + source_sha256: 7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9 include_files: - CHANGELOG - CONTRIBUTING.md