Skip to content

Commit 53e0734

Browse files
authored
Merge pull request #1760 from aciidb0mb3r/stable-dependency-manifests
[Workspace] Use topological sort when creating DependencyManifests
2 parents 75c1d86 + 30714d7 commit 53e0734

File tree

3 files changed

+71
-5
lines changed

3 files changed

+71
-5
lines changed

Sources/Workspace/Workspace.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ extension Workspace {
914914
var loadedManifests = [String: Manifest]()
915915

916916
// Compute the transitive closure of available dependencies.
917-
let dependencies = transitiveClosure(inputManifests.map({ KeyedPair($0, key: $0.name) })) { node in
917+
let allManifests = try! topologicalSort(inputManifests.map({ KeyedPair($0, key: $0.name) })) { node in
918918
return node.item.dependencies.compactMap({ dependency in
919919
let ref = dependency.createPackageRef()
920920
let manifest = loadedManifests[ref.identity] ?? loadManifest(for: ref, diagnostics: diagnostics)
@@ -923,10 +923,9 @@ extension Workspace {
923923
})
924924
}
925925

926-
// It is possible that some root dependency is also present as a regular dependency, so we
927-
// form a unique set of all dependency manifests.
928-
let allManifests = Set(rootDependencyManifests.map({ KeyedPair($0, key: $0.name) }) + dependencies).map({ $0.item })
929-
let deps: [(Manifest, ManagedDependency)] = allManifests.map({
926+
let allDependencyManifests = allManifests.map({ $0.item }).filter({ !root.manifests.contains($0) })
927+
928+
let deps: [(Manifest, ManagedDependency)] = allDependencyManifests.map({
930929
// FIXME: We should use package name directly once this radar is fixed:
931930
// <rdar://problem/33693433> Ensure that identity and package name
932931
// are the same once we have an API to specify identity in the

Tests/WorkspaceTests/WorkspaceTests.swift

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,72 @@ final class WorkspaceTests: XCTestCase {
991991
}
992992
}
993993

994+
func testDependencyManifestsOrder() throws {
995+
let sandbox = AbsolutePath("/tmp/ws/")
996+
let fs = InMemoryFileSystem()
997+
998+
let workspace = try TestWorkspace(
999+
sandbox: sandbox,
1000+
fs: fs,
1001+
roots: [
1002+
TestPackage(
1003+
name: "Root1",
1004+
targets: [
1005+
TestTarget(name: "Root1", dependencies: ["Foo", "Bar", "Baz", "Bam"]),
1006+
],
1007+
products: [],
1008+
dependencies: [
1009+
TestDependency(name: "Foo", requirement: .upToNextMajor(from: "1.0.0")),
1010+
TestDependency(name: "Bar", requirement: .upToNextMajor(from: "1.0.0")),
1011+
TestDependency(name: "Baz", requirement: .upToNextMajor(from: "1.0.0")),
1012+
TestDependency(name: "Bam", requirement: .upToNextMajor(from: "1.0.0")),
1013+
]
1014+
),
1015+
],
1016+
packages: [
1017+
TestPackage(
1018+
name: "Foo",
1019+
targets: [
1020+
TestTarget(name: "Foo", dependencies: ["Bar", "Baz"]),
1021+
],
1022+
products: [
1023+
TestProduct(name: "Foo", targets: ["Foo"]),
1024+
],
1025+
dependencies: [
1026+
TestDependency(name: "Bar", requirement: .upToNextMajor(from: "1.0.0")),
1027+
TestDependency(name: "Baz", requirement: .upToNextMajor(from: "1.0.0")),
1028+
],
1029+
versions: ["1.0.0"]
1030+
),
1031+
.genericPackage1(named: "Bar"),
1032+
TestPackage(
1033+
name: "Baz",
1034+
targets: [
1035+
TestTarget(name: "Baz", dependencies: ["Bam"]),
1036+
],
1037+
products: [
1038+
TestProduct(name: "Baz", targets: ["Baz"]),
1039+
],
1040+
dependencies: [
1041+
TestDependency(name: "Bam", requirement: .upToNextMajor(from: "1.0.0")),
1042+
],
1043+
versions: ["1.0.0"]
1044+
),
1045+
.genericPackage1(named: "Bam"),
1046+
]
1047+
)
1048+
1049+
workspace.checkPackageGraph(roots: ["Root1"]) { (graph, diagnostics) in
1050+
XCTAssertNoDiagnostics(diagnostics)
1051+
}
1052+
1053+
workspace.loadDependencyManifests(roots: ["Root1"]) { (manifests, diagnostics) in
1054+
// Ensure that the order of the manifests is stable.
1055+
XCTAssertEqual(manifests.allManifests().map({$0.name}), ["Foo", "Baz", "Bam", "Bar"])
1056+
XCTAssertNoDiagnostics(diagnostics)
1057+
}
1058+
}
1059+
9941060
func testBranchAndRevision() throws {
9951061
let sandbox = AbsolutePath("/tmp/ws/")
9961062
let fs = InMemoryFileSystem()

Tests/WorkspaceTests/XCTestManifests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ extension WorkspaceTests {
4848
("testCleanAndReset", testCleanAndReset),
4949
("testDeletedCheckoutDirectory", testDeletedCheckoutDirectory),
5050
("testDependencyManifestLoading", testDependencyManifestLoading),
51+
("testDependencyManifestsOrder", testDependencyManifestsOrder),
5152
("testDependencyResolutionWithEdit", testDependencyResolutionWithEdit),
5253
("testEditDependency", testEditDependency),
5354
("testGraphData", testGraphData),

0 commit comments

Comments
 (0)