From 283fbf00fdffd64c924b6cb22c84e803b718f078 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Fri, 7 Aug 2026 17:33:46 -0500 Subject: Adopt Swift 6 language mode Flip SWIFT_VERSION to 6.0 (keeping SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor) and resolve every resulting diagnostic. Mechanical, no behaviour change: - Models: pure value types in Models/ and utility extensions (Date, DateFormatter, SRHTWebURL) marked nonisolated so the nonisolated networking layer can use them. - App Intents: stored 'static var' (title/description/openAppWhenRun/ typeDisplayRepresentation/defaultQuery/caseDisplayRepresentations) -> 'static let'; drop the invalid @retroactive on the in-module LookupType: AppEnum. - Sendable dicts: 'nil as String? as Any' -> 'nil as String? as any Sendable'. - UserDefaults: retroactive @unchecked Sendable (documented thread-safe). - WidgetKit completion handlers rebound nonisolated(unsafe) to cross into Task {}; TipStoreViewModel task handle is @ObservationIgnored nonisolated(unsafe) for its nonisolated deinit. - Tests run on @MainActor; a few constant fixtures marked nonisolated for use in @Sendable stub closures. Builds and the full suite are clean in Swift 6 mode. Roadmap updated. --- HutchTests/APICacheTests.swift | 1 + HutchTests/AppStateTests.swift | 1 + HutchTests/BuildListViewModelTests.swift | 1 + HutchTests/BuildTaskLogSearchTests.swift | 1 + HutchTests/BuildTaskTests.swift | 1 + HutchTests/BundleUserAgentTests.swift | 1 + HutchTests/ContributionCalendarTests.swift | 1 + HutchTests/DeepLinkTests.swift | 1 + HutchTests/GitObjectTests.swift | 1 + HutchTests/HomeViewModelTests.swift | 1 + HutchTests/HutchTests.swift | 1 + HutchTests/InboxViewModelTests.swift | 1 + HutchTests/LookupHistoryStoreTests.swift | 1 + HutchTests/MailingListActivityTests.swift | 1 + HutchTests/ManPageCatalogTests.swift | 1 + HutchTests/PatchsetTests.swift | 2 ++ HutchTests/ProjectFormTests.swift | 1 + HutchTests/ProjectPinStoreTests.swift | 1 + HutchTests/ProjectTests.swift | 1 + HutchTests/ReadmeViewTests.swift | 5 +++++ HutchTests/RecentActivityStoreTests.swift | 1 + HutchTests/RepositoryACLViewModelTests.swift | 1 + HutchTests/RepositoryDeployKeyTests.swift | 1 + HutchTests/RepositoryListViewModelTests.swift | 1 + HutchTests/RepositorySettingsViewModelTests.swift | 1 + HutchTests/SRHTClientTests.swift | 1 + HutchTests/SRHTWebURLTests.swift | 1 + HutchTests/ScopedSearchHistoryStoreTests.swift | 1 + HutchTests/SettingsViewModelTests.swift | 1 + HutchTests/SettingsViewTests.swift | 1 + HutchTests/SourceHutWebDeepLinkMapperTests.swift | 1 + HutchTests/SyntaxHighlighterTests.swift | 9 ++++----- HutchTests/SystemStatusRepositoryTests.swift | 9 +++++---- HutchTests/SystemStatusServiceTests.swift | 1 + HutchTests/TicketBulkActionTests.swift | 1 + HutchTests/TicketDetailViewModelTests.swift | 1 + HutchTests/TicketSavedFilterStoreTests.swift | 1 + HutchTests/TipStoreViewModelTests.swift | 1 + HutchTests/TrackerListViewModelTests.swift | 1 + HutchTests/TrackerManagementViewModelTests.swift | 1 + 40 files changed, 52 insertions(+), 9 deletions(-) (limited to 'HutchTests') diff --git a/HutchTests/APICacheTests.swift b/HutchTests/APICacheTests.swift index 24db870..9a93783 100644 --- a/HutchTests/APICacheTests.swift +++ b/HutchTests/APICacheTests.swift @@ -3,6 +3,7 @@ import Testing @testable import Hutch @Suite(.serialized) +@MainActor struct APICacheTests { private struct Payload: Codable, Sendable, Equatable { let value: String diff --git a/HutchTests/AppStateTests.swift b/HutchTests/AppStateTests.swift index b7e1755..49baa17 100644 --- a/HutchTests/AppStateTests.swift +++ b/HutchTests/AppStateTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct AppStateTests { @Test diff --git a/HutchTests/BuildListViewModelTests.swift b/HutchTests/BuildListViewModelTests.swift index 8ee5b81..9b64621 100644 --- a/HutchTests/BuildListViewModelTests.swift +++ b/HutchTests/BuildListViewModelTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct BuildListViewModelTests { @Test diff --git a/HutchTests/BuildTaskLogSearchTests.swift b/HutchTests/BuildTaskLogSearchTests.swift index 4cb9984..8c7ddc2 100644 --- a/HutchTests/BuildTaskLogSearchTests.swift +++ b/HutchTests/BuildTaskLogSearchTests.swift @@ -1,6 +1,7 @@ import Testing @testable import Hutch +@MainActor struct BuildTaskLogSearchTests { @Test diff --git a/HutchTests/BuildTaskTests.swift b/HutchTests/BuildTaskTests.swift index 2e2a1e0..c7baae7 100644 --- a/HutchTests/BuildTaskTests.swift +++ b/HutchTests/BuildTaskTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct BuildTaskTests { @Test diff --git a/HutchTests/BundleUserAgentTests.swift b/HutchTests/BundleUserAgentTests.swift index c1a20b8..a4bda55 100644 --- a/HutchTests/BundleUserAgentTests.swift +++ b/HutchTests/BundleUserAgentTests.swift @@ -40,6 +40,7 @@ private final class CapturingURLProtocol: URLProtocol, @unchecked Sendable { /// Tests are serialized because CapturingURLProtocol uses shared static state. @Suite(.serialized) +@MainActor struct BundleUserAgentTests { // MARK: Bundle extension diff --git a/HutchTests/ContributionCalendarTests.swift b/HutchTests/ContributionCalendarTests.swift index 0328ad5..e5d625a 100644 --- a/HutchTests/ContributionCalendarTests.swift +++ b/HutchTests/ContributionCalendarTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct ContributionCalendarTests { @Test diff --git a/HutchTests/DeepLinkTests.swift b/HutchTests/DeepLinkTests.swift index cdc5bab..dc4f605 100644 --- a/HutchTests/DeepLinkTests.swift +++ b/HutchTests/DeepLinkTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct DeepLinkTests { @Test diff --git a/HutchTests/GitObjectTests.swift b/HutchTests/GitObjectTests.swift index 547c6f3..3546d11 100644 --- a/HutchTests/GitObjectTests.swift +++ b/HutchTests/GitObjectTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct GitObjectTests { @Test diff --git a/HutchTests/HomeViewModelTests.swift b/HutchTests/HomeViewModelTests.swift index 851b520..a050931 100644 --- a/HutchTests/HomeViewModelTests.swift +++ b/HutchTests/HomeViewModelTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct HomeViewModelTests { @Test diff --git a/HutchTests/HutchTests.swift b/HutchTests/HutchTests.swift index c681efa..98c68d3 100644 --- a/HutchTests/HutchTests.swift +++ b/HutchTests/HutchTests.swift @@ -7,6 +7,7 @@ import Testing +@MainActor struct HutchTests { @Test func example() async throws { diff --git a/HutchTests/InboxViewModelTests.swift b/HutchTests/InboxViewModelTests.swift index 5780b6a..9c35001 100644 --- a/HutchTests/InboxViewModelTests.swift +++ b/HutchTests/InboxViewModelTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct InboxViewModelTests { @Test diff --git a/HutchTests/LookupHistoryStoreTests.swift b/HutchTests/LookupHistoryStoreTests.swift index 414d016..af7c69b 100644 --- a/HutchTests/LookupHistoryStoreTests.swift +++ b/HutchTests/LookupHistoryStoreTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct LookupHistoryStoreTests { @Test diff --git a/HutchTests/MailingListActivityTests.swift b/HutchTests/MailingListActivityTests.swift index 46208cb..61a7e77 100644 --- a/HutchTests/MailingListActivityTests.swift +++ b/HutchTests/MailingListActivityTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct MailingListActivityTests { @Test diff --git a/HutchTests/ManPageCatalogTests.swift b/HutchTests/ManPageCatalogTests.swift index df995f8..e6bd2fc 100644 --- a/HutchTests/ManPageCatalogTests.swift +++ b/HutchTests/ManPageCatalogTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct ManPageCatalogTests { @Test func loadsBundledCatalog() { diff --git a/HutchTests/PatchsetTests.swift b/HutchTests/PatchsetTests.swift index 945131f..e181f14 100644 --- a/HutchTests/PatchsetTests.swift +++ b/HutchTests/PatchsetTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct PatchsetStatusTests { @Test @@ -46,6 +47,7 @@ struct PatchsetStatusTests { } } +@MainActor struct PatchsetSummaryTests { @Test diff --git a/HutchTests/ProjectFormTests.swift b/HutchTests/ProjectFormTests.swift index a4b4dfa..3e1fffc 100644 --- a/HutchTests/ProjectFormTests.swift +++ b/HutchTests/ProjectFormTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct ProjectFormTests { @Test func parsesTagsSplittingAndTrimming() { diff --git a/HutchTests/ProjectPinStoreTests.swift b/HutchTests/ProjectPinStoreTests.swift index 13df539..c040868 100644 --- a/HutchTests/ProjectPinStoreTests.swift +++ b/HutchTests/ProjectPinStoreTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct ProjectPinStoreTests { @Test func storesPinnedProjectsPerUser() { diff --git a/HutchTests/ProjectTests.swift b/HutchTests/ProjectTests.swift index 23faa0d..785c98f 100644 --- a/HutchTests/ProjectTests.swift +++ b/HutchTests/ProjectTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct ProjectTests { private enum Fixture { static let exampleWebsite = "https://example.com" diff --git a/HutchTests/ReadmeViewTests.swift b/HutchTests/ReadmeViewTests.swift index 9e053b8..96eb8c0 100644 --- a/HutchTests/ReadmeViewTests.swift +++ b/HutchTests/ReadmeViewTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct ReadmeViewTests { @Test @@ -28,6 +29,7 @@ struct ReadmeViewTests { } } +@MainActor struct MarkdownRenderingTests { @Test @@ -219,6 +221,7 @@ struct MarkdownRenderingTests { } } +@MainActor struct OrgRenderingTests { @Test @@ -376,6 +379,7 @@ struct OrgRenderingTests { } } +@MainActor struct RepositoryAssetURLTests { @Test @@ -391,6 +395,7 @@ struct RepositoryAssetURLTests { } } +@MainActor struct RepositoryLinkURLTests { @Test diff --git a/HutchTests/RecentActivityStoreTests.swift b/HutchTests/RecentActivityStoreTests.swift index e6fcc04..7713e6d 100644 --- a/HutchTests/RecentActivityStoreTests.swift +++ b/HutchTests/RecentActivityStoreTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct RecentActivityStoreTests { @Test func removeDropsMatchingEntryKeepingOthers() { diff --git a/HutchTests/RepositoryACLViewModelTests.swift b/HutchTests/RepositoryACLViewModelTests.swift index 9640b93..501074c 100644 --- a/HutchTests/RepositoryACLViewModelTests.swift +++ b/HutchTests/RepositoryACLViewModelTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct RepositoryACLViewModelTests { @Test diff --git a/HutchTests/RepositoryDeployKeyTests.swift b/HutchTests/RepositoryDeployKeyTests.swift index c6ff667..d7a0dad 100644 --- a/HutchTests/RepositoryDeployKeyTests.swift +++ b/HutchTests/RepositoryDeployKeyTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct RepositoryDeployKeyTests { @Test func decodesDeployKey() throws { diff --git a/HutchTests/RepositoryListViewModelTests.swift b/HutchTests/RepositoryListViewModelTests.swift index 5fe3974..7787fca 100644 --- a/HutchTests/RepositoryListViewModelTests.swift +++ b/HutchTests/RepositoryListViewModelTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct RepositoryListViewModelTests { @Test diff --git a/HutchTests/RepositorySettingsViewModelTests.swift b/HutchTests/RepositorySettingsViewModelTests.swift index 13d0b21..25e46c9 100644 --- a/HutchTests/RepositorySettingsViewModelTests.swift +++ b/HutchTests/RepositorySettingsViewModelTests.swift @@ -10,6 +10,7 @@ private struct UpdateRepositoryInfoPayload: Decodable { let id: Int } +@MainActor struct RepositorySettingsViewModelTests { @Test diff --git a/HutchTests/SRHTClientTests.swift b/HutchTests/SRHTClientTests.swift index 12d6d0f..51b6a68 100644 --- a/HutchTests/SRHTClientTests.swift +++ b/HutchTests/SRHTClientTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct SRHTClientTests { @Test diff --git a/HutchTests/SRHTWebURLTests.swift b/HutchTests/SRHTWebURLTests.swift index d1053e6..f20f964 100644 --- a/HutchTests/SRHTWebURLTests.swift +++ b/HutchTests/SRHTWebURLTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct SRHTWebURLTests { private enum Expected { static let chatOrigin = "https://chat.sr.ht" diff --git a/HutchTests/ScopedSearchHistoryStoreTests.swift b/HutchTests/ScopedSearchHistoryStoreTests.swift index 856d69f..8effa06 100644 --- a/HutchTests/ScopedSearchHistoryStoreTests.swift +++ b/HutchTests/ScopedSearchHistoryStoreTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct ScopedSearchHistoryStoreTests { @Test diff --git a/HutchTests/SettingsViewModelTests.swift b/HutchTests/SettingsViewModelTests.swift index 906f33f..e88d064 100644 --- a/HutchTests/SettingsViewModelTests.swift +++ b/HutchTests/SettingsViewModelTests.swift @@ -64,6 +64,7 @@ private struct DeleteResultPayload: Decodable { } @Suite(.serialized) +@MainActor struct SettingsViewModelTests { @Test diff --git a/HutchTests/SettingsViewTests.swift b/HutchTests/SettingsViewTests.swift index 950c3dc..f0f7fc1 100644 --- a/HutchTests/SettingsViewTests.swift +++ b/HutchTests/SettingsViewTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct SettingsViewTests { @Test diff --git a/HutchTests/SourceHutWebDeepLinkMapperTests.swift b/HutchTests/SourceHutWebDeepLinkMapperTests.swift index 0fa3aaa..2c638c2 100644 --- a/HutchTests/SourceHutWebDeepLinkMapperTests.swift +++ b/HutchTests/SourceHutWebDeepLinkMapperTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct SourceHutWebDeepLinkMapperTests { @Test func mapsRepositoryURLs() { diff --git a/HutchTests/SyntaxHighlighterTests.swift b/HutchTests/SyntaxHighlighterTests.swift index 258e81e..3150814 100644 --- a/HutchTests/SyntaxHighlighterTests.swift +++ b/HutchTests/SyntaxHighlighterTests.swift @@ -3,6 +3,7 @@ import Testing import UIKit @testable import Hutch +@MainActor struct SyntaxHighlighterTests { @Test func mapsFileNamesToLanguages() { @@ -24,9 +25,8 @@ struct SyntaxHighlighterTests { let highlighter = SyntaxHighlighter(theme: .light) let html = highlighter.highlightedHTML(for: "let answer = 42", language: "swift") - let unwrapped = try? #require(html) - #expect(unwrapped?.contains(" git.sr.ht Disrupted """# - static let cachedOperationalHTML = #""" + nonisolated static let cachedOperationalHTML = #"""
meta.sr.ht Operational
"""# - static let cachedIncidentRSS = #""" + nonisolated static let cachedIncidentRSS = #""" @@ -139,7 +140,7 @@ private extension SystemStatusRepositoryTests { """# - static let emptyRSS = #""" + nonisolated static let emptyRSS = #""" diff --git a/HutchTests/SystemStatusServiceTests.swift b/HutchTests/SystemStatusServiceTests.swift index d963fa4..9a7af1f 100644 --- a/HutchTests/SystemStatusServiceTests.swift +++ b/HutchTests/SystemStatusServiceTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct SystemStatusServiceTests { private enum Fixture { static let ddosIssueURL = "https://status.sr.ht/issues/2026-04-06-ddos-attack/" diff --git a/HutchTests/TicketBulkActionTests.swift b/HutchTests/TicketBulkActionTests.swift index 2f4d1fd..2c1d738 100644 --- a/HutchTests/TicketBulkActionTests.swift +++ b/HutchTests/TicketBulkActionTests.swift @@ -1,6 +1,7 @@ import Testing @testable import Hutch +@MainActor struct TicketBulkActionTests { @Test diff --git a/HutchTests/TicketDetailViewModelTests.swift b/HutchTests/TicketDetailViewModelTests.swift index ba4a476..d2c0c8e 100644 --- a/HutchTests/TicketDetailViewModelTests.swift +++ b/HutchTests/TicketDetailViewModelTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct TicketDetailViewModelTests { @Test diff --git a/HutchTests/TicketSavedFilterStoreTests.swift b/HutchTests/TicketSavedFilterStoreTests.swift index 2ff64e6..cfdcba6 100644 --- a/HutchTests/TicketSavedFilterStoreTests.swift +++ b/HutchTests/TicketSavedFilterStoreTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct TicketSavedFilterStoreTests { @Test diff --git a/HutchTests/TipStoreViewModelTests.swift b/HutchTests/TipStoreViewModelTests.swift index ed58d1e..734a7cc 100644 --- a/HutchTests/TipStoreViewModelTests.swift +++ b/HutchTests/TipStoreViewModelTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct TipStoreViewModelTests { @Test diff --git a/HutchTests/TrackerListViewModelTests.swift b/HutchTests/TrackerListViewModelTests.swift index 5c57e04..85b051f 100644 --- a/HutchTests/TrackerListViewModelTests.swift +++ b/HutchTests/TrackerListViewModelTests.swift @@ -2,6 +2,7 @@ import Foundation import Testing @testable import Hutch +@MainActor struct TrackerListViewModelTests { @Test diff --git a/HutchTests/TrackerManagementViewModelTests.swift b/HutchTests/TrackerManagementViewModelTests.swift index 531608c..211c838 100644 --- a/HutchTests/TrackerManagementViewModelTests.swift +++ b/HutchTests/TrackerManagementViewModelTests.swift @@ -1,6 +1,7 @@ import Testing @testable import Hutch +@MainActor struct TrackerManagementViewModelTests { @Test -- cgit v1.2.3