Skip to content

Commit d61b1ea

Browse files
authored
Error on empty product names (#5805)
This seems like an oversight in `PackageBuilder` validation so I don't think it needs to be guarded by tools-version. rdar://94661861
1 parent 9ee2297 commit d61b1ea

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

Sources/PackageLoading/PackageBuilder.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,16 @@ extension Target.Error.ModuleNameProblem: CustomStringConvertible {
181181
extension Product {
182182
/// An error in a product definition.
183183
enum Error: Swift.Error {
184+
case emptyName
184185
case moduleEmpty(product: String, target: String)
185186
}
186187
}
187188

188189
extension Product.Error: CustomStringConvertible {
189190
var description: String {
190191
switch self {
192+
case .emptyName:
193+
return "product names can not be empty"
191194
case .moduleEmpty(let product, let target):
192195
return "target '\(target)' referenced in product '\(product)' is empty"
193196
}
@@ -1147,6 +1150,10 @@ public final class PackageBuilder {
11471150
filteredProducts = self.manifest.products.filter { set.contains($0.name) }
11481151
}
11491152
for product in filteredProducts {
1153+
if product.name.isEmpty {
1154+
throw Product.Error.emptyName
1155+
}
1156+
11501157
let targets = try modulesFrom(targetNames: product.targets, product: product.name)
11511158
// Perform special validations if this product is exporting
11521159
// a system library target.

Tests/PackageLoadingTests/PackageBuilderTests.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,24 @@ class PackageBuilderTests: XCTestCase {
577577
}
578578
}
579579

580+
func testEmptyProductNameError() throws {
581+
let fs = InMemoryFileSystem(emptyFiles: "/Sources/best/best.swift")
582+
583+
let manifest = Manifest.createRootManifest(
584+
name: "pkg",
585+
products: [
586+
try ProductDescription(name: "", type: .library(.automatic), targets: ["best"]),
587+
],
588+
targets: [
589+
try TargetDescription(name: "best"),
590+
]
591+
)
592+
593+
PackageBuilderTester(manifest, in: fs) { package, diagnostics in
594+
diagnostics.check(diagnostic: "product names can not be empty", severity: .error)
595+
}
596+
}
597+
580598
func testMultipleTestEntryPointsError() throws {
581599
let name = SwiftTarget.defaultTestEntryPointName
582600
let swift: AbsolutePath = AbsolutePath("/swift")

0 commit comments

Comments
 (0)