Conversation
Bump swift-tools-version to 6.4 and move CI to the xcode-27 runner image. The Linux job uses the 6.4 release-branch nightly until the official swift:6.4 image is published. No source changes were needed: the package builds without warnings and passes all tests under Swift 6.4.
swift-snapshot-testing's perceptual comparison passes a bare CGRect as CIAreaAverage's inputExtent, which Core Image on macOS 27 rejects with an uncaught -[NSConcreteValue CGRectValue] exception, killing the whole TortoiseUITests process on the xcode-27 runner. Byte-wise comparison with the same 0.995 precision never enters that path.
SwiftPM in Xcode 27 builds one .xctest bundle per test target instead of a single TortoiseGraphicsPackageTests.xctest, so the lcov export failed with "No such file or directory" after all tests had passed. Pass each bundle's binary to llvm-cov with -object.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #48 +/- ##
=======================================
Coverage 93.76% 93.76%
=======================================
Files 16 16
Lines 946 946
=======================================
Hits 887 887
Misses 59 59 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
3 tasks
Owner
Author
The 6.4 release-branch nightly was a stand-in until Docker Hub published swift:6.4, which it now has.
5 tasks done
temoki
added a commit
that referenced
this pull request
Sep 21, 2026
swift-snapshot-testing 1.19.6 fixes the crash that forced byte-wise comparison in #48: the perceptual path passed a bare CGRect as CIAreaAverage's inputExtent, which Core Image on macOS 27 rejected with an uncaught -[NSConcreteValue CGRectValue] exception, killing the whole test process (pointfreeco/swift-snapshot-testing#1120). Floor the dependency at 1.19.6 rather than leaving it at 1.18.0. The perceptual path is only reached when bytes differ, so an older resolution would keep passing locally and crash wherever antialiasing drifts. Verified on macOS 27.0 (26A428) / Xcode 27.0 (27A266a) — the combination that crashed — by passing two deliberately different renders through Snapshotting.canvasGolden.diffing.diff, which now reports a difference instead of taking down the process. A green suite alone would not have shown this: the goldens match byte for byte on the machine that recorded them, so the perceptual path never runs. The goldens themselves are unchanged; perceptual comparison is strictly more permissive than the byte-wise one they were recorded against.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
マージは保留中です。 Xcode 27 が正式にリリースされ、GitHub の macOS ランナーにも正式版が入ってから、CI を回し直して再確認します(#49 の検証もそのときに行います)。Xcode 27 RC版が macOS Runnerに入った。概要
Xcode 27(Swift 6.4)への移行です。
swift-tools-versionを 6.4 に上げ、CI も Xcode 27 に移します。ライブラリのソースコードは変えていません。 Xcode 27 RC(Swift 6.4)で、警告もエラーもなくビルドできました。変えたのは、CI を Xcode 27 ランナー(macOS 27)で動かすためのテストと CI 設定です(下の「CI を通すための修正」を参照)。
利用者への影響
Unreleasedのままです。次のバージョン番号はリリース時に決めます。変更内容
Package.swiftswift-tools-version: 6.2→6.4ci.yml/docs.ymlmacos-15→xcode-27ランナーへselect-xcode/action.yml26→27ci.yml(linux)swift:6.2→swiftlang/swift:nightly-6.4.x-nobleci.yml(カバレッジ).xctestをすべて llvm-cov に渡すCanvasGoldenSnapshotting.swift(新規).canvasGoldenとして 1 か所に定義CI を通すための修正
1. PNG ゴールデンの比較で、テストプロセスごとクラッシュする
TortoiseUITestsが-[NSConcreteValue CGRectValue]: unrecognized selectorで異常終了していました。CIAreaAverageのinputExtentにCIVectorではなくCGRectをそのまま渡しています。macOS 26 までの Core Image はこれを受け付けましたが、macOS 27 では例外になります。perceptualPrecision: 0.98をやめ、バイト単位の比較(precision: 0.995)にしました。許容誤差は、ずれてよいバイトが 0.5% までです。上流のフォークをブランチ指定で依存に入れる方法は、このパッケージをバージョン指定で使う利用者の依存解決を壊すので採りませんでした。2. カバレッジの出力で失敗する
Xcode 27 の SwiftPM は、テスト対象ごとに
.xctestバンドル(TortoiseCoreTests/TortoiseSVGTests/TortoiseUITests)を作ります。以前の単一のTortoiseGraphicsPackageTests.xctestがなくなったので、全バンドルを-objectで llvm-cov に渡すようにしました。ローカルで出力した lcov に、3 モジュールすべてのソースが含まれることを確認しています。残っている注意点
swift:6.4イメージが Docker Hub にまだないので、それまで 6.4 リリースブランチのナイトリーを使います。公式イメージが出たら差し替えます(TODO コメントあり)。xcode-27ランナーに入っているのは現在 Xcode 27 beta 6 です。CI ではXcode_27.0.0.app(beta 6 へのシンボリックリンク)が選ばれています。確認
swift test全件パス、swift build -c release、swift-format lint --strict