Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
gh-91172: Create a workflow for verifying bundled pip and setuptools#31885
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Changes fromall commits
e4a8fafa57cd3adcba62408a10436edd10f6f0d809809e4dbe46f87d594644ba35673bc82810c52103747d44bbf633881d40ff278685c388a2e7cd4d6a355da27b7bc5acf9217122121e1b276a649260266257190226c2926cba980d3dfaffe4c423678696001d33867e283c3a74629c66a91acFile filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,28 @@ | ||
| name: Verify bundled pip and setuptools | ||
| on: | ||
| workflow_dispatch: | ||
| push: | ||
| paths: | ||
| - 'Lib/ensurepip/_bundled/**' | ||
| - '.github/workflows/verify-ensurepip-wheels.yml' | ||
| - 'Tools/scripts/verify_ensurepip_wheels.py' | ||
| pull_request: | ||
| paths: | ||
| - 'Lib/ensurepip/_bundled/**' | ||
| - '.github/workflows/verify-ensurepip-wheels.yml' | ||
| - 'Tools/scripts/verify_ensurepip_wheels.py' | ||
| permissions: | ||
| contents: read | ||
| jobs: | ||
| verify: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v3 | ||
| - uses: actions/setup-python@v4 | ||
| with: | ||
| python-version: '3' | ||
| - name: Compare checksums of bundled pip and setuptools to ones published on PyPI | ||
| run: ./Tools/scripts/verify_ensurepip_wheels.py |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| Create a GitHub Actions workflow for verifying bundled pip and setuptools. | ||
| Patch by Illia Volochii and Adam Turner. | ||
illia-v marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,98 @@ | ||||||
| #! /usr/bin/env python3 | ||||||
| """ | ||||||
| Compare checksums for wheels in :mod:`ensurepip` against the Cheeseshop. | ||||||
| When GitHub Actions executes the script, output is formatted accordingly. | ||||||
| https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-a-notice-message | ||||||
| """ | ||||||
| import hashlib | ||||||
| import json | ||||||
| import os | ||||||
| import re | ||||||
| from pathlib import Path | ||||||
| from urllib.request import urlopen | ||||||
| PACKAGE_NAMES = ("pip", "setuptools") | ||||||
| ENSURE_PIP_ROOT = Path(__file__).parent.parent.parent / "Lib/ensurepip" | ||||||
| WHEEL_DIR = ENSURE_PIP_ROOT / "_bundled" | ||||||
| ENSURE_PIP_INIT_PY_TEXT = (ENSURE_PIP_ROOT / "__init__.py").read_text(encoding="utf-8") | ||||||
| GITHUB_ACTIONS = os.getenv("GITHUB_ACTIONS") == "true" | ||||||
Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. A simpler check: Suggested change
| ||||||
| def print_notice(file_path: str, message: str) -> None: | ||||||
| if GITHUB_ACTIONS: | ||||||
| message = f"::notice file={file_path}::{message}" | ||||||
| print(message, end="\n\n") | ||||||
| def print_error(file_path: str, message: str) -> None: | ||||||
| if GITHUB_ACTIONS: | ||||||
| message = f"::error file={file_path}::{message}" | ||||||
| print(message, end="\n\n") | ||||||
| def verify_wheel(package_name: str) -> bool: | ||||||
| # Find the package on disk | ||||||
| package_path = next(WHEEL_DIR.glob(f"{package_name}*.whl"), None) | ||||||
| if not package_path: | ||||||
| print_error("", f"Could not find a {package_name} wheel on disk.") | ||||||
| return False | ||||||
| print(f"Verifying checksum for {package_path}.") | ||||||
illia-v marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||||||
| # Find the version of the package used by ensurepip | ||||||
| package_version_match = re.search( | ||||||
| f'_{package_name.upper()}_VERSION = "([^"]+)', ENSURE_PIP_INIT_PY_TEXT | ||||||
| ) | ||||||
| if not package_version_match: | ||||||
| print_error( | ||||||
| package_path, | ||||||
| f"No {package_name} version found in Lib/ensurepip/__init__.py.", | ||||||
| ) | ||||||
| return False | ||||||
| package_version = package_version_match[1] | ||||||
| # Get the SHA 256 digest from the Cheeseshop | ||||||
| try: | ||||||
| raw_text = urlopen(f"https://pypi.org/pypi/{package_name}/json").read() | ||||||
| except (OSError, ValueError): | ||||||
| print_error(package_path, f"Could not fetch JSON metadata for {package_name}.") | ||||||
| return False | ||||||
| release_files = json.loads(raw_text)["releases"][package_version] | ||||||
| for release_info in release_files: | ||||||
| if package_path.name != release_info["filename"]: | ||||||
| continue | ||||||
| expected_digest = release_info["digests"].get("sha256", "") | ||||||
| break | ||||||
| else: | ||||||
| print_error(package_path, f"No digest for {package_name} found from PyPI.") | ||||||
| return False | ||||||
| # Compute the SHA 256 digest of the wheel on disk | ||||||
| actual_digest = hashlib.sha256(package_path.read_bytes()).hexdigest() | ||||||
| print(f"Expected digest: {expected_digest}") | ||||||
| print(f"Actual digest: {actual_digest}") | ||||||
illia-v marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||||||
| if actual_digest != expected_digest: | ||||||
| print_error( | ||||||
| package_path, f"Failed to verify the checksum of the {package_name} wheel." | ||||||
| ) | ||||||
| return False | ||||||
| print_notice( | ||||||
| package_path, | ||||||
| f"Successfully verified the checksum of the {package_name} wheel.", | ||||||
| ) | ||||||
| return True | ||||||
| if __name__ == "__main__": | ||||||
| exit_status = 0 | ||||||
| for package_name in PACKAGE_NAMES: | ||||||
| if not verify_wheel(package_name): | ||||||
| exit_status = 1 | ||||||
| raise SystemExit(exit_status) | ||||||