Skip to content

Commit 7d02c35

Browse files
authored
Fix force resolved versions for transitive local dependencies (#3691)
Previously we were pre-populating managed dependencies with only the first level of dependencies from roots. Now we will do this before attempting to load manifests to ensure this works recursively. rdar://82397606
1 parent 301c3fb commit 7d02c35

File tree

1 file changed

+10
-14
lines changed

1 file changed

+10
-14
lines changed

Sources/Workspace/Workspace.swift

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,7 +1425,8 @@ extension Workspace {
14251425
// FIXME: this logic should be changed to use identity instead of location once identity is unique
14261426
public func loadDependencyManifests(
14271427
root: PackageGraphRoot,
1428-
diagnostics: DiagnosticsEngine
1428+
diagnostics: DiagnosticsEngine,
1429+
automaticallyAddManagedDependencies: Bool = false
14291430
) throws -> DependencyManifests {
14301431
// Utility Just because a raw tuple cannot be hashable.
14311432
struct Key: Hashable {
@@ -1476,6 +1477,13 @@ extension Workspace {
14761477
let allManifestsWithPossibleDuplicates = try topologicalSort(inputPairs) { pair in
14771478
// optimization: preload manifest we know about in parallel
14781479
let dependenciesRequired = pair.item.dependenciesRequired(for: pair.key.productFilter)
1480+
// prepopulate managed dependencies if we are asked to do so
1481+
if automaticallyAddManagedDependencies {
1482+
dependenciesRequired.filter { $0.isLocal }.forEach { dependency in
1483+
state.dependencies.add(ManagedDependency.local(packageRef: dependency.createPackageRef()))
1484+
}
1485+
diagnostics.wrap { try state.saveState() }
1486+
}
14791487
let dependenciesRequiredURLs = dependenciesRequired.map{ $0.location }.filter { !loadedManifests.keys.contains($0) }
14801488
// note: loadManifest emits diagnostics in case it fails
14811489
let dependenciesRequiredManifests = try temp_await { self.loadManifests(forURLs: dependenciesRequiredURLs, diagnostics: diagnostics, completion: $0) }
@@ -2013,19 +2021,7 @@ extension Workspace {
20132021
}
20142022
}
20152023

2016-
// Save state for local packages, if any.
2017-
//
2018-
// FIXME: This will only work for top-level local packages right now.
2019-
for rootManifest in rootManifests.values {
2020-
let dependencies = rootManifest.dependencies.filter{ $0.isLocal }
2021-
for localPackage in dependencies {
2022-
let package = localPackage.createPackageRef()
2023-
state.dependencies.add(ManagedDependency.local(packageRef: package))
2024-
}
2025-
}
2026-
diagnostics.wrap { try state.saveState() }
2027-
2028-
let currentManifests = try self.loadDependencyManifests(root: graphRoot, diagnostics: diagnostics)
2024+
let currentManifests = try self.loadDependencyManifests(root: graphRoot, diagnostics: diagnostics, automaticallyAddManagedDependencies: true)
20292025

20302026
let precomputationResult = try precomputeResolution(
20312027
root: graphRoot,

0 commit comments

Comments
 (0)