Skip to content

Commit d3892d5

Browse files
committed
[Workspace] Fix a precomputation bug when moving from version to revision
Previously, we didn't detect if we moved from version to a revision that pointed to the same SHA as the previous version. <rdar://problem/57965934>
1 parent 2976977 commit d3892d5

File tree

3 files changed

+60
-8
lines changed

3 files changed

+60
-8
lines changed

Sources/Workspace/ResolverPrecomputationProvider.swift

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,16 +142,18 @@ private struct LocalPackageContainer: PackageContainer {
142142
}
143143

144144
func getDependencies(at revision: String) throws -> [PackageContainerConstraint] {
145-
// Throw an error when the dependency is not at the correct revision to fail resolution.
146-
guard dependency?.checkoutState?.revision.identifier == revision else {
147-
throw ResolverPrecomputationError.differentRequirement(
148-
package: package,
149-
state: dependency?.state,
150-
requirement: .revision(revision)
151-
)
145+
// Return the dependencies if the checkout state matches the revision.
146+
if let checkoutState = dependency?.checkoutState,
147+
checkoutState.version == nil,
148+
checkoutState.revision.identifier == revision {
149+
return manifest.dependencyConstraints(config: config)
152150
}
153151

154-
return manifest.dependencyConstraints(config: config)
152+
throw ResolverPrecomputationError.differentRequirement(
153+
package: self.package,
154+
state: self.dependency?.state,
155+
requirement: .revision(revision)
156+
)
155157
}
156158

157159
func getUnversionedDependencies() throws -> [PackageContainerConstraint] {

Tests/WorkspaceTests/WorkspaceTests.swift

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,55 @@ final class WorkspaceTests: XCTestCase {
908908
)
909909
}
910910

911+
func testPrecomputeResolution_requirementChange_versionToRevision() throws {
912+
let sandbox = AbsolutePath("/tmp/ws/")
913+
let fs = InMemoryFileSystem()
914+
let cPath = RelativePath("C")
915+
let v1_5 = CheckoutState(revision: Revision(identifier: "hello"), version: "1.0.5")
916+
917+
let testWorkspace = try TestWorkspace(
918+
sandbox: sandbox,
919+
fs: fs,
920+
roots: [
921+
TestPackage(
922+
name: "A",
923+
targets: [TestTarget(name: "A")],
924+
products: [],
925+
dependencies: [
926+
TestDependency(name: "C", requirement: .revision("hello")),
927+
]
928+
),
929+
],
930+
packages: [
931+
TestPackage(
932+
name: "C",
933+
targets: [TestTarget(name: "C")],
934+
products: [TestProduct(name: "C", targets: ["C"])],
935+
versions: [nil, "1.0.0", "1.0.5", "2.0.0"]
936+
)
937+
]
938+
)
939+
940+
let cRepo = RepositorySpecifier(url: testWorkspace.urlForPackage(withName: "C"))
941+
let cRef = PackageReference(identity: "c", path: cRepo.url)
942+
943+
try testWorkspace.checkPrecomputeResolution(
944+
pins: [cRef: v1_5],
945+
managedDependencies: [
946+
ManagedDependency(packageRef: cRef, subpath: cPath, checkoutState: v1_5),
947+
],
948+
{ result in
949+
XCTAssertEqual(result.diagnostics.hasErrors, false)
950+
XCTAssertEqual(result.result, .required(reason: .packageRequirementChange(
951+
package: cRef,
952+
state: .checkout(v1_5),
953+
requirement: .revision("hello")
954+
)))
955+
}
956+
)
957+
}
958+
959+
911960
func testPrecomputeResolution_requirementChange_localToBranch() throws {
912961
let sandbox = AbsolutePath("/tmp/ws/")
913962
let fs = InMemoryFileSystem()

Tests/WorkspaceTests/XCTestManifests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ extension WorkspaceTests {
8080
("testPrecomputeResolution_requirementChange_localToBranch", testPrecomputeResolution_requirementChange_localToBranch),
8181
("testPrecomputeResolution_requirementChange_versionToBranch", testPrecomputeResolution_requirementChange_versionToBranch),
8282
("testPrecomputeResolution_requirementChange_versionToLocal", testPrecomputeResolution_requirementChange_versionToLocal),
83+
("testPrecomputeResolution_requirementChange_versionToRevision", testPrecomputeResolution_requirementChange_versionToRevision),
8384
("testResolutionFailureWithEditedDependency", testResolutionFailureWithEditedDependency),
8485
("testResolve", testResolve),
8586
("testResolvedFileUpdate", testResolvedFileUpdate),

0 commit comments

Comments
 (0)