@@ -51,6 +51,43 @@ into the new version's section — see docs/releasing.md.
5151
5252### Added
5353
54+ - ** Pipenv projects can use hosted patches, and vendored patches keep every
55+ category.** ` scan --mode hosted ` rewrites every ` Pipfile.lock ` category
56+ (` default ` , ` develop ` , Pipenv 2022+ named categories) that pins the patched
57+ release to the hosted wheel — ` file ` references for Pipenv 2018 and later,
58+ ` path ` for 7–11 (probed once with ` pipenv --version ` ; ` SOCKET_PIPENV_MAJOR `
59+ pins it), pipfile-spec < 6 refused — preserving markers, extras, unrelated
60+ entries, the Pipfile and its content hash, with per-entry rollback
61+ (` redirect_pipenv_entry ` ). Vendored mode keeps custom categories and extras,
62+ uses ` path ` for wheels with extras (Pipenv 2022's file-URL bug) and refuses
63+ installers older than 2018 (` pypi_pipenv_installer_unsupported ` ). A stale
64+ Pipfile.lock only vetoes the sibling Python rewriters on a real pin/source
65+ conflict (` redirect_pipenv_refused ` ); anything else is
66+ ` redirect_pipenv_skipped ` . Measured across the last stable release of all
67+ 18 published Pipenv majors — see ` docs/testing/pipenv-compatibility.md ` and
68+ ` scripts/backtest-pipenv.py ` .
69+ - ** ` Pipfile.lock ` is inventoried.** Lock-only Pipenv checkouts (a fresh
70+ clone with nothing installed) now discover their pins in every mode —
71+ hosted redirects them, vendored fetches the pristine wheel by one of the
72+ lock's recorded digests (` LockIntegrity::Sha256AnyOf ` , resolved through
73+ PyPI's JSON API and verified against the same digest) and agent/scan list
74+ them as lockfile-only packages. Previously they discovered nothing and
75+ exited 0. Socket's own references stay discoverable, so a re-scan of an
76+ already-redirected or already-vendored lock-only checkout re-confirms it;
77+ a lock that resolves only from private indexes is never looked up on
78+ pypi.org.
79+ - ** Pipenv's out-of-tree virtualenv is discovered.** Agent mode (bare ` scan ` ,
80+ ` rollback ` , ` vex ` ) now finds ` $WORKON_HOME/<dir>-<hash>[-<python>] ` (the
81+ ` .venv ` file pointer, ` PIPENV_CUSTOM_VENV_NAME ` and ` PIPENV_PIPFILE `
82+ included) exactly as Pipenv 7 through 2026 place it, instead of falling
83+ through to the global interpreter's site-packages.
84+ - ** Pipenv stale-install guard.** Pipenv never reinstalls a release that is
85+ already present, so a hosted or vendored rewrite over a warm venv leaves the
86+ upstream bytes installed; ` redirect_pypi_stale_install ` /
87+ ` pypi_pipenv_stale_install ` now say so, naming the site-packages dir and
88+ the verified remedy (` pipenv run pip uninstall -y <pkg> && pipenv sync ` , or
89+ a clean ` pipenv --rm && pipenv sync ` ), and the stale purl is excluded from
90+ the same-run ` --vex ` .
5491- ** Poetry projects take hosted patches, and vendored patches now cover every
5592 ` poetry.lock ` generation.** ` scan --mode hosted ` rewrites ` poetry.lock ` to a
5693 ` [package.source] type = "url" ` pointing at the Socket-hosted, SHA-256-pinned
@@ -200,6 +237,23 @@ into the new version's section — see docs/releasing.md.
200237
201238### Fixed
202239
240+ - ** Rollback after a Pipenv relock no longer refuses forever.** ` pipenv lock `
241+ (and ` update ` , and ` install <other> ` before 2024) regenerates a redirected
242+ or vendored entry to registry shape on every Pipenv major; that is now the
243+ desired end state — the hosted edit retires and the vendored record is
244+ dropped (` vendor_lock_entry_relocked ` ) — instead of a permanent drift
245+ refusal that held every pypi revert and kept the orphaned wheel dir. A
246+ foreign ` file ` /` path ` reference is still drift.
247+ - ** Same-run ` --vex ` attests lock-only pypi redirects.** The confirmed purl is
248+ unqualified while the ledger records the API's artifact-qualified purl;
249+ both sides now match on the qualifier-stripped purl, so a lock-only Pipenv
250+ (or uv) checkout no longer exits 1 ` no_applicable_patches ` after
251+ redirecting its lock.
252+ - ** The Pipenv installer probe runs only when a patch targets the lock** , warns
253+ only when the lock was actually rewritten, resolves ` pipenv ` on absolute
254+ ` PATH ` entries only (a relative entry would have executed a ` pipenv ` planted
255+ in the scanned repository), finds ` .bat ` /` .cmd ` shims on Windows, and takes
256+ only the token after ` version ` (never a stray ` Python 3.12 ` banner).
203257- Hosted Python redirects now warn when installed files still contain upstream
204258 or modified bytes and omit those packages from same-run VEX. The read-only
205259 probe covers Poetry virtualenvs, repeats on re-scans, and uses persisted patch
0 commit comments