Skip to content

Commit d74fa6a

Browse files
committed
fix pacakge describe to handle binary targets
motivation: package describe command fails for packages with binary targets changes: * PackageBuilder requires remote artifacts to be set to compute the model, as such make it a required argument * do not call PackageBuilder directly from describe and format commands, instead use Workspace::loadRootPackage API for loading a root package * update Workspace::loadRootPackage to compute artifacts
1 parent 2ea136b commit d74fa6a

File tree

3 files changed

+39
-37
lines changed

3 files changed

+39
-37
lines changed

Sources/Commands/SwiftPackageTool.swift

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -170,25 +170,19 @@ extension SwiftPackageTool {
170170

171171
func run(_ swiftTool: SwiftTool) throws {
172172
let workspace = try swiftTool.getActiveWorkspace()
173-
let root = try swiftTool.getWorkspaceRoot()
174173

175-
let rootManifests = try temp_await {
176-
workspace.loadRootManifests(packages: root.packages, diagnostics: swiftTool.observabilityScope.makeDiagnosticsEngine(), completion: $0)
174+
guard let packagePath = try swiftTool.getWorkspaceRoot().packages.first else {
175+
throw StringError("unknown package")
177176
}
178-
guard let rootManifest = rootManifests.values.first else {
179-
throw StringError("invalid manifests at \(root.packages)")
177+
178+
let package = try tsc_await {
179+
workspace.loadRootPackage(
180+
at: packagePath,
181+
observabilityScope: swiftTool.observabilityScope,
182+
completion: $0
183+
)
180184
}
181185

182-
let builder = PackageBuilder(
183-
identity: .plain(rootManifest.name),
184-
manifest: rootManifest,
185-
productFilter: .everything,
186-
path: try swiftTool.getPackageRoot(),
187-
xcTestMinimumDeploymentTargets: MinimumDeploymentTarget.default.xcTestMinimumDeploymentTargets,
188-
fileSystem: localFileSystem,
189-
observabilityScope: swiftTool.observabilityScope
190-
)
191-
let package = try builder.construct()
192186
describe(package, in: type, on: swiftTool.outputStream)
193187
}
194188
}
@@ -243,28 +237,18 @@ extension SwiftPackageTool {
243237

244238
// Get the root package.
245239
let workspace = try swiftTool.getActiveWorkspace()
246-
let root = try swiftTool.getWorkspaceRoot()
247-
let rootManifests = try temp_await {
248-
workspace.loadRootManifests(
249-
packages: root.packages,
250-
diagnostics: swiftTool.observabilityScope.makeDiagnosticsEngine(),
240+
241+
guard let packagePath = try swiftTool.getWorkspaceRoot().packages.first else {
242+
throw StringError("unknown package")
243+
}
244+
245+
let package = try tsc_await {
246+
workspace.loadRootPackage(
247+
at: packagePath,
248+
observabilityScope: swiftTool.observabilityScope,
251249
completion: $0
252250
)
253251
}
254-
guard let rootManifest = rootManifests.values.first else {
255-
throw StringError("invalid manifests at \(root.packages)")
256-
}
257-
258-
let builder = PackageBuilder(
259-
identity: .plain(rootManifest.name),
260-
manifest: rootManifest,
261-
productFilter: .everything,
262-
path: try swiftTool.getPackageRoot(),
263-
xcTestMinimumDeploymentTargets: [:], // Minimum deployment target does not matter for this operation.
264-
fileSystem: localFileSystem,
265-
observabilityScope: swiftTool.observabilityScope
266-
)
267-
let package = try builder.construct()
268252

269253
// Use the user provided flags or default to formatting mode.
270254
let formatOptions = swiftFormatFlags.isEmpty
@@ -278,7 +262,7 @@ extension SwiftPackageTool {
278262
}
279263
}.map { $0.pathString }
280264

281-
let args = [swiftFormat.pathString] + formatOptions + [rootManifest.path.pathString] + paths
265+
let args = [swiftFormat.pathString] + formatOptions + [packagePath.pathString] + paths
282266
print("Running:", args.map{ $0.spm_shellEscaped() }.joined(separator: " "))
283267

284268
let result = try Process.popen(arguments: args)

Sources/PackageLoading/PackageBuilder.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ public final class PackageBuilder {
263263
productFilter: ProductFilter,
264264
path: AbsolutePath,
265265
additionalFileRules: [FileRuleDescription] = [],
266-
binaryArtifacts: [BinaryArtifact] = [],
266+
binaryArtifacts: [BinaryArtifact],
267267
xcTestMinimumDeploymentTargets: [PackageModel.Platform:PlatformVersion],
268268
shouldCreateMultipleTestProducts: Bool = false,
269269
warnAboutImplicitExecutableTargets: Bool = true,
@@ -322,6 +322,7 @@ public final class PackageBuilder {
322322
manifest: manifest,
323323
productFilter: .everything,
324324
path: path,
325+
binaryArtifacts: [], // this will fail for packages with binary artifacts, but this API is deprecated and the replacement API was fixed
325326
xcTestMinimumDeploymentTargets: xcTestMinimumDeploymentTargets,
326327
fileSystem: localFileSystem,
327328
observabilityScope: ObservabilitySystem(diagnosticEngine: diagnostics).topScope

Sources/Workspace/Workspace.swift

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1015,14 +1015,31 @@ extension Workspace {
10151015
observabilityScope: ObservabilityScope,
10161016
completion: @escaping(Result<Package, Error>) -> Void
10171017
) {
1018-
self.loadRootManifest(at: path, diagnostics: observabilityScope.makeDiagnosticsEngine()) { result in
1018+
self.loadRootManifest(at: path, observabilityScope: observabilityScope) { result in
10191019
let result = result.tryMap { manifest -> Package in
10201020
let identity = try self.identityResolver.resolveIdentity(for: manifest.packageKind)
1021+
1022+
// radar/82263304
1023+
// compute binary artifacts for the sake of constructing a project model
1024+
// note this does not actually download remote artifacts and as such does not have the artifact's correct path
1025+
let binaryArtifacts = try manifest.targets.filter{ $0.type == .binary }.map { target -> BinaryArtifact in
1026+
if let path = target.path {
1027+
let absolutePath = try manifest.path.parentDirectory.appending(RelativePath(validating: path))
1028+
return try BinaryArtifact(kind: .forFileExtension(absolutePath.extension ?? "unknown") , originURL: .none, path: absolutePath)
1029+
} else if let url = target.url.flatMap(URL.init(string:)) {
1030+
let fakePath = try manifest.path.parentDirectory.appending(components: "remote", "archive").appending(RelativePath(validating: url.lastPathComponent))
1031+
return BinaryArtifact(kind: .xcframework , originURL: url.absoluteString, path: fakePath)
1032+
} else {
1033+
throw InternalError("a binary target should have either a path or a URL and a checksum")
1034+
}
1035+
}
1036+
10211037
let builder = PackageBuilder(
10221038
identity: identity,
10231039
manifest: manifest,
10241040
productFilter: .everything,
10251041
path: path,
1042+
binaryArtifacts: binaryArtifacts,
10261043
xcTestMinimumDeploymentTargets: MinimumDeploymentTarget.default.xcTestMinimumDeploymentTargets,
10271044
fileSystem: self.fileSystem,
10281045
observabilityScope: observabilityScope

0 commit comments

Comments
 (0)