From 46b1faec314167d6ae8821e6a1ba21e14047463c Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sat, 20 Dec 2025 16:12:17 -0700 Subject: [PATCH 1/4] Ensure default versions are always correct relenv create, build, and fetch should all have proper default versions. This change ensures the defaults are updated dynamically as our python versions are updated. --- relenv/build/__init__.py | 44 +++++++++--------- relenv/common.py | 2 - relenv/create.py | 44 ++++++++---------- relenv/fetch.py | 10 +++-- relenv/pyversions.py | 48 ++++++++++++++++++++ tests/test_pyversions_runtime.py | 77 ++++++++++++++++++++++++++++++++ 6 files changed, 169 insertions(+), 56 deletions(-) diff --git a/relenv/build/__init__.py b/relenv/build/__init__.py index 14613727..a5d91c0a 100644 --- a/relenv/build/__init__.py +++ b/relenv/build/__init__.py @@ -15,8 +15,13 @@ from . import darwin, linux, windows from .common import builds -from ..common import DEFAULT_PYTHON, build_arch -from ..pyversions import Version, python_versions +from ..common import build_arch +from ..pyversions import ( + Version, + get_default_python_version, + python_versions, + resolve_python_version, +) def platform_module() -> ModuleType: @@ -62,11 +67,12 @@ def setup_parser( "logs, src, build, and previous tarball." ), ) + default_version = get_default_python_version() build_subparser.add_argument( "--python", - default=DEFAULT_PYTHON, + default=default_version, type=str, - help="The python version [default: %(default)s]", + help="The python version (e.g., 3.10, 3.13.7) [default: %(default)s]", ) build_subparser.add_argument( "--no-cleanup", @@ -146,27 +152,17 @@ def main(args: argparse.Namespace) -> None: print(f"Unsupported platform: {sys.platform}") sys.exit(1) - requested = Version(args.python) - - if requested.micro: + try: + build_version_str = resolve_python_version(args.python) + except RuntimeError as e: + print(f"Error: {e}") pyversions = python_versions() - if requested not in pyversions: - print(f"Unknown version {requested}") - strversions = "\n".join([str(_) for _ in pyversions]) - print(f"Known versions are:\n{strversions}") - sys.exit(1) - build_version = requested - else: - pyversions = python_versions(args.python) - build_version = sorted(list(pyversions.keys()))[-1] - - # print(pyversions) - # print(pyversions[0].major) - # print(pyversions[0].minor) - # print(pyversions[0].micro) - # print(pyversions[0].pre) - # print(pyversions[0].post) - # print(pyversions) + strversions = "\n".join([str(_) for _ in pyversions]) + print(f"Known versions are:\n{strversions}") + sys.exit(1) + + build_version = Version(build_version_str) + pyversions = python_versions() print(f"Build Python {build_version}") # XXX diff --git a/relenv/common.py b/relenv/common.py index 70f88f38..f73817ae 100644 --- a/relenv/common.py +++ b/relenv/common.py @@ -40,8 +40,6 @@ MODULE_DIR = pathlib.Path(__file__).resolve().parent -DEFAULT_PYTHON = "3.10.18" - LINUX = "linux" WIN32 = "win32" DARWIN = "darwin" diff --git a/relenv/create.py b/relenv/create.py index d8b5c3e6..e9145f3c 100644 --- a/relenv/create.py +++ b/relenv/create.py @@ -23,7 +23,11 @@ format_shebang, relative_interpreter, ) -from .pyversions import Version, python_versions +from .pyversions import ( + get_default_python_version, + python_versions, + resolve_python_version, +) @contextlib.contextmanager @@ -73,11 +77,12 @@ def setup_parser( type=str, help="The host architecture [default: %(default)s]", ) + default_version = get_default_python_version() subparser.add_argument( "--python", - default="3.10.17", + default=default_version, type=str, - help="The python version [default: %(default)s]", + help="The python version (e.g., 3.10, 3.13.7) [default: %(default)s]", ) @@ -106,8 +111,9 @@ def create( else: writeto = pathlib.Path(name).resolve() + # Version should be provided by main(), but handle None just in case if version is None: - version = "3.10.17" + version = get_default_python_version() if pathlib.Path(writeto).exists(): raise CreateException("The requested path already exists.") @@ -253,31 +259,17 @@ def main(args: argparse.Namespace) -> None: "Warning: Cross compilation support is experimental and is not fully tested or working!" ) - # Resolve version (support minor version like "3.12" or full version like "3.12.7") - requested = Version(args.python) - - if requested.micro: - # Full version specified (e.g., "3.12.7") + try: + create_version = resolve_python_version(args.python) + except RuntimeError as e: + print(f"Error: {e}") pyversions = python_versions() - if requested not in pyversions: - print(f"Unknown version {requested}") - strversions = "\n".join([str(_) for _ in pyversions]) - print(f"Known versions are:\n{strversions}") - sys.exit(1) - create_version = requested - else: - # Minor version specified (e.g., "3.12"), resolve to latest - pyversions = python_versions(args.python) - if not pyversions: - print(f"Unknown minor version {requested}") - all_versions = python_versions() - strversions = "\n".join([str(_) for _ in all_versions]) - print(f"Known versions are:\n{strversions}") - sys.exit(1) - create_version = sorted(list(pyversions.keys()))[-1] + strversions = "\n".join([str(_) for _ in pyversions]) + print(f"Known versions are:\n{strversions}") + sys.exit(1) try: - create(name, arch=args.arch, version=str(create_version)) + create(name, arch=args.arch, version=create_version) except CreateException as exc: print(exc) sys.exit(1) diff --git a/relenv/fetch.py b/relenv/fetch.py index 59ae25a0..b814c48e 100644 --- a/relenv/fetch.py +++ b/relenv/fetch.py @@ -16,7 +16,6 @@ from .common import ( CHECK_HOSTS, DATA_DIR, - DEFAULT_PYTHON, __version__, build_arch, check_url, @@ -24,6 +23,7 @@ get_triplet, work_dir, ) +from .pyversions import get_default_python_version, resolve_python_version def setup_parser( @@ -45,11 +45,12 @@ def setup_parser( type=str, help="Architecture to download. [default: %(default)s]", ) + default_version = get_default_python_version() subparser.add_argument( "--python", - default=DEFAULT_PYTHON, + default=default_version, type=str, - help="The python version [default: %(default)s]", + help="The python version (e.g., 3.10, 3.13.7) [default: %(default)s]", ) @@ -87,7 +88,8 @@ def main(args: argparse.Namespace) -> None: """ version = os.environ.get("RELENV_FETCH_VERSION", __version__) triplet = get_triplet(machine=args.arch) - python = args.python + # args.python will be the default version or user-specified version + python = resolve_python_version(args.python) check_hosts = CHECK_HOSTS if os.environ.get("RELENV_FETCH_HOST", ""): check_hosts = [os.environ["RELENV_FETCH_HOST"]] diff --git a/relenv/pyversions.py b/relenv/pyversions.py index e191afcc..f501631c 100644 --- a/relenv/pyversions.py +++ b/relenv/pyversions.py @@ -947,6 +947,54 @@ def python_versions( return {version: pyversions[str(version)] for version in versions} +def get_default_python_version() -> str: + """ + Get the default Python version to use when none is specified. + + :return: The default Python version string (e.g., "3.10.19") + """ + # Default to latest 3.10 version + pyversions = python_versions("3.10") + if not pyversions: + raise RuntimeError("No 3.10 versions found") + latest = sorted(list(pyversions.keys()))[-1] + return str(latest) + + +def resolve_python_version(version_spec: str | None = None) -> str: + """ + Resolve a Python version specification to a full version string. + + If version_spec is None, returns the latest Python 3.10 version. + If version_spec is partial (e.g., "3.10"), returns the latest micro version. + If version_spec is full (e.g., "3.10.19"), returns it as-is after validation. + + :param version_spec: Version specification (None, "3.10", or "3.10.19") + :return: Full version string (e.g., "3.10.19") + :raises RuntimeError: If the version is not found + """ + if version_spec is None: + # Default to latest 3.10 version + return get_default_python_version() + + requested = Version(version_spec) + + if requested.micro is not None: + # Full version specified - validate it exists + pyversions = python_versions() + if requested not in pyversions: + raise RuntimeError(f"Unknown version {requested}") + return str(requested) + else: + # Partial version (major.minor) - get latest micro + pyversions = python_versions(version_spec) + if not pyversions: + raise RuntimeError(f"Unknown minor version {requested}") + # Return the latest version for this major.minor + latest = sorted(list(pyversions.keys()))[-1] + return str(latest) + + def setup_parser( subparsers: argparse._SubParsersAction[argparse.ArgumentParser], ) -> None: diff --git a/tests/test_pyversions_runtime.py b/tests/test_pyversions_runtime.py index 1158ce28..0daf8907 100644 --- a/tests/test_pyversions_runtime.py +++ b/tests/test_pyversions_runtime.py @@ -175,3 +175,80 @@ def fake_fetch(url: str) -> str: assert "5.6.3" in versions # Verify sorting (latest first) assert versions[0] == "5.8.1" + + +def test_resolve_python_version_none_defaults_to_latest_310() -> None: + """Test that None resolves to the latest 3.10 version.""" + result = pyversions.resolve_python_version(None) + assert result.startswith("3.10.") + # Verify it's a valid version in the registry + versions = pyversions.python_versions("3.10") + assert pyversions.Version(result) in versions + # Verify it's the latest 3.10 version + latest = sorted(list(versions.keys()))[-1] + assert result == str(latest) + + +def test_resolve_python_version_partial_minor() -> None: + """Test that partial versions (3.10) resolve to latest micro.""" + result = pyversions.resolve_python_version("3.10") + assert result.startswith("3.10.") + # Verify it resolves to the latest micro version + versions = pyversions.python_versions("3.10") + latest = sorted(list(versions.keys()))[-1] + assert result == str(latest) + + +def test_resolve_python_version_different_minors() -> None: + """Test resolution works for different minor versions.""" + result_311 = pyversions.resolve_python_version("3.11") + assert result_311.startswith("3.11.") + + result_313 = pyversions.resolve_python_version("3.13") + assert result_313.startswith("3.13.") + + # Verify they're different + assert result_311 != result_313 + + # Verify each is the latest for its minor version + versions_311 = pyversions.python_versions("3.11") + latest_311 = sorted(list(versions_311.keys()))[-1] + assert result_311 == str(latest_311) + + versions_313 = pyversions.python_versions("3.13") + latest_313 = sorted(list(versions_313.keys()))[-1] + assert result_313 == str(latest_313) + + +def test_resolve_python_version_full_version() -> None: + """Test that full versions are validated and returned as-is.""" + # Get any valid version from the registry + all_versions = pyversions.python_versions() + some_version = str(next(iter(all_versions))) + + result = pyversions.resolve_python_version(some_version) + assert result == some_version + + +def test_resolve_python_version_invalid_full_version() -> None: + """Test that invalid full versions raise RuntimeError.""" + with pytest.raises(RuntimeError, match="Unknown version"): + pyversions.resolve_python_version("3.10.999") + + +def test_resolve_python_version_invalid_minor_version() -> None: + """Test that invalid minor versions raise RuntimeError.""" + with pytest.raises(RuntimeError, match="Unknown minor version"): + pyversions.resolve_python_version("3.99") + + +def test_resolve_python_version_consistency() -> None: + """Test that resolve_python_version is idempotent for full versions.""" + # Get a valid full version from the registry + all_versions = pyversions.python_versions() + some_version = str(next(iter(all_versions))) + + # Resolving a full version twice should give the same result + first = pyversions.resolve_python_version(some_version) + second = pyversions.resolve_python_version(first) + assert first == second From 3c338aae6bf31d53d8501dd6c5774136043163c3 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Tue, 6 Jan 2026 15:38:39 -0700 Subject: [PATCH 2/4] Fix copyright headers --- .pre-commit-hooks/check_changelog_entries.py | 2 +- .pre-commit-hooks/copyright_headers.py | 2 +- docs/source/conf.py | 2 +- noxfile.py | 2 +- relenv/__init__.py | 2 +- relenv/__main__.py | 2 +- relenv/build/__init__.py | 2 +- relenv/build/common/__init__.py | 2 +- relenv/build/common/_sysconfigdata_template.py | 2 +- relenv/build/common/builder.py | 2 +- relenv/build/common/builders.py | 2 +- relenv/build/common/download.py | 2 +- relenv/build/common/install.py | 2 +- relenv/build/common/ui.py | 2 +- relenv/build/darwin.py | 2 +- relenv/build/linux.py | 2 +- relenv/build/windows.py | 2 +- relenv/buildenv.py | 2 +- relenv/check.py | 2 +- relenv/common.py | 2 +- relenv/create.py | 2 +- relenv/fetch.py | 2 +- relenv/manifest.py | 2 +- relenv/pyversions.py | 2 +- relenv/relocate.py | 2 +- relenv/runtime.py | 2 +- relenv/toolchain.py | 2 +- tests/__init__.py | 2 +- tests/_pytest_typing.py | 2 +- tests/conftest.py | 2 +- tests/test_build.py | 2 +- tests/test_common.py | 2 +- tests/test_create.py | 2 +- tests/test_downloads.py | 2 +- tests/test_fips_photon.py | 2 +- tests/test_module_imports.py | 2 +- tests/test_pyversions_runtime.py | 2 +- tests/test_relocate.py | 2 +- tests/test_relocate_module.py | 2 +- tests/test_runtime.py | 2 +- tests/test_verify_build.py | 2 +- 41 files changed, 41 insertions(+), 41 deletions(-) diff --git a/.pre-commit-hooks/check_changelog_entries.py b/.pre-commit-hooks/check_changelog_entries.py index 5cf19d37..ce77d0e2 100644 --- a/.pre-commit-hooks/check_changelog_entries.py +++ b/.pre-commit-hooks/check_changelog_entries.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# Copyright 2021-2025 Broadcom. +# Copyright 2021-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # # pylint: skip-file diff --git a/.pre-commit-hooks/copyright_headers.py b/.pre-commit-hooks/copyright_headers.py index b0801236..58513795 100644 --- a/.pre-commit-hooks/copyright_headers.py +++ b/.pre-commit-hooks/copyright_headers.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# Copyright 2025 Broadcom. +# Copyright 2025-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # # pylint: disable=invalid-name,missing-module-docstring,missing-function-docstring diff --git a/docs/source/conf.py b/docs/source/conf.py index f622bbce..c36ec211 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2 # Configuration file for the Sphinx documentation builder. diff --git a/noxfile.py b/noxfile.py index 587d5b0b..8a57df93 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2 """ Nox session definitions. diff --git a/relenv/__init__.py b/relenv/__init__.py index 54ee8af6..7198dd9e 100644 --- a/relenv/__init__.py +++ b/relenv/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 from __future__ import annotations diff --git a/relenv/__main__.py b/relenv/__main__.py index 4869370f..ef72d5e7 100644 --- a/relenv/__main__.py +++ b/relenv/__main__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ The entrypoint into relenv. diff --git a/relenv/build/__init__.py b/relenv/build/__init__.py index a5d91c0a..48a254d3 100644 --- a/relenv/build/__init__.py +++ b/relenv/build/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # mypy: ignore-errors """ diff --git a/relenv/build/common/__init__.py b/relenv/build/common/__init__.py index 0c66f912..ad85bd85 100644 --- a/relenv/build/common/__init__.py +++ b/relenv/build/common/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Build process common methods. diff --git a/relenv/build/common/_sysconfigdata_template.py b/relenv/build/common/_sysconfigdata_template.py index d499d391..d1c178ac 100644 --- a/relenv/build/common/_sysconfigdata_template.py +++ b/relenv/build/common/_sysconfigdata_template.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # mypy: ignore-errors # flake8: noqa diff --git a/relenv/build/common/builder.py b/relenv/build/common/builder.py index 5a36a110..8298e194 100644 --- a/relenv/build/common/builder.py +++ b/relenv/build/common/builder.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Builder and Builds classes for managing the build process. diff --git a/relenv/build/common/builders.py b/relenv/build/common/builders.py index 896d87eb..12e92645 100644 --- a/relenv/build/common/builders.py +++ b/relenv/build/common/builders.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Build functions for specific dependencies. diff --git a/relenv/build/common/download.py b/relenv/build/common/download.py index 5c2a8fb0..481c8d58 100644 --- a/relenv/build/common/download.py +++ b/relenv/build/common/download.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Download utility class for fetching build dependencies. diff --git a/relenv/build/common/install.py b/relenv/build/common/install.py index 5d6c4677..dfd7635d 100644 --- a/relenv/build/common/install.py +++ b/relenv/build/common/install.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Installation and finalization functions for the build process. diff --git a/relenv/build/common/ui.py b/relenv/build/common/ui.py index 281e1158..e6d7385e 100644 --- a/relenv/build/common/ui.py +++ b/relenv/build/common/ui.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ UI and build statistics utilities. diff --git a/relenv/build/darwin.py b/relenv/build/darwin.py index 2bf0c019..f60aab4a 100644 --- a/relenv/build/darwin.py +++ b/relenv/build/darwin.py @@ -1,4 +1,4 @@ -# Copyright 2025 Broadcom. +# Copyright 2025-2026 Broadcom. # SPDX-License-Identifier: Apache-2 # mypy: ignore-errors """ diff --git a/relenv/build/linux.py b/relenv/build/linux.py index 5a0024c5..2a9c67b1 100644 --- a/relenv/build/linux.py +++ b/relenv/build/linux.py @@ -1,4 +1,4 @@ -# Copyright 2025 Broadcom. +# Copyright 2025-2026 Broadcom. # SPDX-License-Identifier: Apache-2 # mypy: ignore-errors """ diff --git a/relenv/build/windows.py b/relenv/build/windows.py index a88f41db..6549d70b 100644 --- a/relenv/build/windows.py +++ b/relenv/build/windows.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2 # mypy: ignore-errors """ diff --git a/relenv/buildenv.py b/relenv/buildenv.py index 2dcf35cb..12627656 100644 --- a/relenv/buildenv.py +++ b/relenv/buildenv.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Helper for building libraries to install into a relenv environment. diff --git a/relenv/check.py b/relenv/check.py index 04e9c999..c308fbdc 100644 --- a/relenv/check.py +++ b/relenv/check.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Check the integrety of a relenv environment. diff --git a/relenv/common.py b/relenv/common.py index f73817ae..5865975b 100644 --- a/relenv/common.py +++ b/relenv/common.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Common classes and values used around relenv. diff --git a/relenv/create.py b/relenv/create.py index e9145f3c..73f4b894 100644 --- a/relenv/create.py +++ b/relenv/create.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ The ``relenv create`` command. diff --git a/relenv/fetch.py b/relenv/fetch.py index b814c48e..fa677b09 100644 --- a/relenv/fetch.py +++ b/relenv/fetch.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # mypy: ignore-errors """ diff --git a/relenv/manifest.py b/relenv/manifest.py index b8e0fc5a..ca4dff65 100644 --- a/relenv/manifest.py +++ b/relenv/manifest.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # """ diff --git a/relenv/pyversions.py b/relenv/pyversions.py index f501631c..2864f35e 100644 --- a/relenv/pyversions.py +++ b/relenv/pyversions.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Versions utility. diff --git a/relenv/relocate.py b/relenv/relocate.py index 58a4fbdb..762a05bd 100755 --- a/relenv/relocate.py +++ b/relenv/relocate.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ A script to ensure the proper rpaths are in place for the relenv environment. diff --git a/relenv/runtime.py b/relenv/runtime.py index 5ccda5f9..1f940044 100644 --- a/relenv/runtime.py +++ b/relenv/runtime.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ This code is run when initializing the python interperter in a Relenv environment. diff --git a/relenv/toolchain.py b/relenv/toolchain.py index 8c0b8b08..bbe69a78 100644 --- a/relenv/toolchain.py +++ b/relenv/toolchain.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ The ``relenv toolchain`` command. diff --git a/tests/__init__.py b/tests/__init__.py index 77693cb5..6566c718 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,2 +1,2 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 diff --git a/tests/_pytest_typing.py b/tests/_pytest_typing.py index 2ec3fcb5..9ff2b470 100644 --- a/tests/_pytest_typing.py +++ b/tests/_pytest_typing.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 """ Typed helper wrappers for common pytest decorators so mypy understands them. diff --git a/tests/conftest.py b/tests/conftest.py index 8ce041c4..98ddd323 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # import logging diff --git a/tests/test_build.py b/tests/test_build.py index 055c8e18..19740038 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 import hashlib import logging diff --git a/tests/test_common.py b/tests/test_common.py index 84ade7ad..94a99f2a 100644 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 from __future__ import annotations diff --git a/tests/test_create.py b/tests/test_create.py index 6d4d6f31..62ac3089 100644 --- a/tests/test_create.py +++ b/tests/test_create.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # import os diff --git a/tests/test_downloads.py b/tests/test_downloads.py index 641661da..f50101fe 100644 --- a/tests/test_downloads.py +++ b/tests/test_downloads.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 import pathlib import subprocess diff --git a/tests/test_fips_photon.py b/tests/test_fips_photon.py index add6c331..4d82f257 100644 --- a/tests/test_fips_photon.py +++ b/tests/test_fips_photon.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # import os diff --git a/tests/test_module_imports.py b/tests/test_module_imports.py index d9455c84..b9fcc2f7 100644 --- a/tests/test_module_imports.py +++ b/tests/test_module_imports.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # from __future__ import annotations diff --git a/tests/test_pyversions_runtime.py b/tests/test_pyversions_runtime.py index 0daf8907..37f2fe29 100644 --- a/tests/test_pyversions_runtime.py +++ b/tests/test_pyversions_runtime.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # from __future__ import annotations diff --git a/tests/test_relocate.py b/tests/test_relocate.py index 094d2544..17917630 100644 --- a/tests/test_relocate.py +++ b/tests/test_relocate.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 import pathlib import shutil diff --git a/tests/test_relocate_module.py b/tests/test_relocate_module.py index 34cacffe..54d16739 100644 --- a/tests/test_relocate_module.py +++ b/tests/test_relocate_module.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # from __future__ import annotations diff --git a/tests/test_runtime.py b/tests/test_runtime.py index 225a5b2e..9187f1d9 100644 --- a/tests/test_runtime.py +++ b/tests/test_runtime.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # from __future__ import annotations diff --git a/tests/test_verify_build.py b/tests/test_verify_build.py index 3ed7a33a..f241d5b0 100644 --- a/tests/test_verify_build.py +++ b/tests/test_verify_build.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 Broadcom. +# Copyright 2022-2026 Broadcom. # SPDX-License-Identifier: Apache-2.0 # mypy: ignore-errors """ From c28eced0d4ec44599eb5c43b0e79c99ced85882a Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Tue, 6 Jan 2026 15:45:18 -0700 Subject: [PATCH 3/4] Fix test assertion for the new year. --- tests/test_common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_common.py b/tests/test_common.py index 94a99f2a..7d76b83e 100644 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -529,7 +529,7 @@ def test_toolchain_uses_cache_without_relenv_data( def test_copyright_headers() -> None: """Verify all Python source files have the correct copyright header.""" expected_header = ( - "# Copyright 2022-2025 Broadcom.\n" "# SPDX-License-Identifier: Apache-2.0\n" + "# Copyright 2022-2026 Broadcom.\n" "# SPDX-License-Identifier: Apache-2.0\n" ) # Find all Python files in relenv/ and tests/ From 989c5b2cff4d178cc91e9f34d46969f4bb640728 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Wed, 7 Jan 2026 15:30:35 -0700 Subject: [PATCH 4/4] Skip git based install until we fix windows man pages issue --- tests/test_verify_build.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/test_verify_build.py b/tests/test_verify_build.py index f241d5b0..f16954a4 100644 --- a/tests/test_verify_build.py +++ b/tests/test_verify_build.py @@ -180,13 +180,15 @@ def test_imports(pyexec): def test_pip_install_salt_git(pipexec, build, build_dir, pyexec, build_version): - if ( - sys.platform == "win32" - and "3.11" in build_version + if sys.platform == "win32" and ( + "3.10" in build_version + or "3.11" in build_version or "3.12" in build_version or "3.13" in build_version ): - pytest.xfail("Salt does not work with 3.11 or 3.12 on windows yet") + pytest.xfail( + "Salt git install fails on Windows (setup.py tries to install missing man pages)" + ) if sys.platform == "darwin" and "3.12" in build_version: pytest.xfail("Salt does not work with 3.12 on macos yet") if sys.platform == "darwin" and "3.13" in build_version: