Skip to content

Commit f878137

Browse files
committed
identity improvements
motivation: improve correctness by using identity more broadly throughout the codebase changes: * expose identity on Package, ResolvedPackage and GraphLoadingNode * reduce calls to identityResolver.resolveIdentity since we now have identity more broadly available (also improves performance) * ManifestLoader now take PackageIdentity to reduce calls to identityResolver.resolveIdentity when the identity is already known * introduce PackageIdentity.root as a utility for root packages, since their identity is straight-forward * adjust call-sites * adjust tests
1 parent d1ef837 commit f878137

35 files changed

+406
-237
lines changed

Sources/Build/BuildOperationBuildSystemDelegateHandler.swift

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,13 +215,8 @@ public struct BuildDescription: Codable {
215215
self.testDiscoveryCommands = testDiscoveryCommands
216216
self.copyCommands = copyCommands
217217

218-
self.builtTestProducts = try plan.buildProducts.filter{ $0.product.type == .test }.map { desc in
219-
// FIXME(perf): Provide faster lookups.
220-
guard let package = (plan.graph.packages.first{ $0.products.contains(desc.product) }) else {
221-
throw InternalError("package with product \(desc.product) not found")
222-
}
218+
self.builtTestProducts = plan.buildProducts.filter{ $0.product.type == .test }.map { desc in
223219
return BuiltTestProduct(
224-
packageName: package.name,
225220
productName: desc.product.name,
226221
binaryPath: desc.binary
227222
)

Sources/Commands/Describe.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ fileprivate struct DescribedPackage: Encodable {
5555
let swiftLanguagesVersions: [String]?
5656

5757
init(from package: Package) {
58-
self.name = package.name
58+
self.name = package.manifestName // TODO: rename property to manifestName?
5959
self.path = package.path.pathString
6060
self.toolsVersion = "\(package.manifest.toolsVersion.major).\(package.manifest.toolsVersion.minor)"
6161
+ (package.manifest.toolsVersion.patch == 0 ? "" : ".\(package.manifest.toolsVersion.patch)")

Sources/Commands/SwiftPackageTool.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,11 @@ extension SwiftPackageTool {
174174
workspace.loadRootManifests(packages: root.packages, diagnostics: swiftTool.diagnostics, completion: $0)
175175
}
176176
guard let manifest = manifests.first else { return }
177+
// FIXME: use PackageIdentity.root?
178+
let packageIdentity = workspace.identityResolver.resolveIdentity(for: manifest.packageLocation)
177179

178180
let builder = PackageBuilder(
181+
identity: packageIdentity,
179182
manifest: manifest,
180183
productFilter: .everything,
181184
path: try swiftTool.getPackageRoot(),
@@ -240,8 +243,11 @@ extension SwiftPackageTool {
240243
let manifest = try temp_await {
241244
workspace.loadRootManifests(packages: root.packages, diagnostics: swiftTool.diagnostics, completion: $0)
242245
}[0]
246+
// FIXME: use PackageIdentity.root?
247+
let packageIdentity = workspace.identityResolver.resolveIdentity(for: manifest.packageLocation)
243248

244249
let builder = PackageBuilder(
250+
identity: packageIdentity,
245251
manifest: manifest,
246252
productFilter: .everything,
247253
path: try swiftTool.getPackageRoot(),
@@ -582,7 +588,7 @@ extension SwiftPackageTool {
582588
destination = output
583589
} else {
584590
let graph = try swiftTool.loadPackageGraph()
585-
let packageName = graph.rootPackages[0].name
591+
let packageName = graph.rootPackages[0].manifestName // TODO: use identity instead?
586592
destination = packageRoot.appending(component: "\(packageName).zip")
587593
}
588594

@@ -657,10 +663,10 @@ extension SwiftPackageTool {
657663
dstdir = outpath.parentDirectory
658664
case let outpath?:
659665
dstdir = outpath
660-
projectName = graph.rootPackages[0].name
666+
projectName = graph.rootPackages[0].manifestName // TODO: use identity instead?
661667
case _:
662668
dstdir = try swiftTool.getPackageRoot()
663-
projectName = graph.rootPackages[0].name
669+
projectName = graph.rootPackages[0].manifestName // TODO: use identity instead?
664670
}
665671
let xcodeprojPath = Xcodeproj.buildXcodeprojPath(outputDir: dstdir, projectName: projectName)
666672

Sources/Commands/SwiftTestTool.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,12 @@ public struct SwiftTestTool: SwiftCommand {
352352

353353
/// Processes the code coverage data and emits a json.
354354
private func processCodeCoverage(_ testProducts: [BuiltTestProduct], swiftTool: SwiftTool) throws {
355+
let workspace = try swiftTool.getActiveWorkspace()
356+
let root = try swiftTool.getWorkspaceRoot()
357+
let rootManifest = try temp_await {
358+
workspace.loadRootManifests(packages: root.packages, diagnostics: swiftTool.diagnostics, completion: $0)
359+
}[0]
360+
355361
// Merge all the profraw files to produce a single profdata file.
356362
try mergeCodeCovRawDataFiles(swiftTool: swiftTool)
357363

@@ -360,7 +366,7 @@ public struct SwiftTestTool: SwiftCommand {
360366
// Export the codecov data as JSON.
361367
let jsonPath = codeCovAsJSONPath(
362368
buildParameters: buildParameters,
363-
packageName: product.packageName)
369+
packageName: rootManifest.name)
364370
try exportCodeCovAsJSON(to: jsonPath, testBinary: product.binaryPath, swiftTool: swiftTool)
365371
}
366372
}

Sources/Commands/show-dependencies.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ private final class PlainTextDumper: DependenciesDumper {
4444

4545
let pkgVersion = package.manifest.version?.description ?? "unspecified"
4646

47-
stream <<< "\(hanger)\(package.name)<\(package.manifest.packageLocation)@\(pkgVersion)>\n"
47+
stream <<< "\(hanger)\(package.identity.description)<\(package.manifest.packageLocation)@\(pkgVersion)>\n"
4848

4949
if !package.dependencies.isEmpty {
5050
let replacement = (index == packages.count - 1) ? " " : ""
@@ -69,7 +69,7 @@ private final class FlatListDumper: DependenciesDumper {
6969
func dump(dependenciesOf rootpkg: ResolvedPackage, on stream: OutputByteStream) {
7070
func recursiveWalk(packages: [ResolvedPackage]) {
7171
for package in packages {
72-
stream <<< package.name <<< "\n"
72+
stream <<< package.identity.description <<< "\n"
7373
if !package.dependencies.isEmpty {
7474
recursiveWalk(packages: package.dependencies)
7575
}
@@ -88,7 +88,8 @@ private final class DotDumper: DependenciesDumper {
8888
let url = package.manifest.packageLocation
8989
if nodesAlreadyPrinted.contains(url) { return }
9090
let pkgVersion = package.manifest.version?.description ?? "unspecified"
91-
stream <<< #""\#(url)" [label="\#(package.name)\n\#(url)\n\#(pkgVersion)"]"# <<< "\n"
91+
// 👀 is this correct? or manifest name is better?
92+
stream <<< #""\#(url)" [label="\#(package.identity.description)\n\#(url)\n\#(pkgVersion)"]"# <<< "\n"
9293
nodesAlreadyPrinted.insert(url)
9394
}
9495

@@ -130,7 +131,7 @@ private final class JSONDumper: DependenciesDumper {
130131
func dump(dependenciesOf rootpkg: ResolvedPackage, on stream: OutputByteStream) {
131132
func convert(_ package: ResolvedPackage) -> JSON {
132133
return .orderedDictionary([
133-
"name": .string(package.name),
134+
"name": .string(package.manifestName), // TODO: remove? add identity?
134135
"url": .string(package.manifest.packageLocation),
135136
"version": .string(package.manifest.version?.description ?? "unspecified"),
136137
"path": .string(package.path.pathString),

Sources/PackageGraph/GraphLoadingNode.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@ import TSCUtility
2020
/// - SeeAlso: DependencyResolutionNode
2121
public struct GraphLoadingNode: Equatable, Hashable {
2222

23+
/// The package identity.
24+
public let identity: PackageIdentity
25+
2326
/// The package manifest.
2427
public let manifest: Manifest
2528

2629
/// The product filter applied to the package.
2730
public let productFilter: ProductFilter
2831

29-
public init(manifest: Manifest, productFilter: ProductFilter) {
32+
public init(identity: PackageIdentity, manifest: Manifest, productFilter: ProductFilter) {
33+
self.identity = identity
3034
self.manifest = manifest
3135
self.productFilter = productFilter
3236
}
@@ -41,9 +45,9 @@ extension GraphLoadingNode: CustomStringConvertible {
4145
public var description: String {
4246
switch productFilter {
4347
case .everything:
44-
return manifest.name
48+
return self.manifest.name
4549
case .specific(let set):
46-
return "\(manifest.name)[\(set.sorted().joined(separator: ", "))]"
50+
return "\(self.manifest.name)[\(set.sorted().joined(separator: ", "))]"
4751
}
4852
}
4953
}

Sources/PackageGraph/LocalPackageContainer.swift

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,23 @@ public final class LocalPackageContainer: PackageContainer {
3939
private func loadManifest() throws -> Manifest {
4040
try manifest.memoize() {
4141
// Load the tools version.
42-
let toolsVersion = try toolsVersionLoader.load(at: AbsolutePath(package.location), fileSystem: fileSystem)
42+
let toolsVersion = try self.toolsVersionLoader.load(at: AbsolutePath(self.package.location), fileSystem: self.fileSystem)
4343

4444
// Validate the tools version.
45-
try toolsVersion.validateToolsVersion(self.currentToolsVersion, packagePath: package.location)
45+
try toolsVersion.validateToolsVersion(self.currentToolsVersion, packagePath: self.package.location)
4646

4747
// Load the manifest.
4848
// FIXME: this should not block
4949
return try temp_await {
50-
manifestLoader.load(at: AbsolutePath(package.location),
51-
packageKind: package.kind,
52-
packageLocation: package.location,
50+
manifestLoader.load(at: AbsolutePath(self.package.location),
51+
packageIdentity: self.package.identity,
52+
packageKind: self.package.kind,
53+
packageLocation: self.package.location,
5354
version: nil,
5455
revision: nil,
5556
toolsVersion: toolsVersion,
56-
identityResolver: identityResolver,
57-
fileSystem: fileSystem,
57+
identityResolver: self.identityResolver,
58+
fileSystem: self.fileSystem,
5859
diagnostics: nil,
5960
on: .global(),
6061
completion: $0)

0 commit comments

Comments
 (0)