Skip to content

Commit ea3461d

Browse files
Invalidate manifest cache when -Xbuild-tools-swiftc changes (#7760)
1 parent 4a233d7 commit ea3461d

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
@@ -569,6 +569,7 @@ public final class ManifestLoader: ManifestLoaderProtocol {
569569
toolsVersion: toolsVersion,
570570
env: Environment.current.cachable,
571571
swiftpmVersion: SwiftVersion.current.displayString,
572+
extraManifestFlags: self.extraManifestFlags,
572573
fileSystem: fileSystem
573574
)
574575
} catch {
@@ -1208,6 +1209,7 @@ extension ManifestLoader {
12081209
toolsVersion: ToolsVersion,
12091210
env: Environment,
12101211
swiftpmVersion: String,
1212+
extraManifestFlags: [String],
12111213
fileSystem: FileSystem
12121214
) throws {
12131215
let manifestContents = try fileSystem.readFileContents(manifestPath).contents
@@ -1217,6 +1219,7 @@ extension ManifestLoader {
12171219
manifestContents: manifestContents,
12181220
toolsVersion: toolsVersion,
12191221
env: env,
1222+
extraManifestFlags: extraManifestFlags,
12201223
swiftpmVersion: swiftpmVersion
12211224
)
12221225

@@ -1239,6 +1242,7 @@ extension ManifestLoader {
12391242
manifestContents: [UInt8],
12401243
toolsVersion: ToolsVersion,
12411244
env: Environment,
1245+
extraManifestFlags: [String],
12421246
swiftpmVersion: String
12431247
) throws -> String {
12441248
let stream = BufferedOutputByteStream()
@@ -1250,6 +1254,9 @@ extension ManifestLoader {
12501254
stream.send(key.rawValue).send(value)
12511255
}
12521256
stream.send(swiftpmVersion)
1257+
for flag in extraManifestFlags {
1258+
stream.send(flag)
1259+
}
12531260
return stream.bytes.sha256Checksum
12541261
}
12551262
}

Tests/PackageLoadingTests/ManifestLoaderCacheTests.swift

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

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

@@ -574,6 +636,7 @@ private func makeMockManifests(
574636
toolsVersion: ToolsVersion.current,
575637
env: [:],
576638
swiftpmVersion: SwiftVersion.current.displayString,
639+
extraManifestFlags: [],
577640
fileSystem: fileSystem
578641
)
579642
manifests[key] = ManifestLoader.EvaluationResult(

0 commit comments

Comments
 (0)