Skip to content

Commit 04397a4

Browse files
committed
[PubGrub] Avoid resolving package versions twice in presence of prebuilt libraries
Integrate information about versions of prebuilt libraries into the solver and prioritize these versions when making decisions if they meet all of the requirements of undecided terms. This helps solver to avoid fetching and at the same time allows partual matches on prebuilt libraries with fallback to package provided versions. (cherry picked from commit 6eb042d) (cherry picked from commit 0e897ed) (cherry picked from commit ee6a58d) (cherry picked from commit b817df1) (cherry picked from commit 2f48249)
1 parent 4bc8c37 commit 04397a4

File tree

8 files changed

+1157
-780
lines changed

8 files changed

+1157
-780
lines changed

Sources/PackageGraph/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ add_library(PackageGraph
1919
PackageGraphRoot.swift
2020
PackageModel+Extensions.swift
2121
PackageRequirement.swift
22-
PrebuiltPackageContainer.swift
2322
PinsStore.swift
2423
Resolution/PubGrub/Assignment.swift
2524
Resolution/PubGrub/ContainerProvider.swift

Sources/PackageGraph/PrebuiltPackageContainer.swift

Lines changed: 0 additions & 69 deletions
This file was deleted.

Sources/PackageGraph/Resolution/PubGrub/ContainerProvider.swift

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ final class ContainerProvider {
4949
}
5050

5151
func removeCachedContainers(for packages: [PackageReference]) {
52-
packages.forEach {
53-
self.containersCache[$0] = nil
52+
for package in packages {
53+
self.containersCache[package] = nil
5454
}
5555
}
5656

@@ -65,25 +65,13 @@ final class ContainerProvider {
6565
/// Get the container for the given identifier, loading it if necessary.
6666
func getContainer(
6767
for package: PackageReference,
68-
availableLibraries: [LibraryMetadata],
6968
completion: @escaping (Result<PubGrubPackageContainer, Error>) -> Void
7069
) {
7170
// Return the cached container, if available.
7271
if let container = self.containersCache[comparingLocation: package] {
7372
return completion(.success(container))
7473
}
7574

76-
if let metadata = package.matchingPrebuiltLibrary(in: availableLibraries) {
77-
do {
78-
let prebuiltPackageContainer = try PrebuiltPackageContainer(metadata: metadata)
79-
let pubGrubContainer = PubGrubPackageContainer(underlying: prebuiltPackageContainer, pins: self.pins)
80-
self.containersCache[package] = pubGrubContainer
81-
return completion(.success(pubGrubContainer))
82-
} catch {
83-
return completion(.failure(error))
84-
}
85-
}
86-
8775
if let prefetchSync = self.prefetches[package] {
8876
// If this container is already being prefetched, wait for that to complete
8977
prefetchSync.notify(queue: .sharedConcurrent) {
@@ -93,15 +81,18 @@ final class ContainerProvider {
9381
} else {
9482
// if prefetch failed, remove from list of prefetches and try again
9583
self.prefetches[package] = nil
96-
return self.getContainer(for: package, availableLibraries: availableLibraries, completion: completion)
84+
return self.getContainer(for: package, completion: completion)
9785
}
9886
}
9987
} else {
10088
// Otherwise, fetch the container from the provider
10189
self.underlying.getContainer(
10290
for: package,
10391
updateStrategy: self.skipUpdate ? .never : .always, // TODO: make this more elaborate
104-
observabilityScope: self.observabilityScope.makeChildScope(description: "getting package container", metadata: package.diagnosticsMetadata),
92+
observabilityScope: self.observabilityScope.makeChildScope(
93+
description: "getting package container",
94+
metadata: package.diagnosticsMetadata
95+
),
10596
on: .sharedConcurrent
10697
) { result in
10798
let result = result.tryMap { container -> PubGrubPackageContainer in
@@ -118,7 +109,7 @@ final class ContainerProvider {
118109
/// Starts prefetching the given containers.
119110
func prefetch(containers identifiers: [PackageReference], availableLibraries: [LibraryMetadata]) {
120111
let filteredIdentifiers = identifiers.filter {
121-
return $0.matchingPrebuiltLibrary(in: availableLibraries) == nil
112+
$0.matchingPrebuiltLibrary(in: availableLibraries) == nil
122113
}
123114
// Process each container.
124115
for identifier in filteredIdentifiers {
@@ -133,13 +124,19 @@ final class ContainerProvider {
133124
self.underlying.getContainer(
134125
for: identifier,
135126
updateStrategy: self.skipUpdate ? .never : .always, // TODO: make this more elaborate
136-
observabilityScope: self.observabilityScope.makeChildScope(description: "prefetching package container", metadata: identifier.diagnosticsMetadata),
127+
observabilityScope: self.observabilityScope.makeChildScope(
128+
description: "prefetching package container",
129+
metadata: identifier.diagnosticsMetadata
130+
),
137131
on: .sharedConcurrent
138132
) { result in
139133
defer { self.prefetches[identifier]?.leave() }
140134
// only cache positive results
141135
if case .success(let container) = result {
142-
self.containersCache[identifier] = PubGrubPackageContainer(underlying: container, pins: self.pins)
136+
self.containersCache[identifier] = PubGrubPackageContainer(
137+
underlying: container,
138+
pins: self.pins
139+
)
143140
}
144141
}
145142
}

0 commit comments

Comments
 (0)