V2.0.0 alpha.3#85
Conversation
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
PR Review: V2.0.0 alpha.3This PR combines CI/CD infrastructure updates, a Mint→mise tooling migration, and several WatchConnectivity bug fixes. The infrastructure changes look well-considered; the WatchConnectivity fixes address real issues but have a correctness concern worth addressing before merging. Thread Safety:
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #85 +/- ##
==========================================
- Coverage 65.66% 65.47% -0.19%
==========================================
Files 32 32
Lines 533 533
==========================================
- Hits 350 349 -1
- Misses 183 184 +1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Code Review: V2.0.0 alpha.3Summary: This PR covers CI/tooling infrastructure upgrades (Xcode 26.5, CodeQL v4, mise tool updates) alongside three behavioral fixes in ✅ Good ChangesDelegate registration moved to One-shot reply handler guard (intent is correct) CI matrix expansion — testing against Xcode 26.1, 26.5, and 16.4 simultaneously is good coverage. Documenting why Android API 36 was dropped is appreciated. Tooling migrations — swiftlint → aqua provider and periphery 3.7.4 are reasonable upgrades. 🐛 Critical Bug: Auto-acknowledge bypasses the guardIn both // WatchConnectivitySession+WCSessionDelegate.swift (message path ~line 1237)
var replied = false
let safeReply: ([String: Any]) -> Void = { response in
guard !replied else { return }
replied = true
replyHandler(response) // ← sets replied = true
}
let handler = unsafeBitCast(safeReply, to: ConnectivityHandler.self)
delegate?.session(self, didReceiveMessage: sendableMessage, replyHandler: handler)
if !replied {
replyHandler([:]) // ← bypasses safeReply, does NOT set replied = true
}When the delegate stores
The fix: call // Correct fix — same one-shot guarantee applies to auto-ack:
if !replied {
safeReply([:]) // or safeReply(Data()) for the data path
}This applies identically to the binary
|
No description provided.