Vendored PyPI revert drift warnings print the ledger key in Rust debug form: `Pipfile.lock entry for Some("default:six") changed since vendoring`
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
調査の方向性
誤った出力は、crates/socket-patch-core/src/vendor/state.rs の WiringRecord::key にある Option<String> キーを {:?} で整形していることが原因です。このキーは pypi_pipenv.rs の vendor_lock_entry_drifted と pypi_requirements.rs の vendor_revert_line_drifted で使われており、同じパターンが pypi_uv.rs と common.rs にもあります。まずこの4つの呼び出し箇所と、既存の vendor_revert_residual_reference 警告を読んでください。この警告はすでにキーをそのまま出力しています。ドリフト警告がキーをそのまま、または None 用のプレースホルダーで出力し、revert/rollback のテストがすべて通れば完了です。
索引モデルが issue の本文から書いたものです。
説明
[agent] Found by the scheduled Pipenv bug-hunt routine (ledger #313).
Summary
When a vendored Pipenv project's recorded wiring has drifted, vendor --revert, remove and rollback warn with the ledger key formatted through {:?} on an Option<String>. The warning, in both human output and --json warning text, shows a Rust Some("…") wrapper instead of the key:
Warning: Pipfile.lock entry for Some("default:six") changed since vendoring; left untouched
Warning: requirements.txt: the vendor line for Some("requirements.txt:1") changed since vendoring; left untouched
Impact
This is cosmetic only. The keep/restore behaviour is correct, nothing is unpatched silently, and VEX isn't affected. But the debug form leaks into user-facing text and into the --json warning messages that CI consumers read. When the key is missing (None, e.g. an older or hand-written ledger), the warning would print entry for None.
Repro (Linux, main 657fce2 / 5.0.1, real Pipenv 2026.9.1, local mock of the patch API serving a patched six-1.16.0 wheel)
cat > Pipfile <<'EOF'
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
six = "==1.16.0"
[requires]
python_version = "3.11"
EOF
pipenv lock
socket-patch scan --mode vendored --yes # Pipfile.lock six → ./.socket/vendor/pypi/<uuid>/six-…whl
# drift the vendored entry (any field the ledger recorded, e.g. its markers)
sed -i "s/python_version >= '2.7' and/python_version >= '2.8' and/" Pipfile.lock
socket-patch vendor --revert --yes # Warning: Pipfile.lock entry for Some("default:six") changed since vendoring; left untouched
socket-patch rollback --yes --json | grep -o 'entry for Some[^;]*' # entry for Some(\"default:six\") changed since vendoring
The requirements.txt variant: vendor with a sibling requirements.txt holding six==1.16.0, then hand-restore that line (or interrupt a remove with SIGKILL after it restored requirements.txt but before it dropped the ledger) and re-run vendor --revert. It prints the vendor line for Some("requirements.txt:1") changed since vendoring.
Expected vs actual
- Expected: the warning names the entry as the ledger records it (
Pipfile.lock entry for default:six …,the vendor line for requirements.txt:1 …). Other warnings in the same code path print keys plainly, e.g. thevendor_revert_residual_referencetext. - Actual:
Some("default:six")/Some("requirements.txt:1").
OS × version
| OS | Pipenv | vendor --revert |
rollback |
remove |
|---|---|---|---|---|
| Linux | 2026.9.1 | reproduces (×2) | reproduces (×2) | reproduces (requirements.txt variant) |
| macOS / Windows | not probed: the string formatting is platform-independent |
No bisect, because the format strings predate the current history.
Suspect code
WiringRecord::key is Option<String> (crates/socket-patch-core/src/vendor/state.rs:143), and these format it with {:?}:
crates/socket-patch-core/src/vendor/pypi_pipenv.rs:569(vendor_lock_entry_drifted)crates/socket-patch-core/src/vendor/pypi_requirements.rs:601(vendor_revert_line_drifted)- the same pattern at
crates/socket-patch-core/src/vendor/pypi_uv.rs:991andcrates/socket-patch-core/src/vendor/common.rs:826(not exercised here; they likely show the same leak for uv and the othercommon.rsusers)
A fix along the lines of rec.key.as_deref().unwrap_or("<unknown>") with {} would cover all four.
- 主要言語
- Rust
- スター
- 8
- フォーク
- 1
- 平均マージ
- 16時間 22分
- マージ済み PR(30日)
- 583
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
SocketDev/socket-patch のほかの issue
-
agent:triaged bug bughunt pm:vlt priority:p1
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
SocketDev/socket-patch#1601 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
agent:triaged bug bughunt pm:npm priority:p3 ux
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
SocketDev/socket-patch#1072 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
agent:triaged bug bughunt pm:yarn-berry priority:p1
難易度 2/5 1〜3時間 初心者へのやさしさ 73/100
SocketDev/socket-patch#783 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
Vendored cargo warns cargo_multi_version_old_cargo ("declares no rust-version") when the root package inherits rust-version from [workspace.package]対応中かも @mikolalysenko が 6 日前に担当しました。 オープンagent:triaged bug bughunt pm:cargo priority:p2
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
SocketDev/socket-patch#651 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
-
bug bughunt pm:pnpm
難易度 3/5 1〜2日 初心者へのやさしさ 76/100
SocketDev/socket-patch#1638 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
SocketDev/socket-patch の issue をすべて見る
似ている issue
-
area:desktop priority:p2 type:bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1〜3時間 初心者へのやさしさ 88/100
fritzprix/libr-agent#2165 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 69/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
-
area:ecosystem bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
Chelis-Lang/chelis#3942 ·
メンテナーはふだん 1 日以内に返信