From 3361b77439ed317b4c9bb8e7709d8150b5794baf Mon Sep 17 00:00:00 2001 From: Tim Felgentreff Date: Tue, 19 May 2026 11:23:14 +0200 Subject: [PATCH 1/7] Apply CI spec version 7 --- ci.jsonnet | 6 +++--- ci/python-bench.libsonnet | 4 ++-- ci/python-gate.libsonnet | 22 ++++++++++++---------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/ci.jsonnet b/ci.jsonnet index 22a08ec2fc..6814726c97 100644 --- a/ci.jsonnet +++ b/ci.jsonnet @@ -6,7 +6,7 @@ (import "ci/python-bench.libsonnet") + { overlay: "28f1ff831cd38862c38c7d4c02fbf145b8a17b5c", - specVersion: "6", + specVersion: "7", // Until buildbot issues around CI tiers are resolved, we cannot use them // tierConfig: self.tierConfig, @@ -458,7 +458,7 @@ packages: { ruby: "==3.2.2", libyaml: "==0.2.5", - mx: "7.34.1", + mx: "==7.82.0", python3: "==3.8.10", }, environment: { @@ -508,7 +508,7 @@ targets: ["deploy"], capabilities: ["linux", "amd64"], packages: { - mx: "7.34.1", + mx: "==7.82.0", python3: "==3.8.10", }, requireArtifacts: [ diff --git a/ci/python-bench.libsonnet b/ci/python-bench.libsonnet index 468276c2ad..1fcc375d91 100644 --- a/ci/python-bench.libsonnet +++ b/ci/python-bench.libsonnet @@ -103,7 +103,7 @@ ] else [], local packages(os, arch) = self.packages(os, arch) + { - make: ">=3.83", + make: "==4.3", binutils: "==2.23.2", }, @@ -254,7 +254,7 @@ ], deploysArtifacts: true, packages +: packages(self.os, self.arch) + { - "apache/ant": ">=1.9.4", + "apache/ant": "==1.10.1", libyaml: "==0.2.5", "pip:ninja_syntax": "==1.7.2", "pip:pylint": "==2.4.4", diff --git a/ci/python-gate.libsonnet b/ci/python-gate.libsonnet index cfafaef82f..f7d0a22117 100644 --- a/ci/python-gate.libsonnet +++ b/ci/python-gate.libsonnet @@ -209,30 +209,32 @@ linux: { common: { "00:devtoolset": "==7", - "01:binutils": ">=2.34", - bzip2: ">=1.0.6", - cmake: ">=3.22.2", - zlib: ">=1.2.11", - lcov: ">=1.11", - libffi: ">=3.2.1", + "01:binutils": "==2.34", + bzip2: "==1.0.6", + cmake: "==3.22.2", + zlib: "==1.2.11", + lcov: "==1.14", + libffi: "==3.2.1", llvm: "==8.0.0", - maven: ">=3.3.9", + maven: "==3.9.10", curl: '==7.50.1', }, amd64: {}, - aarch64: {}, + aarch64: { + maven: "==3.5.3", + }, }, darwin: { common: { coreutils: "", - maven: ">=3.3.9", + maven: "==3.3.9", }, amd64: {}, aarch64: {}, }, windows: { common: { - maven: ">=3.3.9", + maven: "==3.3.9", }, amd64: {}, aarch64: {}, From 27e6e319a30aed27663073594658b8f563b4f4c5 Mon Sep 17 00:00:00 2001 From: Tim Felgentreff Date: Tue, 19 May 2026 17:34:06 +0200 Subject: [PATCH 2/7] Apply CI spec version 8 --- ci.jsonnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci.jsonnet b/ci.jsonnet index 6814726c97..595955f563 100644 --- a/ci.jsonnet +++ b/ci.jsonnet @@ -6,7 +6,7 @@ (import "ci/python-bench.libsonnet") + { overlay: "28f1ff831cd38862c38c7d4c02fbf145b8a17b5c", - specVersion: "7", + specVersion: "8", // Until buildbot issues around CI tiers are resolved, we cannot use them // tierConfig: self.tierConfig, From 1d4f42c8a178e0672c5e8e3d9d87f6003cdf1657 Mon Sep 17 00:00:00 2001 From: Tim Felgentreff Date: Tue, 19 May 2026 19:21:35 +0200 Subject: [PATCH 3/7] Fix website local theme path --- ci.jsonnet | 1 + 1 file changed, 1 insertion(+) diff --git a/ci.jsonnet b/ci.jsonnet index 595955f563..60fc190b80 100644 --- a/ci.jsonnet +++ b/ci.jsonnet @@ -477,6 +477,7 @@ ["mkdir", "-p", "../docs/site/vendor/cache"], ["cp", "graal-languages-jekyll-theme-*.gem", "../docs/site/vendor/cache"], ["cd", "../docs/site"], + ["bundle", "config", "set", "local.graal-languages-jekyll-theme", "../../graal-languages-jekyll-theme"], ["bundle", "config", "set", "mirror.https://rubygems.org", $.overlay_imports.RUBYGEMS_MIRROR], ["bundle", "install"], ["bundle", "exec", "jekyll", "build"], From b161270b5bbc3135b41818128d9a94fdfcd7062b Mon Sep 17 00:00:00 2001 From: Tim Felgentreff Date: Wed, 20 May 2026 11:00:00 +0200 Subject: [PATCH 4/7] Keep external URL tests GitHub-only --- .../tests/unittest_tags/test_codecmaps_cn.txt | 14 ++++++------ .../tests/unittest_tags/test_codecmaps_hk.txt | 6 ++--- .../tests/unittest_tags/test_codecmaps_jp.txt | 18 +++++++-------- .../tests/unittest_tags/test_codecmaps_kr.txt | 18 +++++++-------- .../tests/unittest_tags/test_codecmaps_tw.txt | 10 ++++----- .../src/tests/unittest_tags/test_hashlib.txt | 8 +++---- .../tests/unittest_tags/test_robotparser.txt | 6 ++--- .../tests/unittest_tags/test_unicodedata.txt | 2 +- .../tests/unittest_tags/test_urllib2net.txt | 16 +++++++------- .../tests/unittest_tags/test_urllibnet.txt | 22 +++++++++---------- 10 files changed, 60 insertions(+), 60 deletions(-) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_cn.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_cn.txt index 7e0dd2f6dd..ff73c64b96 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_cn.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_cn.txt @@ -1,7 +1,7 @@ -test.test_codecmaps_cn.TestGB18030Map.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_cn.TestGB18030Map.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_cn.TestGB2312Map.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_cn.TestGB2312Map.test_mapping_file @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_cn.TestGB2312Map.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_cn.TestGBKMap.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_cn.TestGBKMap.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_codecmaps_cn.TestGB18030Map.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_cn.TestGB18030Map.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_cn.TestGB2312Map.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_cn.TestGB2312Map.test_mapping_file @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_cn.TestGB2312Map.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_cn.TestGBKMap.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_cn.TestGBKMap.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_hk.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_hk.txt index 23769ffb10..57eabca95c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_hk.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_hk.txt @@ -1,3 +1,3 @@ -test.test_codecmaps_hk.TestBig5HKSCSMap.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_hk.TestBig5HKSCSMap.test_mapping_file @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_hk.TestBig5HKSCSMap.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_codecmaps_hk.TestBig5HKSCSMap.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_hk.TestBig5HKSCSMap.test_mapping_file @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_hk.TestBig5HKSCSMap.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_jp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_jp.txt index 0c1c9184b5..e6d1c41646 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_jp.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_jp.txt @@ -1,9 +1,9 @@ -test.test_codecmaps_jp.TestCP932Map.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_jp.TestEUCJISX0213Map.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_jp.TestEUCJISX0213Map.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_jp.TestEUCJPCOMPATMap.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_jp.TestEUCJPCOMPATMap.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_jp.TestSJISCOMPATMap.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_jp.TestSJISCOMPATMap.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_jp.TestSJISX0213Map.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_jp.TestSJISX0213Map.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_codecmaps_jp.TestCP932Map.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_jp.TestEUCJISX0213Map.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_jp.TestEUCJISX0213Map.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_jp.TestEUCJPCOMPATMap.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_jp.TestEUCJPCOMPATMap.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_jp.TestSJISCOMPATMap.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_jp.TestSJISCOMPATMap.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_jp.TestSJISX0213Map.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_jp.TestSJISX0213Map.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_kr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_kr.txt index 4c8aad78f8..16babf315d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_kr.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_kr.txt @@ -1,9 +1,9 @@ -test.test_codecmaps_kr.TestCP949Map.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_kr.TestCP949Map.test_mapping_file @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_kr.TestCP949Map.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_kr.TestEUCKRMap.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_kr.TestEUCKRMap.test_mapping_file @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_kr.TestEUCKRMap.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_kr.TestJOHABMap.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_kr.TestJOHABMap.test_mapping_file @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_kr.TestJOHABMap.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_codecmaps_kr.TestCP949Map.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_kr.TestCP949Map.test_mapping_file @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_kr.TestCP949Map.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_kr.TestEUCKRMap.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_kr.TestEUCKRMap.test_mapping_file @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_kr.TestEUCKRMap.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_kr.TestJOHABMap.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_kr.TestJOHABMap.test_mapping_file @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_kr.TestJOHABMap.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_tw.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_tw.txt index b7403fdea3..8c31d2e7c8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_tw.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_tw.txt @@ -1,5 +1,5 @@ -test.test_codecmaps_tw.TestBIG5Map.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_tw.TestBIG5Map.test_mapping_file @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_tw.TestBIG5Map.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_tw.TestCP950Map.test_errorhandle @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_codecmaps_tw.TestCP950Map.test_mapping_supplemental @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_codecmaps_tw.TestBIG5Map.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_tw.TestBIG5Map.test_mapping_file @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_tw.TestBIG5Map.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_tw.TestCP950Map.test_errorhandle @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_codecmaps_tw.TestCP950Map.test_mapping_supplemental @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hashlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hashlib.txt index d3492eb3a4..a0b882a21e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hashlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hashlib.txt @@ -27,13 +27,13 @@ test.test_hashlib.HashLibTestCase.test_case_sha384_1 @ darwin-arm64,linux-aarch6 test.test_hashlib.HashLibTestCase.test_case_sha384_2 @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github test.test_hashlib.HashLibTestCase.test_case_sha384_3 @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github test.test_hashlib.HashLibTestCase.test_case_sha3_224_0 @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_hashlib.HashLibTestCase.test_case_sha3_224_vector @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_hashlib.HashLibTestCase.test_case_sha3_224_vector @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_hashlib.HashLibTestCase.test_case_sha3_256_0 @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_hashlib.HashLibTestCase.test_case_sha3_256_vector @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_hashlib.HashLibTestCase.test_case_sha3_256_vector @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_hashlib.HashLibTestCase.test_case_sha3_384_0 @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_hashlib.HashLibTestCase.test_case_sha3_384_vector @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_hashlib.HashLibTestCase.test_case_sha3_384_vector @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_hashlib.HashLibTestCase.test_case_sha3_512_0 @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_hashlib.HashLibTestCase.test_case_sha3_512_vector @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_hashlib.HashLibTestCase.test_case_sha3_512_vector @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_hashlib.HashLibTestCase.test_case_sha512_0 @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github test.test_hashlib.HashLibTestCase.test_case_sha512_1 @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github test.test_hashlib.HashLibTestCase.test_case_sha512_2 @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_robotparser.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_robotparser.txt index 5ee3aa92a4..43c3d757ca 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_robotparser.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_robotparser.txt @@ -35,9 +35,9 @@ test.test_robotparser.InvalidCrawlDelayTest.test_site_maps @ darwin-arm64,linux- test.test_robotparser.InvalidRequestRateTest.test_bad_urls @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github test.test_robotparser.InvalidRequestRateTest.test_good_urls @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github test.test_robotparser.InvalidRequestRateTest.test_site_maps @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_robotparser.NetworkTestCase.test_basic @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_robotparser.NetworkTestCase.test_can_fetch @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_robotparser.NetworkTestCase.test_read_404 @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_robotparser.NetworkTestCase.test_basic @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_robotparser.NetworkTestCase.test_can_fetch @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_robotparser.NetworkTestCase.test_read_404 @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_robotparser.PasswordProtectedSiteTestCase.testPasswordProtectedSite @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github test.test_robotparser.RejectAllRobotsTest.test_bad_urls @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github test.test_robotparser.RejectAllRobotsTest.test_good_urls @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicodedata.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicodedata.txt index 2db9249d87..6022b6dca8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicodedata.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicodedata.txt @@ -1,6 +1,6 @@ test.test_unicodedata.NormalizationTest.test_bug_834676 @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github test.test_unicodedata.NormalizationTest.test_edge_cases @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_unicodedata.NormalizationTest.test_normalization @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_unicodedata.NormalizationTest.test_normalization @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_unicodedata.UnicodeFunctionsTest.test_category @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github test.test_unicodedata.UnicodeFunctionsTest.test_combining @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github test.test_unicodedata.UnicodeFunctionsTest.test_decimal @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2net.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2net.txt index 3d4934a2c6..dc88af3c74 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2net.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2net.txt @@ -1,15 +1,15 @@ -test.test_urllib2net.CloseSocketTest.test_close @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllib2net.OtherNetworkTests.test_custom_headers @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_urllib2net.CloseSocketTest.test_close @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllib2net.OtherNetworkTests.test_custom_headers @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_urllib2net.OtherNetworkTests.test_file @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github # Connecting to external page that sometimes times out !test.test_urllib2net.OtherNetworkTests.test_ftp -test.test_urllib2net.OtherNetworkTests.test_redirect_url_withfrag @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllib2net.OtherNetworkTests.test_urlwithfrag @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_urllib2net.OtherNetworkTests.test_redirect_url_withfrag @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllib2net.OtherNetworkTests.test_urlwithfrag @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_urllib2net.TimeoutTest.test_ftp_basic @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_urllib2net.TimeoutTest.test_ftp_default_timeout @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_urllib2net.TimeoutTest.test_ftp_no_timeout @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_urllib2net.TimeoutTest.test_ftp_timeout @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github -test.test_urllib2net.TimeoutTest.test_http_basic @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllib2net.TimeoutTest.test_http_default_timeout @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllib2net.TimeoutTest.test_http_no_timeout @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllib2net.TimeoutTest.test_http_timeout @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_urllib2net.TimeoutTest.test_http_basic @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllib2net.TimeoutTest.test_http_default_timeout @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllib2net.TimeoutTest.test_http_no_timeout @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllib2net.TimeoutTest.test_http_timeout @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllibnet.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllibnet.txt index a4c7f395e0..f4da4466a0 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllibnet.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllibnet.txt @@ -1,12 +1,12 @@ -test.test_urllibnet.URLTimeoutTest.testURLread @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_urllibnet.URLTimeoutTest.testURLread @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github test.test_urllibnet.urlopenNetworkTests.test_bad_address @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllibnet.urlopenNetworkTests.test_basic @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllibnet.urlopenNetworkTests.test_getcode @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllibnet.urlopenNetworkTests.test_geturl @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllibnet.urlopenNetworkTests.test_info @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllibnet.urlopenNetworkTests.test_readlines @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllibnet.urlretrieveNetworkTests.test_basic @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllibnet.urlretrieveNetworkTests.test_data_header @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllibnet.urlretrieveNetworkTests.test_header @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllibnet.urlretrieveNetworkTests.test_reporthook @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github -test.test_urllibnet.urlretrieveNetworkTests.test_specified_path @ darwin-arm64,linux-aarch64,linux-aarch64-github,linux-x86_64,linux-x86_64-github,win32-AMD64,win32-AMD64-github +test.test_urllibnet.urlopenNetworkTests.test_basic @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllibnet.urlopenNetworkTests.test_getcode @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllibnet.urlopenNetworkTests.test_geturl @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllibnet.urlopenNetworkTests.test_info @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllibnet.urlopenNetworkTests.test_readlines @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllibnet.urlretrieveNetworkTests.test_basic @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllibnet.urlretrieveNetworkTests.test_data_header @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllibnet.urlretrieveNetworkTests.test_header @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllibnet.urlretrieveNetworkTests.test_reporthook @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github +test.test_urllibnet.urlretrieveNetworkTests.test_specified_path @ linux-aarch64-github,linux-x86_64-github,win32-AMD64-github From 9befcff510b08083ba074c6e968e550823eb7253 Mon Sep 17 00:00:00 2001 From: Tim Felgentreff Date: Fri, 22 May 2026 10:05:21 +0200 Subject: [PATCH 5/7] Keep BouncyCastle artifacts in local Maven repo --- mx.graalpython/mx_graalpython.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/mx.graalpython/mx_graalpython.py b/mx.graalpython/mx_graalpython.py index 8392bc9d86..f481715018 100644 --- a/mx.graalpython/mx_graalpython.py +++ b/mx.graalpython/mx_graalpython.py @@ -1064,6 +1064,26 @@ def update_maven_opts(env): mx.log(f"Added '{mvn_repo_local}' to MAVEN_OPTS={maven_opts}") return env + +def deploy_library_to_local_maven_repo(library_name, repo_url, env): + library = mx.library(library_name) + if not hasattr(library, 'maven'): + mx.abort(f'Cannot deploy {library_name}: library does not define Maven metadata') + maven = library.maven + mx.run_maven([ + 'deploy:deploy-file', + '-DrepositoryId=local', + f'-Durl={repo_url}', + f'-DgroupId={maven["groupId"]}', + f'-DartifactId={maven["artifactId"]}', + f'-Dversion={maven["version"]}', + f'-Dfile={library.get_path(True)}', + '-Dpackaging=jar', + '-DgeneratePom=true', + '-DretryFailedDeploymentCount=10', + ], env=env) + + def deploy_local_maven_repo(env=None): env = update_maven_opts({**os.environ.copy(), **(env or {})}) run_mx_args = [ @@ -1098,6 +1118,9 @@ def deploy_local_maven_repo(env=None): mx.rmtree(path, ignore_errors=True) os.mkdir(path) run_mx(deploy_args, env={**env, **LATEST_JAVA_HOME}) + repo_url = pathlib.Path(path).as_uri() + for library_name in ('BOUNCYCASTLE-PROVIDER', 'BOUNCYCASTLE-PKIX', 'BOUNCYCASTLE-UTIL'): + deploy_library_to_local_maven_repo(library_name, repo_url, {**env, **LATEST_JAVA_HOME}) return path, version, env From 39af8cfa53935202aa24b28702bffd013a707ba4 Mon Sep 17 00:00:00 2001 From: Tim Felgentreff Date: Fri, 22 May 2026 17:49:04 +0200 Subject: [PATCH 6/7] do not inject our extra index into pip if a custom index was requested --- .../lib-graalpython/patches/pip-23.2.1.patch | 9 +++++---- .../lib-graalpython/patches/pip-24.3.1.patch | 9 +++++---- .../_bundled/pip-24.3.1-py3-none-any.whl | Bin 1859052 -> 1859120 bytes 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/graalpython/lib-graalpython/patches/pip-23.2.1.patch b/graalpython/lib-graalpython/patches/pip-23.2.1.patch index 47ecb21b15..32a8e7f1aa 100644 --- a/graalpython/lib-graalpython/patches/pip-23.2.1.patch +++ b/graalpython/lib-graalpython/patches/pip-23.2.1.patch @@ -13,17 +13,18 @@ diff --git a/pip/_internal/cli/cmdoptions.py b/pip/_internal/cli/cmdoptions.py index 02ba608..85c7c22 100644 --- a/pip/_internal/cli/cmdoptions.py +++ b/pip/_internal/cli/cmdoptions.py -@@ -357,7 +357,8 @@ def extra_index_url() -> Option: +@@ -357,7 +357,9 @@ def extra_index_url() -> Option: dest="extra_index_urls", metavar="URL", action="append", - default=[], -+ # GraalPy change: add default extra index with our prebuilt binaries -+ default=["https://www.graalvm.org/python/wheels/"], ++ # GraalPy change: add default extra index with our prebuilt binaries. If PIP_INDEX_URL is set, ++ # assume the user configured a custom index and does not want to use any default index. ++ default=[] if "PIP_INDEX_URL" in os.environ else ["https://www.graalvm.org/python/wheels/"], help="Extra URLs of package indexes to use in addition to " "--index-url. Should follow the same rules as " "--index-url.", -@@ -892,7 +893,7 @@ disable_pip_version_check: Callable[..., Option] = partial( +@@ -892,7 +894,7 @@ disable_pip_version_check: Callable[..., Option] = partial( "--disable-pip-version-check", dest="disable_pip_version_check", action="store_true", diff --git a/graalpython/lib-graalpython/patches/pip-24.3.1.patch b/graalpython/lib-graalpython/patches/pip-24.3.1.patch index 6a5afce19a..1fbe76cf08 100644 --- a/graalpython/lib-graalpython/patches/pip-24.3.1.patch +++ b/graalpython/lib-graalpython/patches/pip-24.3.1.patch @@ -13,17 +13,18 @@ diff --git a/pip/_internal/cli/cmdoptions.py b/pip/_internal/cli/cmdoptions.py index 0b7cff7..07c86bf 100644 --- a/pip/_internal/cli/cmdoptions.py +++ b/pip/_internal/cli/cmdoptions.py -@@ -357,7 +357,8 @@ def extra_index_url() -> Option: +@@ -357,7 +357,9 @@ def extra_index_url() -> Option: dest="extra_index_urls", metavar="URL", action="append", - default=[], -+ # GraalPy change: add default extra index with our prebuilt binaries -+ default=["https://www.graalvm.org/python/wheels/"], ++ # GraalPy change: add default extra index with our prebuilt binaries. If PIP_INDEX_URL is set, ++ # assume the user configured a custom index and does not want to use any default index. ++ default=[] if "PIP_INDEX_URL" in os.environ else ["https://www.graalvm.org/python/wheels/"], help="Extra URLs of package indexes to use in addition to " "--index-url. Should follow the same rules as " "--index-url.", -@@ -892,7 +893,7 @@ disable_pip_version_check: Callable[..., Option] = partial( +@@ -892,7 +894,7 @@ disable_pip_version_check: Callable[..., Option] = partial( "--disable-pip-version-check", dest="disable_pip_version_check", action="store_true", diff --git a/graalpython/lib-python/3/ensurepip/_bundled/pip-24.3.1-py3-none-any.whl b/graalpython/lib-python/3/ensurepip/_bundled/pip-24.3.1-py3-none-any.whl index b8e955a9b899e89a02381f8478838c59eb0726bd..6e3c73e96528e4e32fa9a6efb82b1859cc74212c 100644 GIT binary patch delta 37032 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

<6rbjNLr?<)mI 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 V0MnvHb<66O&OwliMgWdoD From 2b262ec302228ed4a89cc78c5a313b87e3a767f4 Mon Sep 17 00:00:00 2001 From: Tim Felgentreff Date: Fri, 22 May 2026 21:37:22 +0200 Subject: [PATCH 7/7] Export any CI custom index if present --- ci/python-bench.libsonnet | 25 +++++++++++++++++++------ ci/python-gate.libsonnet | 25 +++++++++++++++++++------ 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/ci/python-bench.libsonnet b/ci/python-bench.libsonnet index 1fcc375d91..5c1352a229 100644 --- a/ci/python-bench.libsonnet +++ b/ci/python-bench.libsonnet @@ -95,12 +95,25 @@ PIP_EXTRA_INDEX_URL: $.overlay_imports.PIP_EXTRA_INDEX_URL, } else {}, - local pip_index_setup = [ - // Use the CI Python's configured base index and overlay-provided GraalPy wheel index. - ["set-export", "PIP_INDEX_URL", ["python", "-m", "pip", "config", "get", "global.index-url"]], - ] + if $.overlay_imports.PIP_EXTRA_INDEX_URL != "" then [ - ["set-export", "PIP_EXTRA_INDEX_URL", $.overlay_imports.PIP_EXTRA_INDEX_URL], - ] else [], + local pip_index_from_config_or_env = [ + "python", + "-c", + "import os, subprocess, sys; " + + "cmd = [sys.executable, '-m', 'pip', 'config', 'get', 'global.index-url']; " + + "p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True); " + + "print(p.stdout.strip() if p.returncode == 0 else os.environ.get('PIP_INDEX_URL') or " + + "os.environ.get('PIP_EXTRA_INDEX_URL', ''))", + ], + + local pip_index_setup = + if $.overlay_imports.PIP_EXTRA_INDEX_URL != "" then [ + // Use the CI Python's configured base index if present. pip config get does not report env + // vars, so preserve Buildbot's PIP_INDEX_URL before falling back to the overlay repository URL. + ["set-export", "PIP_EXTRA_INDEX_URL", $.overlay_imports.PIP_EXTRA_INDEX_URL], + ["set-export", "PIP_INDEX_URL", pip_index_from_config_or_env], + ] else [ + ["set-export", "PIP_INDEX_URL", pip_index_from_config_or_env], + ], local packages(os, arch) = self.packages(os, arch) + { make: "==4.3", diff --git a/ci/python-gate.libsonnet b/ci/python-gate.libsonnet index f7d0a22117..638565a8fd 100644 --- a/ci/python-gate.libsonnet +++ b/ci/python-gate.libsonnet @@ -194,12 +194,25 @@ buildslave_ol8: ENVIRONMENT_DIFF_OL8, }, - local pip_index_setup = [ - // Use the CI Python's configured base index and overlay-provided GraalPy wheel index. - ["set-export", "PIP_INDEX_URL", ["python", "-m", "pip", "config", "get", "global.index-url"]], - ] + if $.overlay_imports.PIP_EXTRA_INDEX_URL != "" then [ - ["set-export", "PIP_EXTRA_INDEX_URL", $.overlay_imports.PIP_EXTRA_INDEX_URL], - ] else [], + local pip_index_from_config_or_env = [ + "python", + "-c", + "import os, subprocess, sys; " + + "cmd = [sys.executable, '-m', 'pip', 'config', 'get', 'global.index-url']; " + + "p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True); " + + "print(p.stdout.strip() if p.returncode == 0 else os.environ.get('PIP_INDEX_URL') or " + + "os.environ.get('PIP_EXTRA_INDEX_URL', ''))", + ], + + local pip_index_setup = + if $.overlay_imports.PIP_EXTRA_INDEX_URL != "" then [ + // Use the CI Python's configured base index if present. pip config get does not report env + // vars, so preserve Buildbot's PIP_INDEX_URL before falling back to the overlay repository URL. + ["set-export", "PIP_EXTRA_INDEX_URL", $.overlay_imports.PIP_EXTRA_INDEX_URL], + ["set-export", "PIP_INDEX_URL", pip_index_from_config_or_env], + ] else [ + ["set-export", "PIP_INDEX_URL", pip_index_from_config_or_env], + ], //------------------------------------------------------------------------------------------------------------------ // packages