Skip to content

Commit 0486f94

Browse files
committed
[Workspace] Introduce a new package state - usesLibrary
All non-edited packages are eligible to use a provided library based on the dependency resolution information. `.usesLibrary` state would result in a new `.providedLibrary` managed dependency injected into workspace state instead of a regular local/remote package.
1 parent 2ad3bf2 commit 0486f94

File tree

3 files changed

+40
-35
lines changed

3 files changed

+40
-35
lines changed

Sources/Commands/PackageCommands/Update.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ extension SwiftPackageCommand {
7373
case .removed:
7474
report += "\n"
7575
report += "- \(package.identity) \(currentVersion)"
76-
case .unchanged:
76+
case .unchanged, .usesLibrary:
7777
continue
7878
}
7979
}

Sources/Workspace/ManagedDependency.swift

+3-7
Original file line numberDiff line numberDiff line change
@@ -153,15 +153,11 @@ extension Workspace {
153153

154154
public static func providedLibrary(
155155
packageRef: PackageReference,
156-
version: Version
156+
library: ProvidedLibrary
157157
) throws -> ManagedDependency {
158-
guard case .providedLibrary(_, let path) = packageRef.kind else {
159-
throw InternalError("invalid package type: \(packageRef.kind)")
160-
}
161-
162-
return ManagedDependency(
158+
ManagedDependency(
163159
packageRef: packageRef,
164-
state: .providedLibrary(at: path, version: version),
160+
state: .providedLibrary(at: library.location, version: library.version),
165161
subpath: try RelativePath(validating: packageRef.identity.description)
166162
)
167163
}

Sources/Workspace/Workspace+Dependencies.swift

+36-27
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ extension Workspace {
672672
metadata: packageRef.diagnosticsMetadata
673673
).trap {
674674
switch state {
675-
case .added, .updated, .unchanged:
675+
case .added, .updated, .unchanged, .usesLibrary:
676676
break
677677
case .removed:
678678
try self.remove(package: packageRef)
@@ -701,12 +701,27 @@ extension Workspace {
701701
productFilter: state.products,
702702
observabilityScope: observabilityScope
703703
)
704-
case .removed, .unchanged:
704+
case .removed, .unchanged, .usesLibrary:
705705
break
706706
}
707707
}
708708
}
709709

710+
// Handle provided libraries
711+
for (packageRef, state) in packageStateChanges {
712+
observabilityScope.makeChildScope(
713+
description: "adding provided libraries",
714+
metadata: packageRef.diagnosticsMetadata
715+
).trap {
716+
if case .usesLibrary(let library) = state {
717+
try self.state.dependencies.add(
718+
.providedLibrary(packageRef: packageRef, library: library)
719+
)
720+
try self.state.save()
721+
}
722+
}
723+
}
724+
710725
// Inform the delegate if nothing was updated.
711726
if packageStateChanges.filter({ $0.1 == .unchanged }).count == packageStateChanges.count {
712727
delegate?.dependenciesUpToDate()
@@ -763,19 +778,6 @@ extension Workspace {
763778
state: .custom(version: version, path: path),
764779
subpath: RelativePath(validating: "")
765780
)
766-
self.state.dependencies.add(dependency)
767-
try self.state.save()
768-
return path
769-
} else if let libraryContainer = container as? ProvidedLibraryPackageContainer {
770-
guard case .providedLibrary(_, let path) = libraryContainer.package.kind else {
771-
throw InternalError("invalid container for \(package.identity) of type \(package.kind)")
772-
}
773-
774-
let dependency: ManagedDependency = try .providedLibrary(
775-
packageRef: libraryContainer.package,
776-
version: version
777-
)
778-
779781
self.state.dependencies.add(dependency)
780782
try self.state.save()
781783
return path
@@ -960,6 +962,9 @@ extension Workspace {
960962
/// The package is updated.
961963
case updated(State)
962964

965+
/// The package is replaced with a prebuilt library
966+
case usesLibrary(ProvidedLibrary)
967+
963968
public var description: String {
964969
switch self {
965970
case .added(let requirement):
@@ -970,15 +975,17 @@ extension Workspace {
970975
return "unchanged"
971976
case .updated(let requirement):
972977
return "updated(\(requirement))"
978+
case .usesLibrary(let library):
979+
return "usesLibrary(\(library.metadata.productName))"
973980
}
974981
}
975982

976983
public var isAddedOrUpdated: Bool {
977984
switch self {
978985
case .added, .updated:
979-
return true
980-
case .unchanged, .removed:
981-
return false
986+
true
987+
case .unchanged, .removed, .usesLibrary:
988+
false
982989
}
983990
}
984991
}
@@ -1096,18 +1103,20 @@ extension Workspace {
10961103
packageStateChanges[binding.package.identity] = (binding.package, .added(newState))
10971104
}
10981105

1099-
case .version(let version, _):
1100-
let stateChange: PackageStateChange
1101-
switch currentDependency?.state {
1106+
case .version(let version, let library):
1107+
let stateChange: PackageStateChange = switch currentDependency?.state {
11021108
case .sourceControlCheckout(.version(version, _)),
1103-
.registryDownload(version),
1104-
.providedLibrary(_, version: version),
1105-
.custom(version, _):
1106-
stateChange = .unchanged
1109+
.registryDownload(version),
1110+
.providedLibrary(_, version: version),
1111+
.custom(version, _):
1112+
library.flatMap { .usesLibrary($0) } ?? .unchanged
11071113
case .edited, .fileSystem, .sourceControlCheckout, .registryDownload, .providedLibrary, .custom:
1108-
stateChange = .updated(.init(requirement: .version(version), products: binding.products))
1114+
.updated(.init(requirement: .version(version), products: binding.products))
11091115
case nil:
1110-
stateChange = .added(.init(requirement: .version(version), products: binding.products))
1116+
library.flatMap { .usesLibrary($0) } ?? .added(.init(
1117+
requirement: .version(version),
1118+
products: binding.products
1119+
))
11111120
}
11121121
packageStateChanges[binding.package.identity] = (binding.package, stateChange)
11131122
}

0 commit comments

Comments
 (0)