Skip to content

Commit 800f742

Browse files
authored
[5.8] Add package metadata to a few more ObservabilityScopes in workspace-wide and package graph loading operations (#5984) (#5986)
Clients of libSwiftPM that present diagnostics use the package metadata that can optionally be attached to an emitted Diagnostic to associate it with the package in the user interface. This change addresses a few more cases in which no package metadata was associated. Where possible, the metadata is associated with the ObservabilityScope at the highest place in the call stack so that any diagnostic emitted below it gets the package metadata. rdar://103561534 (cherry picked from commit 723a592)
1 parent 1863e35 commit 800f742

File tree

4 files changed

+17
-8
lines changed

4 files changed

+17
-8
lines changed

Sources/PackageGraph/PackageGraph+Loading.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ private func createResolvedPackages(
353353
)
354354

355355
// Create target builders for each target in the package.
356-
let targetBuilders = package.targets.map{ ResolvedTargetBuilder(target: $0, observabilityScope: observabilityScope) }
356+
let targetBuilders = package.targets.map{ ResolvedTargetBuilder(target: $0, observabilityScope: packageObservabilityScope) }
357357
packageBuilder.targets = targetBuilders
358358

359359
// Establish dependencies between the targets. A target can only depend on another target present in the same package.

Sources/PackageGraph/Pubgrub/PubgrubDependencyResolver.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,7 +1315,7 @@ private final class ContainerProvider {
13151315
self.underlying.getContainer(
13161316
for: package,
13171317
skipUpdate: self.skipUpdate,
1318-
observabilityScope: self.observabilityScope,
1318+
observabilityScope: self.observabilityScope.makeChildScope(description: "getting package container", metadata: package.diagnosticsMetadata),
13191319
on: .sharedConcurrent
13201320
) { result in
13211321
let result = result.tryMap { container -> PubGrubPackageContainer in
@@ -1344,7 +1344,7 @@ private final class ContainerProvider {
13441344
self.underlying.getContainer(
13451345
for: identifier,
13461346
skipUpdate: self.skipUpdate,
1347-
observabilityScope: self.observabilityScope,
1347+
observabilityScope: self.observabilityScope.makeChildScope(description: "prefetcing package container", metadata: identifier.diagnosticsMetadata),
13481348
on: .sharedConcurrent
13491349
) { result in
13501350
defer { self.prefetches[identifier]?.leave() }

Sources/Workspace/Workspace.swift

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,8 @@ extension Workspace {
715715
observabilityScope.emit(.dependencyNotFound(packageName: packageName))
716716
return
717717
}
718+
719+
let observabilityScope = observabilityScope.makeChildScope(description: "editing package", metadata: dependency.packageRef.diagnosticsMetadata)
718720

719721
try self.unedit(dependency: dependency, forceRemove: forceRemove, root: root, observabilityScope: observabilityScope)
720722
}
@@ -745,6 +747,8 @@ extension Workspace {
745747
throw StringError("dependency '\(packageName)' was not found")
746748
}
747749

750+
let observabilityScope = observabilityScope.makeChildScope(description: "editing package", metadata: dependency.packageRef.diagnosticsMetadata)
751+
748752
let defaultRequirement: PackageRequirement
749753
switch dependency.state {
750754
case .sourceControlCheckout(let checkoutState):
@@ -1269,6 +1273,8 @@ extension Workspace {
12691273
observabilityScope.emit(.dependencyNotFound(packageName: packageName))
12701274
return
12711275
}
1276+
1277+
let observabilityScope = observabilityScope.makeChildScope(description: "editing package", metadata: dependency.packageRef.diagnosticsMetadata)
12721278

12731279
let checkoutState: CheckoutState
12741280
switch dependency.state {
@@ -1811,7 +1817,7 @@ extension Workspace {
18111817
// Remove any managed dependency which has become a root.
18121818
for dependency in dependenciesToCheck {
18131819
if root.packages.keys.contains(dependency.packageRef.identity) {
1814-
observabilityScope.trap {
1820+
observabilityScope.makeChildScope(description: "removing managed dependencies", metadata: dependency.packageRef.diagnosticsMetadata).trap {
18151821
try self.remove(package: dependency.packageRef)
18161822
}
18171823
}
@@ -2060,7 +2066,7 @@ extension Workspace {
20602066
// Make a copy of dependencies as we might mutate them in the for loop.
20612067
let allDependencies = Array(self.state.dependencies)
20622068
for dependency in allDependencies {
2063-
observabilityScope.trap {
2069+
observabilityScope.makeChildScope(description: "copying managed dependencies", metadata: dependency.packageRef.diagnosticsMetadata).trap {
20642070
// If the dependency is present, we're done.
20652071
let dependencyPath = self.path(to: dependency)
20662072
if fileSystem.isDirectory(dependencyPath) {
@@ -2287,6 +2293,7 @@ extension Workspace {
22872293
let group = DispatchGroup()
22882294
for pin in pinsStore.pins {
22892295
group.enter()
2296+
let observabilityScope = observabilityScope.makeChildScope(description: "requesting package containers", metadata: pin.packageRef.diagnosticsMetadata)
22902297
packageContainerProvider.getContainer(for: pin.packageRef, skipUpdate: self.configuration.skipDependenciesUpdates, observabilityScope: observabilityScope, on: .sharedConcurrent, completion: { _ in
22912298
group.leave()
22922299
})
@@ -2314,7 +2321,7 @@ extension Workspace {
23142321

23152322
// Retrieve the required pins.
23162323
for pin in requiredPins {
2317-
observabilityScope.trap {
2324+
observabilityScope.makeChildScope(description: "retrieving dependency pins", metadata: pin.packageRef.diagnosticsMetadata).trap {
23182325
switch pin.packageRef.kind {
23192326
case .localSourceControl, .remoteSourceControl:
23202327
_ = try self.checkoutRepository(package: pin.packageRef, at: pin.state, observabilityScope: observabilityScope)
@@ -2517,7 +2524,7 @@ extension Workspace {
25172524

25182525
// First remove the checkouts that are no longer required.
25192526
for (packageRef, state) in packageStateChanges {
2520-
observabilityScope.trap {
2527+
observabilityScope.makeChildScope(description: "removing unneeded checkouts", metadata: packageRef.diagnosticsMetadata).trap {
25212528
switch state {
25222529
case .added, .updated, .unchanged: break
25232530
case .removed:
@@ -2528,7 +2535,7 @@ extension Workspace {
25282535

25292536
// Update or clone new packages.
25302537
for (packageRef, state) in packageStateChanges {
2531-
observabilityScope.trap {
2538+
observabilityScope.makeChildScope(description: "updating or cloning new packages", metadata: packageRef.diagnosticsMetadata).trap {
25322539
switch state {
25332540
case .added(let state):
25342541
_ = try self.updateDependency(package: packageRef, requirement: state.requirement, productFilter: state.products, observabilityScope: observabilityScope)

Tests/WorkspaceTests/WorkspaceTests.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4603,11 +4603,13 @@ final class WorkspaceTests: XCTestCase {
46034603
diagnostic: .equal("the target 'Baz' in product 'Baz' contains unsafe build flags"),
46044604
severity: .error
46054605
)
4606+
XCTAssertEqual(diagnostic1?.metadata?.packageIdentity, .plain("foo"))
46064607
XCTAssertEqual(diagnostic1?.metadata?.targetName, "Foo")
46074608
let diagnostic2 = result.checkUnordered(
46084609
diagnostic: .equal("the target 'Bar' in product 'Baz' contains unsafe build flags"),
46094610
severity: .error
46104611
)
4612+
XCTAssertEqual(diagnostic2?.metadata?.packageIdentity, .plain("foo"))
46114613
XCTAssertEqual(diagnostic2?.metadata?.targetName, "Foo")
46124614
}
46134615
}

0 commit comments

Comments
 (0)