Skip to content

Commit f0cac3e

Browse files
committed
Bound the pdm e2e compat pins by release
The pdm bootstrap pinned `unearth<0.19` for every 2.x release and `hishel<2` for every release from 2.26.1. pdm 2.29.4 moved to httpx2 and requires `unearth>=0.19`, and pdm 2.29.7 (2026-11-06) requires `hishel>=2.0`, so pip refuses to resolve the bootstrap for any of those releases: both pdm e2e cases fail before pdm runs. The matrix still runs 2.29.2, so CI is green today, but the next bump of the latest-pdm row (or a backtest of a current release) would go red with ResolutionImpossible. Apply each pin only to the releases that declare the unbounded requirement: `unearth<0.19` below 2.29.4, `hishel<2` from 2.26.1 up to 2.29.7. Mirror the bounds in scripts/backtest-pdm.py. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011f9aeQMSUtsXXCdCmmVd9T
1 parent 502aa1f commit f0cac3e

2 files changed

Lines changed: 26 additions & 18 deletions

File tree

‎crates/socket-patch-cli/tests/e2e_vex_build/pdm.rs‎

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -136,21 +136,26 @@ fn pins_for(v: &str) -> Vec<String> {
136136
// 2.26.9+ require 1.x).
137137
if ((2, 21, 0)..(2, 26, 1)).contains(&t) {
138138
pins.push("hishel<1");
139-
} else if t >= (2, 26, 1) {
140-
// 2.26.9+ declare an unbounded `hishel>=1.0.0` (2.29.6:
139+
} else if ((2, 26, 1)..(2, 29, 7)).contains(&t) {
140+
// 2.26.9 - 2.29.6 declare an unbounded `hishel>=1.0.0` (2.29.4:
141141
// `>=1.4.0`), and hishel 2.0 (2026-11-05) dropped
142142
// `SyncSqliteStorage`, so every command dies with "module
143143
// 'hishel' has no attribute 'SyncSqliteStorage'". `<2`
144144
// resolves the 1.x line those releases shipped against (a
145145
// no-op for 2.26.1 - 2.26.8, which already bound `<1`).
146+
// 2.29.7+ require `hishel>=2.0`, so the pin would make them
147+
// uninstallable.
146148
pins.push("hishel<2");
147149
}
148-
// 2.x declares an unbounded `unearth`, and unearth 0.19 (2026-10-27)
149-
// moved to `httpx2`: PDM's PyPI client is no longer the `httpx`
150-
// client unearth expects, so `pdm lock` dies with "PDMPyPIClient is
151-
// not an instance or subtype of type (Client)" (seen on 2.29.2).
152-
// `<0.19` resolves the 0.18 line every 2.x ran with before.
153-
pins.push("unearth<0.19");
150+
// 2.0 - 2.29.3 declare an unbounded `unearth`, and unearth 0.19
151+
// (2026-10-27) moved to `httpx2`: PDM's PyPI client is no longer the
152+
// `httpx` client unearth expects, so `pdm lock` dies with
153+
// "PDMPyPIClient is not an instance or subtype of type (Client)"
154+
// (seen on 2.29.2). `<0.19` resolves the 0.18 line they ran with.
155+
// 2.29.4+ moved to httpx2 themselves and require `unearth>=0.19`.
156+
if t < (2, 29, 4) {
157+
pins.push("unearth<0.19");
158+
}
154159
}
155160
let mut out = vec![format!("pdm=={v}")];
156161
out.extend(pins.into_iter().map(String::from));

‎scripts/backtest-pdm.py‎

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -204,17 +204,20 @@ def pins_for(version):
204204
# ModuleNotFoundError before locking.
205205
if (2, 21) <= v < (2, 26, 1):
206206
pins.append("hishel<1")
207-
# 2.26.9+ declare an unbounded `hishel>=1.0.0` (2.29.6: `>=1.4.0`);
208-
# hishel 2.0 (2026-11-05) dropped `SyncSqliteStorage` and every
209-
# command dies with AttributeError. `<2` keeps the 1.x line (a
210-
# no-op for 2.26.1 - 2.26.8, which already bound `<1`).
211-
elif v >= (2, 26, 1):
207+
# 2.26.9 - 2.29.6 declare an unbounded `hishel>=1.0.0` (2.29.4:
208+
# `>=1.4.0`); hishel 2.0 (2026-11-05) dropped `SyncSqliteStorage`
209+
# and every command dies with AttributeError. `<2` keeps the 1.x
210+
# line (a no-op for 2.26.1 - 2.26.8, which already bound `<1`).
211+
# 2.29.7+ require `hishel>=2.0`, so the pin would be unresolvable.
212+
elif (2, 26, 1) <= v < (2, 29, 7):
212213
pins.append("hishel<2")
213-
# 2.x declares an unbounded `unearth`; 0.19 (2026-10-27) moved to
214-
# httpx2 and breaks PDM's PyPI client ("PDMPyPIClient is not an
215-
# instance or subtype of type (Client)" on `pdm lock`, seen on
216-
# 2.29.2). `<0.19` resolves the 0.18 line 2.x ran with before.
217-
pins.append("unearth<0.19")
214+
# 2.0 - 2.29.3 declare an unbounded `unearth`; 0.19 (2026-10-27)
215+
# moved to httpx2 and breaks PDM's PyPI client ("PDMPyPIClient is
216+
# not an instance or subtype of type (Client)" on `pdm lock`, seen
217+
# on 2.29.2). `<0.19` resolves the 0.18 line they ran with. 2.29.4+
218+
# moved to httpx2 themselves and require `unearth>=0.19`.
219+
if v < (2, 29, 4):
220+
pins.append("unearth<0.19")
218221
return pins
219222

220223

0 commit comments

Comments
 (0)