From a92fea4aa1e0b688a547bbb923b481fe13d39dc4 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 4 Jul 2025 13:35:21 +0900 Subject: [PATCH 1/2] refactor(toolchains): better sha256 printing helper Before this PR the toolchain sha256 values would be printed in a way that would require further text manipulation. Now we print the values that need to be just copy pasted. --- python/private/BUILD.bazel | 2 +- python/private/print_toolchain_checksums.bzl | 87 ++++++++++++++++++++ python/versions.bzl | 51 ------------ 3 files changed, 88 insertions(+), 52 deletions(-) create mode 100644 python/private/print_toolchain_checksums.bzl diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 8bcc6eaebe..6fc78efc25 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -16,7 +16,7 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("@bazel_skylib//rules:common_settings.bzl", "bool_setting") load("//python:py_binary.bzl", "py_binary") load("//python:py_library.bzl", "py_library") -load("//python:versions.bzl", "print_toolchains_checksums") +load(":print_toolchain_checksums.bzl", "print_toolchains_checksums") load(":py_exec_tools_toolchain.bzl", "current_interpreter_executable") load(":sentinel.bzl", "sentinel") load(":stamp.bzl", "stamp_build_setting") diff --git a/python/private/print_toolchain_checksums.bzl b/python/private/print_toolchain_checksums.bzl new file mode 100644 index 0000000000..7fa56e05de --- /dev/null +++ b/python/private/print_toolchain_checksums.bzl @@ -0,0 +1,87 @@ +"""Print the toolchain versions. +""" + +load("//python:versions.bzl", "TOOL_VERSIONS", "get_release_info") +load("//python/private:text_util.bzl", "render") + +def print_toolchains_checksums(name): + """A macro to print checksums for a particular Python interpreter version. + + Args: + name: {type}`str`: the name of the runnable target. + """ + all_commands = [] + by_version = {} + + for python_version, metadata in TOOL_VERSIONS.items(): + by_version[python_version] = _commands_for_version( + python_version = python_version, + metadata = metadata, + ) + all_commands.append(by_version[python_version]) + + template = """\ +cat > "$@" <<'EOF' +#!/bin/bash + +set -o errexit -o nounset -o pipefail + +echo "Fetching hashes..." + +{commands} +EOF + """ + + native.genrule( + name = name, + srcs = [], + outs = ["print_toolchains_checksums.sh"], + cmd = select({ + "//python/config_settings:is_python_{}".format(version): template.format( + commands = commands, + ) + for version, commands in by_version.items() + } | { + "//conditions:default": template.format(commands = "\n".join(all_commands)), + }), + executable = True, + ) + +def _commands_for_version(*, python_version, metadata): + lines = [] + lines += [ + "cat < "$@" <<'EOF' -#!/bin/bash - -set -o errexit -o nounset -o pipefail - -echo "Fetching hashes..." - -{commands} -EOF - """ - - native.genrule( - name = name, - srcs = [], - outs = ["print_toolchains_checksums.sh"], - cmd = select({ - "//python/config_settings:is_python_{}".format(version): template.format( - commands = commands, - ) - for version, commands in by_version.items() - } | { - "//conditions:default": template.format(commands = "\n".join(all_commands)), - }), - executable = True, - ) - -def _commands_for_version(python_version): - return "\n".join([ - "echo \"{python_version}: {platform}: $$(curl --location --fail {release_url_sha256} 2>/dev/null || curl --location --fail {release_url} 2>/dev/null | shasum -a 256 | awk '{{ print $$1 }}')\"".format( - python_version = python_version, - platform = platform, - release_url = release_url, - release_url_sha256 = release_url + ".sha256", - ) - for platform in TOOL_VERSIONS[python_version]["sha256"].keys() - for release_url in get_release_info(platform, python_version)[1] - ]) - def gen_python_config_settings(name = ""): for platform in PLATFORMS.keys(): native.config_setting( From ece4b77f20283eaf801f40de0f992ea6d0bcccf0 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 4 Jul 2025 14:03:20 +0900 Subject: [PATCH 2/2] simplify and test --- python/private/print_toolchain_checksums.bzl | 15 ++++++++++----- python/versions.bzl | 3 +++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/python/private/print_toolchain_checksums.bzl b/python/private/print_toolchain_checksums.bzl index 7fa56e05de..eaaa5b9d75 100644 --- a/python/private/print_toolchain_checksums.bzl +++ b/python/private/print_toolchain_checksums.bzl @@ -3,6 +3,7 @@ load("//python:versions.bzl", "TOOL_VERSIONS", "get_release_info") load("//python/private:text_util.bzl", "render") +load("//python/private:version.bzl", "version") def print_toolchains_checksums(name): """A macro to print checksums for a particular Python interpreter version. @@ -10,7 +11,6 @@ def print_toolchains_checksums(name): Args: name: {type}`str`: the name of the runnable target. """ - all_commands = [] by_version = {} for python_version, metadata in TOOL_VERSIONS.items(): @@ -18,7 +18,12 @@ def print_toolchains_checksums(name): python_version = python_version, metadata = metadata, ) - all_commands.append(by_version[python_version]) + + all_commands = sorted( + by_version.items(), + key = lambda x: version.key(version.parse(x[0], strict = True)), + ) + all_commands = [x[1] for x in all_commands] template = """\ cat > "$@" <<'EOF' @@ -37,10 +42,10 @@ EOF srcs = [], outs = ["print_toolchains_checksums.sh"], cmd = select({ - "//python/config_settings:is_python_{}".format(version): template.format( + "//python/config_settings:is_python_{}".format(version_str): template.format( commands = commands, ) - for version, commands in by_version.items() + for version_str, commands in by_version.items() } | { "//conditions:default": template.format(commands = "\n".join(all_commands)), }), @@ -64,7 +69,7 @@ def _commands_for_version(*, python_version, metadata): "cat <