From 90dc6875693bec43ed042dc96cf08bc2ff4ef5b3 Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 12 Mar 2026 22:55:50 -0700 Subject: [PATCH] fix: propagate errors from asset modification date lookup --- Sources/XCDocsBridge/DocumentationAssetLocator.swift | 8 ++++---- Tests/XCDocsTests/DocumentationAssetLocatorTests.swift | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Sources/XCDocsBridge/DocumentationAssetLocator.swift b/Sources/XCDocsBridge/DocumentationAssetLocator.swift index 1142018..4585820 100644 --- a/Sources/XCDocsBridge/DocumentationAssetLocator.swift +++ b/Sources/XCDocsBridge/DocumentationAssetLocator.swift @@ -18,7 +18,7 @@ package struct DocumentationAssetLocator { let contents = try assetRootContents() let candidates = try contents.filter { $0.pathExtension == "asset" }.filter { try hasReadableIndex(at: $0) } - .sorted { lhs, rhs in modificationDate(for: lhs) > modificationDate(for: rhs) } + .sorted { lhs, rhs in try modificationDate(for: lhs) > modificationDate(for: rhs) } guard let assetURL = candidates.first else { throw BridgeError( @@ -98,8 +98,8 @@ package struct DocumentationAssetLocator { return nsError.code == NSFileNoSuchFileError || nsError.code == NSFileReadNoSuchFileError } - private func modificationDate(for url: URL) -> Date { - let resourceValues = try? url.resourceValues(forKeys: [.contentModificationDateKey]) - return resourceValues?.contentModificationDate ?? .distantPast + package func modificationDate(for url: URL) throws -> Date { + let resourceValues = try url.resourceValues(forKeys: [.contentModificationDateKey]) + return resourceValues.contentModificationDate ?? .distantPast } } diff --git a/Tests/XCDocsTests/DocumentationAssetLocatorTests.swift b/Tests/XCDocsTests/DocumentationAssetLocatorTests.swift index 0d805fb..4798a79 100644 --- a/Tests/XCDocsTests/DocumentationAssetLocatorTests.swift +++ b/Tests/XCDocsTests/DocumentationAssetLocatorTests.swift @@ -163,6 +163,14 @@ struct DocumentationAssetLocatorTests { #expect(error.code == .assetNotFound) } + @Test + func propagatesErrorWhenModificationDateLookupFails() throws { + let nonexistentURL = URL(fileURLWithPath: "/tmp/nonexistent-\(UUID().uuidString).asset") + let locator = DocumentationAssetLocator() + + #expect(throws: (any Error).self) { try locator.modificationDate(for: nonexistentURL) } + } + @Test func selectsTheNewestValidAsset() throws { let rootURL = try makeTemporaryDirectory()