CI: adjust CPython PR generation logic (#3392)

* For files retrieved through the GNU mirror load balancer, specify the load balancer URL
* Explicitly `git mv` files on prerelease upgrade in case Git doesn't detect it
* Add a trailing newline to a thunk
This commit is contained in:
native-api 2026-01-14 07:03:58 +03:00 committed by GitHub
parent 92c9ab5273
commit 94faa168cb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 55 additions and 20 deletions

View File

@ -34,7 +34,7 @@ jobs:
versions=[l.rstrip() for l in open("added_versions.lst")] versions=[l.rstrip() for l in open("added_versions.lst")]
with open(os.environ['GITHUB_ENV'],'a') as f: with open(os.environ['GITHUB_ENV'],'a') as f:
f.write(f'branch_name=auto_add_version/{"_".join(versions)}\n') f.write(f'branch_name=auto_add_version/{"_".join(versions)}\n')
f.write(f'pr_name=Add {", ".join(versions)}\n') f.write(f'pr_name=Add CPython {", ".join(versions)}\n')
os.remove("added_versions.lst") os.remove("added_versions.lst")
- name: Create Pull Request - name: Create Pull Request

View File

@ -13,9 +13,11 @@ import io
import itertools import itertools
import logging import logging
import operator import operator
import os.path
import pathlib import pathlib
import pprint import pprint
import re import re
import subprocess
import sys import sys
import typing import typing
import urllib.parse import urllib.parse
@ -40,7 +42,8 @@ OUT_DIR: pathlib.Path = here.parent.parent / "share" / "python-build"
T_THUNK=\ T_THUNK=\
'''export PYTHON_BUILD_FREE_THREADING=1 '''export PYTHON_BUILD_FREE_THREADING=1
source "${BASH_SOURCE[0]%t}"''' source "${BASH_SOURCE[0]%t}"
'''
def adapt_script(version: packaging.version.Version, def adapt_script(version: packaging.version.Version,
@ -120,7 +123,7 @@ def add_version(version: packaging.version.Version):
return False return False
VersionDirectory.existing.append(_CPythonExistingScriptInfo(version,str(new_path))) VersionDirectory.existing.append(_CPythonExistingScriptInfo(version,str(new_path)))
cleanup_prerelease_upgrade(is_prerelease_upgrade, previous_version) cleanup_prerelease_upgrade(is_prerelease_upgrade, previous_version, version)
handle_t_thunks(version, previous_version, is_prerelease_upgrade) handle_t_thunks(version, previous_version, is_prerelease_upgrade)
@ -130,27 +133,56 @@ def add_version(version: packaging.version.Version):
def cleanup_prerelease_upgrade( def cleanup_prerelease_upgrade(
is_prerelease_upgrade: bool, is_prerelease_upgrade: bool,
previous_version: packaging.version.Version)\ previous_version: packaging.version.Version,
new_version: packaging.version.Version)\
-> None: -> None:
if is_prerelease_upgrade: if not is_prerelease_upgrade:
previous_version_path = OUT_DIR / str(previous_version) return
logger.info(f'Deleting {previous_version_path}')
previous_version_path.unlink() previous_version_filename = str(previous_version)
new_version_filename = str(new_version)
new_version_path = OUT_DIR / new_version_filename
logger.info(f'Git moving {previous_version_filename} '
f'to {new_version_filename} (preserving new data)')
data = new_version_path.read_text()
new_version_path.unlink()
subprocess.check_call(("git","-C",OUT_DIR,
"mv",
previous_version_filename,
new_version_filename))
new_version_path.write_text(data)
del VersionDirectory.existing[previous_version] del VersionDirectory.existing[previous_version]
def handle_t_thunks(version, previous_version, is_prerelease_upgrade): def handle_t_thunks(version, previous_version, is_prerelease_upgrade):
if (version.major, version.minor) >= (3, 13): if (version.major, version.minor) < (3, 13):
return
# an old thunk may have older version-specific code # an old thunk may have older version-specific code
# so it's safer to write a known version-independent template # so it's safer to write a known version-independent template
thunk_path = OUT_DIR.joinpath(str(version) + "t") thunk_name = (str(version) + "t")
logger.info(f"Writing {thunk_path}") thunk_path = OUT_DIR / thunk_name
thunk_path.write_text(T_THUNK, encoding='utf-8') previous_thunk_name = str(previous_version) + "t"
previous_thunk_path = OUT_DIR / previous_thunk_name
if is_prerelease_upgrade: if is_prerelease_upgrade:
previous_thunk_path = OUT_DIR.joinpath(str(previous_version) + "t") logger.info(f"Git moving {previous_thunk_name} to {thunk_name}")
subprocess.check_call(("git","-C",OUT_DIR,
"mv",
previous_thunk_name,
thunk_name))
else:
logger.info(f"Deleting {previous_thunk_path}") logger.info(f"Deleting {previous_thunk_path}")
previous_thunk_path.unlink() previous_thunk_path.unlink()
logger.info(f"Writing {thunk_path}")
thunk_path.write_text(T_THUNK, encoding='utf-8')
Arguments: argparse.Namespace Arguments: argparse.Namespace
def main(): def main():
@ -468,10 +500,13 @@ class ReadlineVersionsDirectory(KeyedList[_ReadlineVersionInfo, packaging.versio
max_item = candidates._latest_release() max_item = candidates._latest_release()
hash_ = Url.sha256_url(max_item.url, VersionDirectory.session) hash_ = Url.sha256_url(max_item.url, VersionDirectory.session)
permalink = 'https://ftpmirror.gnu.org/readline/' +\
os.path.basename(urllib.parse.urlparse(max_item.url).path)
result = _ReadlineVersionInfo( result = _ReadlineVersionInfo(
max_item.version, max_item.version,
max_item.package_name, max_item.package_name,
max_item.url, permalink,
hash_) hash_)
self.append(result) self.append(result)