2.0 (2025-02-09)

Dropping support for end-of-life versions of Python

To help improve maintenance work for releng-tool, the utility will now only support versions of Python that have not reached end-of-life. At the time of this release, this includes support for Python 3.9 and later.

Overhaul of Python package processing

A significant rework of the management of Python packages has been made. This aims to address the shortcomings on how packages were installed to a target. All Python packages will use Python’s installer module for their install stage. A consistent scheme (similar to posix_home) will be used no matter what platform or distribution releng-tool is running on. This should prevent oddities in the location where Python files are installed into a host, staging or target area.

Developers can override the scheme used by configuring LIBFOO_PYTHON_INSTALLER_SCHEME for a package. The scheme may be configured to native to observe the same results in older versions of releng-tool. The option can also be configured with a supported variant defined by sysconfig or even a completely customized scheme for the project/package.

Additional configurations for Python package includes LIBFOO_PYTHON_INSTALLER_LAUNCHER_KIND, which can be used to tailor what type of package script is generated during an install; as well as LIBFOO_PYTHON_DIST_PATH, which can be used to indicate the alternative location for a dist/ (if required). Note that older Python setup types will require wheel to be available to ensure a proper wheel is generated to be installed.

Related to the above changes, the following improvements have been made to Python packages:

  • Addressed some installation scenarios where configured package installation prefixes were not applied.

  • Improve the automatic path registration for host-configured Python packages. This includes both installed scripts and provided Python modules.

  • Developers can now issue re-install events on Python packages without the process complaining about overwriting files in a target.

Corrections to Git submodule using incorrect revisions

While releng-tool has aimed to support the use of Git submodules for Git-based sites, limitations existed in which revisions were used when cloning these modules. When a submodule was processed in previous versions, releng-tool would incorrectly determine the revision based on the most recent release of a target branch instead of the fixed revision tracked by the Git repository (unless a package defined an explicit revision to use).

This releases corrects this by querying the specific revision in the Git repository for the submodule path instead of incorrectly relying on a submodule configuration used for synchronization.

Alternative hash-files for package development revisions

A project can define hashes (e.g. libfoo.hash for packages to validate fetched sources. An issue for users operating in a development mode is that configured hash checks may fail if using an alternate revision for a package. This release now supports creating revision-specific hash sets. A package may define a respective libfoo.hash-<rev> file in a package, where <rev> matches the revision being fetched:

└── my-project/
    ├── package/
    │   ├── libfoo/
    │   │   ├── libfoo.rt
    │   │   ├── libfoo.hash
    │   │   └── libfoo.hash-<rev>     <----
    │   ...
    └── releng-tool.rt

Additional control/capabilities on fetching URL sources

Two improvements have been added into releng-tool in relation to managing URL sources for a project. The first change adds support for retrying fetch attempts if a transient error is detected. This includes scenarios where a server has indicated a timeout, an internal server error or more. A fetch attempt will now try up to a total of three times before stopping. This aims to improve use cases such as preventing scheduled build failures if a site is only down for a small interval.

A second change related to URL fetching is the introduction of the --only-mirror argument. When the argument is set for a project that also defines url_mirror, all external packages will only be attempted to be downloaded through the configured mirror. This may be helpful for developers wanting to sanity check all expected resources are locally cached.