Skip to content

fix: 公開日検査の部分差し戻しを互換な組合せで解決する - #145

Merged
owayo merged 1 commit into
mainfrom
fix/issue-141-cargo-age-compatible-recovery
Nov 12, 2026
Merged

owayo merged 1 commit into
mainfrom
fix/issue-141-cargo-age-compatible-recovery

Conversation

@owayo

@owayo owayo commented Nov 12, 2026

Copy link
Copy Markdown
Owner

概要

Cargo の公開日検査で個別の差し戻しの時間が足りず、一部だけ古い版になった場合、適用可能な直接依存の更新も取り消されていました。復元に使っていた60秒枠を共有し、未解消の差し戻し先と成功済みの到達先をまとめて固定する最終解決を追加します。最大40秒を解決に使い、従来の選択的復元に20秒を残します。

また、復元用の一時固定を外した Cargo が不要な補助依存を除去すると、正しい解決でも「install-time version に戻らなかった」として全体復旧へ進んでいました。復元の主対象と補助依存を区別し、元の依存範囲内で不要になった補助依存だけは剪定を許可します。明示的な主対象の欠落や、同系列の別版への置換は許可しません。

維持する条件

  • 元の manifest 要件、install 前の下限、最終 age 検証、OSV 照合を適用
  • 監査中に外部変更を観測した場合は全体を解き直さず、元ファイルを保護
  • 互換解が得られない場合は従来の選択的復元へ進み、復旧自体の失敗は隠さず全体復旧へ引き継ぐ
  • 英語・日本語の利用文書を更新

検証

  • mise exec -- cargo fmt --all -- --check: pass
  • mise exec -- cargo clippy --locked --all-targets -- -D warnings: pass
  • mise exec -- cargo test --locked --quiet: 2951 passed、1 ignored
  • astro-sight review --git: API 変更・未解決の呼び出し元・死コードなし
  • 偽 local-registry と実 cargo で、通常の時間枠不足による部分差し戻しを再現。最終監査成功、直接依存の更新保持、推移依存の age 適合、追跡受領書の発行、--locked 受理を確認
  • 報告の itertools と同型の補助依存剪定を再現。修正前の復元失敗から修正後の成功を確認し、主対象に同じ剪定を許さないことも検証
  • 外部の lock 編集を最終解決が上書きしない回帰テストを追加。既存の解決不能・下限・独立した成功保持のテストも成功

報告の実プロジェクトの manifest / lock は添付されていないため、固定した公開日を持つ最小再現で検証しています。

Closes #141

個別の差し戻しが時間枠を消費すると、一部だけ古い版になった lock を
install 直後の組合せへ復元し、条件を満たす直接依存の更新まで取り消していた。
また、復元用の固定を外した Cargo が不要な補助依存を取り除くと、
有効な lock でも install 直後の版がないことを理由に復元失敗としていた。

従来の60秒の復旧枠のうち最大40秒を使い、未解消の目標と成功済みの到達先を
同時に固定する最終解決を追加する。残り20秒は選択的な復元に確保する。
元の要件・install 前の下限・最終 age と OSV の検査は維持し、監査中の
外部変更を観測していれば全体を解き直さない。復旧自体の失敗も隠さない。

復元の主対象と補助依存を区別し、復元済みの対象から元の lock で到達できて
元の系列が残らない補助依存だけは除去を認める。主対象の欠落は引き続き拒否する。
実 cargo と偽レジストリで修正前の失敗を再現し、最終監査の成功と直接更新の保持、
補助依存の剪定、外部編集の保護を検証した。利用文書の英語版と日本語版も更新する。
@owayo owayo self-assigned this Nov 12, 2026
@coderabbitai

coderabbitai Bot commented Nov 12, 2026

Copy link
Copy Markdown

Important

  • Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 92e6ef62-d798-4ba3-9709-a6de6ef113e9
  • 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

@owayo
owayo merged commit 566759f into main Nov 12, 2026
8 checks passed
@owayo
owayo deleted the fix/issue-141-cargo-age-compatible-recovery branch November 12, 2026 03:02
owayo added a commit that referenced this pull request Nov 12, 2026
Cargo が受理する `= 1.*`、`^  1.x`、`~ 1.2.X` を読み飛ばしていた問題と、選択的復元で主対象の版が消える問題を修正します。

演算子付き wildcard の解析で半角スペースを許可し、更新後も演算子・空白・wildcard の形を保持します。タブや全角空白を新たに受理しません。マニフェストの解析、候補選択、書き戻し、再解析、再実行まで回帰テストで確認します。

選択的復元では、巻き戻しで追加した別系列の版(discarded)も再解決対象に含めます。広い版要求を持つ依存が旧系列を使い続けると、一時固定を外した際に主対象の復元先が不要として削除されていました。現在の lock に存在する crates.io の ID だけを取得元付きで重複なく指定し、独立した差し戻しと無関係な版を保持します。主対象と補助依存の区別、補助依存の剪定条件、元の場所での `--locked` 検証は維持します。

README、エコシステム、復元の説明は英日を更新し、8言語の公式仕様との監査記録を追加しました。既定の Cargo install のコマンドは変更しません。

検証:
- 修正前の wildcard の取りこぼしと、実物 Cargo+偽 local-registry による主対象の復元失敗を再現
- wildcard の round-trip と復元の回帰テストに成功。独立した差し戻し、重複 ID、既に消えた ID も確認
- 最新 main を取り込んだ後のローカル `make ci` が成功(fmt-check / clippy / 2,998件成功・失敗0件・既定の除外1件)
- `astro-sight` の最終差分レビューで API 変更・未使用シンボル・未解決の影響なし
- 最終 head の GitHub CI 全7ジョブ成功(Linux・macOS の Quality、配布対象5環境のビルド。Windows はテストを含む)

#141 の最終組合せ解決と補助依存剪定(#145)、pnpm の未対応引数の修正(#143)を取り込み済みです。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: 公開日検査の部分巻き戻しで依存解決が崩れ、適用可能な更新も取消になる

1 participant