Skip to content

Commit 228e25b

Browse files
[6.0] Invalidate manifest cache when -Xbuild-tools-swiftc changes (#7762)
1 parent 8e68e07 commit 228e25b

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

Sources/PackageLoading/ManifestLoader.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,7 @@ public final class ManifestLoader: ManifestLoaderProtocol {
568568
toolsVersion: toolsVersion,
569569
env: Environment.current.cachable,
570570
swiftpmVersion: SwiftVersion.current.displayString,
571+
extraManifestFlags: self.extraManifestFlags,
571572
fileSystem: fileSystem
572573
)
573574
} catch {
@@ -1207,6 +1208,7 @@ extension ManifestLoader {
12071208
toolsVersion: ToolsVersion,
12081209
env: Environment,
12091210
swiftpmVersion: String,
1211+
extraManifestFlags: [String],
12101212
fileSystem: FileSystem
12111213
) throws {
12121214
let manifestContents = try fileSystem.readFileContents(manifestPath).contents
@@ -1216,6 +1218,7 @@ extension ManifestLoader {
12161218
manifestContents: manifestContents,
12171219
toolsVersion: toolsVersion,
12181220
env: env,
1221+
extraManifestFlags: extraManifestFlags,
12191222
swiftpmVersion: swiftpmVersion
12201223
)
12211224

@@ -1238,6 +1241,7 @@ extension ManifestLoader {
12381241
manifestContents: [UInt8],
12391242
toolsVersion: ToolsVersion,
12401243
env: Environment,
1244+
extraManifestFlags: [String],
12411245
swiftpmVersion: String
12421246
) throws -> String {
12431247
let stream = BufferedOutputByteStream()
@@ -1249,6 +1253,9 @@ extension ManifestLoader {
12491253
stream.send(key.rawValue).send(value)
12501254
}
12511255
stream.send(swiftpmVersion)
1256+
for flag in extraManifestFlags {
1257+
stream.send(flag)
1258+
}
12521259
return stream.bytes.sha256Checksum
12531260
}
12541261
}

Tests/PackageLoadingTests/ManifestLoaderCacheTests.swift

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,68 @@ final class ManifestLoaderCacheTests: XCTestCase {
269269
}
270270
}
271271

272+
func testCacheInvalidateOnBuildToolsFlags() async throws {
273+
try UserToolchain.default.skipUnlessAtLeastSwift6()
274+
275+
try await testWithTemporaryDirectory { path in
276+
let fileSystem = InMemoryFileSystem()
277+
let observability = ObservabilitySystem.makeForTesting()
278+
279+
let manifestPath = path.appending(components: "pkg", "Package.swift")
280+
try fileSystem.createDirectory(manifestPath.parentDirectory, recursive: true)
281+
try fileSystem.writeFileContents(
282+
manifestPath,
283+
string: """
284+
import PackageDescription
285+
let package = Package(
286+
name: "Trivial",
287+
targets: [
288+
.target(
289+
name: "foo",
290+
dependencies: []),
291+
]
292+
)
293+
#if TEST_BUILD_FLAG
294+
package.targets[0].name = "bar"
295+
#endif
296+
"""
297+
)
298+
299+
try await check(expectCached: false, extraManifestFlags: [], targetName: "foo")
300+
try await check(expectCached: true, extraManifestFlags: [], targetName: "foo")
301+
// Cache key should take into account the extra flags.
302+
try await check(expectCached: false, extraManifestFlags: ["-DTEST_BUILD_FLAG"], targetName: "bar")
303+
try await check(expectCached: true, extraManifestFlags: ["-DTEST_BUILD_FLAG"], targetName: "bar")
304+
// Cache should hit after back to original flags.
305+
try await check(expectCached: true, extraManifestFlags: [], targetName: "foo")
306+
307+
func check(expectCached: Bool, extraManifestFlags: [String], targetName: String) async throws {
308+
let delegate = ManifestTestDelegate()
309+
310+
let loader = ManifestLoader(
311+
toolchain: try UserToolchain.default,
312+
cacheDir: path,
313+
extraManifestFlags: extraManifestFlags,
314+
delegate: delegate
315+
)
316+
317+
let manifest = try await XCTAsyncUnwrap(try await loader.load(
318+
manifestPath: manifestPath,
319+
packageKind: .root(manifestPath.parentDirectory),
320+
toolsVersion: .current,
321+
fileSystem: fileSystem,
322+
observabilityScope: observability.topScope
323+
))
324+
325+
XCTAssertNoDiagnostics(observability.diagnostics)
326+
try await XCTAssertAsyncEqual(try await delegate.loaded(timeout: .seconds(1)), [manifestPath])
327+
try await XCTAssertAsyncEqual(try await delegate.parsed(timeout: .seconds(1)).count, expectCached ? 0 : 1)
328+
XCTAssertEqual(manifest.displayName, "Trivial")
329+
XCTAssertEqual(manifest.targets[0].name, targetName)
330+
}
331+
}
332+
}
333+
272334
func testCacheInvalidationOnEnv() async throws {
273335
try UserToolchain.default.skipUnlessAtLeastSwift6()
274336

@@ -576,6 +638,7 @@ private func makeMockManifests(
576638
toolsVersion: ToolsVersion.current,
577639
env: [:],
578640
swiftpmVersion: SwiftVersion.current.displayString,
641+
extraManifestFlags: [],
579642
fileSystem: fileSystem
580643
)
581644
manifests[key] = ManifestLoader.EvaluationResult(

0 commit comments

Comments
 (0)