Skip to content

fix: Swift の依存も --age の判定の前にタグの公開日を確かめる - #61

Merged
owayo merged 2 commits into
mainfrom
fix/issue-59-swift-release-dates-for-age
Oct 23, 2026
Merged

owayo merged 2 commits into
mainfrom
fix/issue-59-swift-release-dates-for-age

Conversation

@owayo

@owayo owayo commented Oct 23, 2026

Copy link
Copy Markdown
Owner

概要

Swift (Package.swift) の依存で --age が効かず、公開から期間がたっていない版へ更新していました (#59)。例: age が 2w のとき、stephencelis/SQLite.swift を 0.16.0 から、公開 3 日前の 0.17.0 へ「(release date unknown)」と表示しながら更新していました。この PR で、Swift でも age の判定に要る候補だけタグの公開日を取得し、ほかの言語と同じく期間内の版と公開日の分からない版を候補から外します。

原因

Swift の版の一覧は GitHub の Tags API から作りますが、タグの一覧には公開日がありません。judge は Swift について、公開日の無い版を age の判定で常に通していました (allow_undated)。Java (Maven) には、選んだ候補の公開日を後から取得して判定し直す仕組みがありますが、Swift にはありませんでした。

変更内容

  • judge: Swift を allow_undated の対象から外しました。age が有効なら、ほかのレジストリと同じく公開日の無い版を候補にしません。すべて分からなければ release date unavailable for <version> です。
  • orchestrator (resolve_tag_release_dates): age が有効なら、judge と同じ絞り込み (安定版・範囲の上限・reject・現在版より新しい・--max-change の内側) を通った候補を新しい順に見て公開日を取得し、期間を満たす版に当たったら止めます。それより古い版は問い合わせません。[age_exempt] の owner と、age が無効なときは取得しません。
  • 公開日の情報源 (GitHubTagsAdapter::fetch_release_date): そのタグの GitHub Release の published_at を使います。Release の無い (404 か published_at が null の) タグは、注釈付きタグの tagger.date で代えます。軽量タグは、指すコミットの日時がタグを打った日より古いことがあるので公開日不明とします。同じ版を表すタグが複数あるときは SwiftPM が使うタグ (区切りの多い方、同じなら小文字の v の無い方) で問い合わせます。順位が同じタグが残る版 (1.2.0 と V1.2.0) は、どちらが使われるか分からないので公開日不明とします。タグ名の + は %2B に符号化します。
  • GitHub API の消費: 問い合わせは 1 依存 5 回までです (未認証は 1 時間 60 回)。この実行で既に分かった公開日は数えません。上限に達したら古い版へは更新せず、新しい skip 理由 release date lookup limit reached; <version> and older not checked (JSON は release_date_unchecked: <version>) で止めます。
  • --max-change の内側に期間を満たす版が無いときは外側も現在版に近い順に確かめ、ほかの言語と同じく max-change=<LEVEL> と報告します。
  • 取得の失敗 (レート制限・通信・壊れた応答) は、公開日不明にせず fetch failed にします。
  • 公開日のキャッシュ (VersionFetcher::release_date) は、公開日が無いという答えも覚えます (Java は従来どおり公開日が無ければエラー)。
  • テスト用の HTTP サーバを test_support::http に移し、Maven と GitHub のアダプタのテストで共有しました (1 つ目のコミット)。
  • docs/usage.md・docs/ecosystems.md・docs/configuration.md とそれぞれの日本語版、AGENTS.md を更新しました。

設計判断

codex (gpt-6.1-sol) に設計と差分を相談しました。

  • Java の遅延取得 (judge を緩めて選び、選んだ版の日付を取り直す) を流用せず、候補の順を judge と共有する関数 (release_date_candidates) で作り、Swift の judge は厳しいまま使います。Swift では「公開日が無い」が正常系なので、緩い判定と厳しい判定を使い分けるより単純で、判定はほかのレジストリと同じになります。
  • 「調べて公開日が無かった」と「上限で調べていない」を分けました。上限で止まったときに古い版へ更新したり、公開日不明と表示したりしません。
  • Release を 1 件ずつ取る方式にしました。期間を満たす版が見つかれば 1 回で済み、問い合わせの上限も数えやすいためです。
  • 差分レビューの指摘 3 件を直しました。キャッシュ済みの公開日まで問い合わせの回数に数えていた点、SwiftPM の規則で決まらないタグの組に独自の順位を付けていた点、上限に達したときの文言から理由が分からなかった点です。

検証

  • make ci (fmt・clippy・全テスト): pass
  • 実際の GitHub API で Issue の例を確かめました: age 2w では更新しない (no suitable version)、age 1d では 0.17.0 へ更新し公開日 (2026/10/20 16:31) を表示 (Release の published_at と一致)、--no-age では公開日を取得しない
  • orchestrator のテスト (偽のアダプタ): 新しい順に取得して期間を満たす版で止まる / 最新が不明でも次へ進む / すべて不明 / すべて期間内 / 例外と age の無効では取得しない / 5 回目で見つかる / ちょうど 5 件がすべて不明 / 上限で止まる / --max-change の外側を確かめて max-change=patch と報告する / キャッシュ済みの公開日は数えない / 取得の失敗は fetch failed。修正前は、公開日を取得せずに最新版へ更新していました
  • アダプタのテスト (ローカルの HTTP サーバ): Release の公開日 / 注釈付きタグの日時 / 軽量タグ / published_at が null / + の符号化 / 順位が同じタグは問い合わせずに不明 / レート制限と壊れた日付をエラーにする / タグ名を知らないときに一覧を取り直す
  • judge のテスト: 候補の並びと、--max-change・プレリリース・範囲の上限での振り分け

Closes #59

🤖 Generated with Claude Code

@owayo owayo self-assigned this Oct 23, 2026
@coderabbitai

coderabbitai Bot commented Oct 23, 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: 982915e7-7a0a-4554-b18b-2c563c1f5116
  • 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.

owayo and others added 2 commits October 23, 2026 11:20
Maven Central のテストにあった、決めた応答を順に返す HTTP サーバ (serve_responses) を
test_support::http へ移す。次のコミットで GitHub Tags のアダプタのテストからも使う。

偽のコマンド (pnpm・mise・cargo・gradlew の代わりのシェルスクリプト) は、
test_support::exec::write_script で子プロセスに書かせる。テストが std::fs::write で
書いた直後のスクリプトを exec すると、並列に走るほかのテストの fork が、書き込み用の
fd の写しを exec までの間持っていることがあり、Linux は ETXTBSY (Text file busy) で
拒否する。PR の CI (ubuntu-latest) で、偽の pnpm を実行するテストがこれで落ちた。
本番のコードがパスを直接 exec するので、`sh <パス>` で読ませる形にはできない。
書いて実行させる全テストを置き換えた。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
GitHub のタグの一覧には公開日が無く、judge は Swift の日付の無い版を常に通していた。
そのため age が 2w でも、公開から 3 日の版へ `(release date unknown)` と表示しながら
更新していた (#59)。

judge は Swift でもほかのレジストリと同じく、age が有効なら日付の無い版を候補にしない。
その前に orchestrator が、judge と同じ絞り込みの候補を新しい順に見て公開日を取得し、
期間を満たす版に当たったら止める。公開日は SwiftPM が使うタグの GitHub Release の
published_at、Release の無い注釈付きタグは tagger.date で代える。軽量タグと、SwiftPM の
順位が同じ別のタグがある版は公開日不明にする。

問い合わせは 1 依存 5 回まで (この実行で解決済みの版は数えない) とし、上限に達したら
古い版へは更新せず、確かめていない版を示して skip にする (ReleaseDateUnchecked)。
--max-change の内側に期間を満たす版が無ければ外側も確かめ、ほかの言語と同じく
max-change で止まったと報告する。取得の失敗は公開日不明にせず FetchFailed にする。
age が無効なときと、age_exempt の owner では取得しない。公開日のキャッシュは、公開日が
無いという答えも覚える。

AGENTS.md には、前のコミットで足した偽のコマンドの書き方もテスト方針に書き足す。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@owayo
owayo force-pushed the fix/issue-59-swift-release-dates-for-age branch from 28ce80e to 0d8d54f Compare October 23, 2026 02:20
@owayo
owayo merged commit 04793b2 into main Oct 23, 2026
8 checks passed
@owayo
owayo deleted the fix/issue-59-swift-release-dates-for-age branch October 23, 2026 02:30
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.

Swift の依存は公開日を確かめずに更新し、age の期間内の版へ上げる

1 participant