Skip to content

chore(sync): merge main into new-resolver-config - #1367

Merged
LalatenduMohanty merged 46 commits into
python-wheel-build:new-resolver-configfrom
LalatenduMohanty:sync/pr-1366-main
Oct 13, 2026
Merged

LalatenduMohanty merged 46 commits into
python-wheel-build:new-resolver-configfrom
LalatenduMohanty:sync/pr-1366-main

Conversation

@LalatenduMohanty

Copy link
Copy Markdown
Member

Why

Bring new-resolver-config up to date with main so resolver work can continue on the latest code.

What changed

  • Merged main and kept both branches' tests when resolving the two conflicts.
  • Updated bootstrapper tests to avoid network requests and unfinished background work.

Checks

  • 270 focused tests passed.
  • Ruff and mypy passed for the resolved test files.

Replaces #1366.

jlarkin09 and others added 30 commits September 15, 2026 10:58
The default_build_sdist function was constructing sdist filenames using
req.name directly, which could contain uppercase letters, dots, or hyphens
that were not normalized per PEP 625. This caused filenames to disagree
with upstream artifacts and broke filename-keyed comparison operations.

Apply PEP 503 canonicalization (lowercase, replace [._-] with _) when
constructing sdist filenames, ensuring compliance with PEP 625.

Fixes python-wheel-build#1317

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Signed-off-by: Justin Larkin <jlarkin@redhat.com>
`_write_requirements_file()` wrote requirement sets in iteration order
so rebuilds of identical sources could produced different files even
though the content was the same.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Martin Prpič <mprpic@redhat.com>
…rements-files

fix(dependencies): sort requirements files
Extract the normalized package name to a variable to keep lines within the
project's configured line length limit of 88 characters.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Signed-off-by: Justin Larkin <jlarkin@redhat.com>
…ep625-normalization-1317

fix(sources): sdist filenames are not PEP 625 normalized
Log a warning when a candidate version is filtered out because it has
no sdist (wheel-only release). Previously this was gated behind
DEBUG_RESOLVER and invisible at default verbosity.

Fixes python-wheel-build#1332

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Ryan Petrello <ryan@ryanpetrello.com>
…sing-sdist

fix(resolver): warn when a version is skipped due to missing sdist
In multiple-versions mode a failed version is removed from the graph
together with every descendant that becomes orphaned, including ones
that already completed bootstrap with their build-system edges. Only the
failed package's own seen-markers were cleared, so when an orphaned
descendant was encountered again it was re-added as a bare node by Start
and skipped as already seen. graph.json then carried the node with no
build edges and build-parallel scheduled it in round 1 before its build
backend was available.

Make remove_dependency return the removed nodes and clear the
seen-markers for every one of them, so a re-encountered orphan goes
through PrepareSource again.

Closes python-wheel-build#1335

Co-Authored-By: Claude Opus <noreply@anthropic.com>
Signed-off-by: Andre Lustosa <alustosa@redhat.com>
Top-level requirements were resolved and recorded in the dependency graph
one rule at a time. A later rule for the same package, such as an exact
pin that bypasses the release-age cooldown, widens the resolver's shared
per-package cache, so the Resolve phase then returned a different version
than the one already written to the graph. Because Start skips graph
insertion for top-level requirements, the stale node stayed in graph.json
with no build-system edges and build-parallel scheduled it in round 1
before its build backend was available.

Resolve every top-level rule once before any of them is added to the
graph, so the recorded version matches what the Resolve phase uses. Each
warm-up call runs inside req_ctxvar_context() so log messages carry the
package name, and deferred errors are logged at debug level instead of
silently swallowed.

Closes python-wheel-build#1334

Co-Authored-By: Claude Opus <noreply@anthropic.com>
Signed-off-by: Andre Lustosa <alustosa@redhat.com>
…n-seen-keys

fix(bootstrap): forget seen-markers of cascade-removed dependencies
…vel-stale-node

fix(bootstrap): warm the resolver cache before adding top-level nodes
The `test_multiple_versions_forgets_cascade_removed_descendants` test
used example.com URLs, inconsistent with the rest of the file which
uses the .test TLD per project convention.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Lalatendu Mohanty <lmohanty@redhat.com>
…test-url-convention

fix(tests): use .test TLD instead of example.com in bootstrapper test
Localhost simple indexes never provide PEP 691 upload timestamps.
Override `is_blocked_by_cooldown` in `PyPIProvider` to silently
skip the check when the server is localhost, instead of emitting
a noisy warning for every package.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Ryan Petrello <ryan@ryanpetrello.com>
…ress-localhost-cooldown-warning

fix(resolver): suppress cooldown warning for localhost indexes
Promote the "cooldown blocked N version(s)" log message from INFO to
WARNING. When the release-age cooldown actively rejects versions, this
is a significant event that should be visible at default verbosity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Ryan Petrello <ryan@ryanpetrello.com>
…ldown-blocked

fix(resolver): warn when cooldown blocks versions
Bumps [dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain) from 6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772 to 02cb101ec7c40f2c49e1d9714d64511d8e1b74de.
- [Release notes](https://github.com/dtolnay/rust-toolchain/releases)
- [Commits](dtolnay/rust-toolchain@6c977a6...02cb101)

---
updated-dependencies:
- dependency-name: dtolnay/rust-toolchain
  dependency-version: 02cb101ec7c40f2c49e1d9714d64511d8e1b74de
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Tests replacing PrepareSource.run() do not consume background results.
Disable background work too so placeholder URLs never trigger requests.

This becomes important in sandboxed environments where network requests
don't quickly return an error but instead go into a backoff retry loop.

Co-Authored-By: OpenAI Codex <codex@openai.com>
Signed-off-by: Ihar Hrachyshka <ihar.hrachyshka@gmail.com>
Parallel pytest workers can share the default repository paths. Test
runs may fail with:

    <Result FileExistsError(17, 'File exists')>

Two workers may both observe a missing directory before one creates it,
causing the other worker's mkdir() call to fail.

Use `exist_ok=True` so `WorkContext.setup()` tolerates that race.

Co-Authored-By: OpenAI Codex <codex@openai.com>
Signed-off-by: Ihar Hrachyshka <ihar.hrachyshka@gmail.com>
…retries

test(bootstrapper): prevent unintended background downloads
Name the archive root from the normalized package name and version.

Test the returned sdist archive and the tar helper.

Fixes python-wheel-build#1315
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Co-Authored-By: Codex <codex@openai.com>

Signed-off-by: Justin Larkin <jlarkin@redhat.com>
The local wheel server and --cache-wheel-server-url only hold wheels
Fromager already built. Cooldown was applied when the sdist was resolved.
The cache upload-time is when we uploaded the wheel, not when the package
was published, so --min-release-age rejects a wheel we should reuse.

A package wheel_server_url is an upstream pre-built index, so that lookup
stays on the pre-built path and cooldown still applies.

Follows up on python-wheel-build#1143 and closes python-wheel-build#1140.

Co-Authored-By: Claude <claude@anthropic.com>
Co-Authored-By: Cursor Grok 4.7 <noreply@x.ai>
Signed-off-by: Shanmukh Pawan <smoparth@redhat.com>
…x/disable-cooldown-cache-server

fix(wheels): disable cooldown for local and cache wheel servers by having separate cache wheel resolution from pre-built path
…pendabot/github_actions/dtolnay/rust-toolchain-02cb101ec7c40f2c49e1d9714d64511d8e1b74de

build(deps): bump dtolnay/rust-toolchain from 6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772 to 02cb101ec7c40f2c49e1d9714d64511d8e1b74de
Add the global wheels.build_tag_hook setting to append validated environment suffixes to wheel build tags. Apply the hook consistently when building wheels and checking local or remote caches.

Document the hook configuration and explain how its settings import string differs from process hooks discovered through entry points.

Closes: python-wheel-build#1181

Co-Authored-By: GPT Sol <codex@openai.com>
Signed-off-by: Justin Larkin <jlarkin@redhat.com>
…build-tag-hook-1181

feat(wheels): add configurable build tag hook for wheel filenames
…-race-mkdir

fix(context): handle concurrent directory creation
ryanpetrello and others added 15 commits October 2, 2026 07:02
Keep routine candidate skips in CI logs without sending WARNING telemetry events.

Co-Authored-By: Codex <codex@openai.com>
Signed-off-by: Ryan Petrello <rpetrell@redhat.com>
…l-only-log-level

fix(resolver): log wheel-only candidate skips at INFO
Bumps [dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain) from 02cb101ec7c40f2c49e1d9714d64511d8e1b74de to 7e38f4b43b4db5c8dd498af069a4f6196df1d067.
- [Release notes](https://github.com/dtolnay/rust-toolchain/releases)
- [Commits](dtolnay/rust-toolchain@02cb101...7e38f4b)

---
updated-dependencies:
- dependency-name: dtolnay/rust-toolchain
  dependency-version: 7e38f4b43b4db5c8dd498af069a4f6196df1d067
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
get_pyproject_contents() only reads [build-system], so it does not need
tomlkit's format-preserving parser. tomlkit (0.15.1) rejects some
spec-valid files that re-open a super-table out of order, failing builds
for affected packages (e.g. geventhttpclient). stdlib tomllib parses
them correctly and is always available (Python >= 3.12).

Co-Authored-By: Claude <claude@anthropic.com>
Closes: python-wheel-build#1356
Signed-off-by: Christian Heimes <cheimes@redhat.com>
…omllib-read

fix(deps): read pyproject.toml with tomllib instead of tomlkit
Pre-built packages have an empty changelog build tag, which the reuse
check treated as 0. A publisher build number higher than 0 then failed
the job instead of downloading the wheel. Skip that comparison for
pre-built packages and keep it for wheels Fromager builds.

Co-Authored-By: Grok <grok@x.ai>
Signed-off-by: Shanmukh Pawan <smoparth@redhat.com>
…x/prebuilt-ignore-changelog-build-tag

fix(build): reuse pre-built wheels that carry a build number
…pendabot/github_actions/dtolnay/rust-toolchain-7e38f4b43b4db5c8dd498af069a4f6196df1d067

build(deps): bump dtolnay/rust-toolchain from 02cb101ec7c40f2c49e1d9714d64511d8e1b74de to 7e38f4b43b4db5c8dd498af069a4f6196df1d067
fix(bootstrap): AIPCC-29282 remove dead cache-server fallback
…oplevel-directory-1315

fix(tarballs): use correct top-level directory name in sdists
Use INFO for expected stub creation in `ensure_pkg_info()`.

Co-Authored-By: Codex <codex@openai.com>
Signed-off-by: Ryan Petrello <rpetrell@redhat.com>
…info-log-level

fix(sources): log PKG-INFO stub creation at INFO
Bumps [dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain) from 7e38f4b43b4db5c8dd498af069a4f6196df1d067 to e2a55d2ffb04f378e9626c28d38b36d230d1e12f.
- [Release notes](https://github.com/dtolnay/rust-toolchain/releases)
- [Commits](dtolnay/rust-toolchain@7e38f4b...e2a55d2)

---
updated-dependencies:
- dependency-name: dtolnay/rust-toolchain
  dependency-version: e2a55d2ffb04f378e9626c28d38b36d230d1e12f
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
…pendabot/github_actions/dtolnay/rust-toolchain-e2a55d2ffb04f378e9626c28d38b36d230d1e12f

build(deps): bump dtolnay/rust-toolchain from 7e38f4b43b4db5c8dd498af069a4f6196df1d067 to e2a55d2ffb04f378e9626c28d38b36d230d1e12f
Bring the feature branch up to date with main. Preserve the source resolver and wheel settings tests, and keep the bootstrap tests free of network requests.

Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: Lalatendu Mohanty <lmohanty@redhat.com>
@LalatenduMohanty
LalatenduMohanty requested a review from a team as a code owner October 13, 2026 18:35
@coderabbitai

coderabbitai Bot commented Oct 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: python-wheel-build/fromager/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 528f039c-af21-44f0-91e0-3c2b56c56735

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@mergify mergify Bot added the ci label Oct 13, 2026

@rd4398 rd4398 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@mergify

mergify Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Queued — the merge queue status continues in this comment ↓.

@mergify

mergify Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • ✅ Entered queue — 2026-10-13 18:47 UTC · Rule: default · triggered by @LalatenduMohanty with the merge queue checkbox
  • ✅ Checks skipped · PR is already up-to-date
  • 🚫 Left the queue — 2026-10-13 18:48 UTC · at 5eae3b43261b08a37fef60f061cdbbd6ba17098e

This pull request spent 15 seconds in the queue, including 1 second running CI.

Reason

Pull request #1367 has been dequeued

GitHub refused to merge the pull request. You're not authorized to push to this branch. Visit https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches for more information. This is usually enforced by a branch protection or ruleset rule.

Hint

You should look at the reason for the failure and decide if the pull request needs to be fixed or if you want to requeue it.
If you do update this pull request, it will automatically be requeued once the queue conditions match again.
If you think this was a flaky issue instead, you can requeue the pull request, without updating it, by posting a @mergifyio queue comment.

Required conditions to merge

Requeued — the merge queue status continues in this comment ↓.

@mergify

mergify Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • ✅ Entered queue — 2026-10-13 18:55 UTC · Rule: default · triggered by @LalatenduMohanty with the merge queue checkbox
  • ✅ Checks skipped · PR is already up-to-date
  • 🚫 Left the queue — 2026-10-13 18:55 UTC · at 5eae3b43261b08a37fef60f061cdbbd6ba17098e

This pull request spent 16 seconds in the queue, including 2 seconds running CI.

Reason

Pull request #1367 has been dequeued

GitHub refused to merge the pull request. You're not authorized to push to this branch. Visit https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches for more information. This is usually enforced by a branch protection or ruleset rule.

Hint

You should look at the reason for the failure and decide if the pull request needs to be fixed or if you want to requeue it.
If you do update this pull request, it will automatically be requeued once the queue conditions match again.
If you think this was a flaky issue instead, you can requeue the pull request, without updating it, by posting a @mergifyio queue comment.

Required conditions to merge

Tick the box to put this pull request back in the merge queue (same as @mergifyio queue).

  • Requeue this pull request

@mergify mergify Bot added queued and removed queued labels Oct 13, 2026
@LalatenduMohanty
LalatenduMohanty merged commit 6537698 into python-wheel-build:new-resolver-config Oct 13, 2026
37 of 38 checks passed
LalatenduMohanty added a commit to LalatenduMohanty/fromager that referenced this pull request Oct 13, 2026
Create resolver branch backports after each main PR merge using the installed Mergify app. Keep generated backports for maintainer review and manual merging, and document recovery from conflicts or missed events.

Remove the superseded sync workflow and limit backports to changes after the baseline sync in python-wheel-build#1367.

Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: Lalatendu Mohanty <lmohanty@redhat.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants