Skip to content

Commit de8d016

Browse files
authored
deprecate name attribute on package dependencies (#3641)
motivation: follow-on work to the change in 5.5 that _allows_ users to not specify a name on the dependency, this soft-deprecates the ability to do so changes: * emit a deprecation warning when using the name attribute on a dependency (in the manifest) * refactor the dependency::name attribute to "deprecatedName" to reflect the fact it was deprecated and prevent too much downstream logic * cleanup the internal API * cleanup and add tests * cleanup havePD4Runtime
1 parent 0a17db0 commit de8d016

24 files changed

+606
-682
lines changed

Diff for: Package.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import class Foundation.ProcessInfo
1515

1616

1717
/** SwiftPMDataModel is the subset of SwiftPM product that includes just its data model.
18-
This allowis some clients (such as IDEs) that use SwiftPM's data model but not its build system
18+
This allows some clients (such as IDEs) that use SwiftPM's data model but not its build system
1919
to not have to depend on SwiftDriver, SwiftLLBuild, etc. We should probably have better names here,
2020
though that could break some clients.
2121
*/
@@ -33,7 +33,7 @@ let swiftPMDataModelProduct = (
3333
]
3434
)
3535

36-
/** The `libSwiftPM` set of interfaces to programatically work with Swift
36+
/** The `libSwiftPM` set of interfaces to programmatically work with Swift
3737
packages. `libSwiftPM` includes all of the SwiftPM code except the
3838
command line tools, while `libSwiftPMDataModel` includes only the data model.
3939

Diff for: Sources/Commands/Describe.swift

+9-13
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
See http://swift.org/LICENSE.txt for license information
88
See http://swift.org/CONTRIBUTORS.txt for Swift project authors
9-
*/
9+
*/
1010

1111
import TSCBasic
1212
import PackageModel
@@ -58,7 +58,7 @@ fileprivate struct DescribedPackage: Encodable {
5858
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)"
61-
+ (package.manifest.toolsVersion.patch == 0 ? "" : ".\(package.manifest.toolsVersion.patch)")
61+
+ (package.manifest.toolsVersion.patch == 0 ? "" : ".\(package.manifest.toolsVersion.patch)")
6262
self.dependencies = package.manifest.dependencies.map { DescribedPackageDependency(from: $0) }
6363
self.defaultLocalization = package.manifest.defaultLocalization
6464
self.platforms = package.manifest.platforms.map { DescribedPlatformRestriction(from: $0) }
@@ -100,24 +100,23 @@ fileprivate struct DescribedPackage: Encodable {
100100

101101
/// Represents a package dependency for the sole purpose of generating a description.
102102
enum DescribedPackageDependency: Encodable {
103-
case fileSystem(name: String?, path: AbsolutePath)
104-
case sourceControl(name: String?, location: String, requirement: PackageDependency.SourceControl.Requirement)
103+
case fileSystem(path: AbsolutePath)
104+
case sourceControl(location: String, requirement: PackageDependency.SourceControl.Requirement)
105105
case registry(identity: PackageIdentity, requirement: PackageDependency.Registry.Requirement)
106106

107107
init(from dependency: PackageDependency) {
108108
switch dependency {
109109
case .fileSystem(let settings):
110-
self = .fileSystem(name: dependency.explicitNameForTargetDependencyResolutionOnly, path: settings.path)
110+
self = .fileSystem(path: settings.path)
111111
case .sourceControl(let settings):
112-
self = .sourceControl(name: dependency.explicitNameForTargetDependencyResolutionOnly, location: settings.location, requirement: settings.requirement)
112+
self = .sourceControl(location: settings.location, requirement: settings.requirement)
113113
case .registry(let settings):
114114
self = .registry(identity: settings.identity, requirement: settings.requirement)
115115
}
116116
}
117117

118118
private enum CodingKeys: CodingKey {
119119
case type
120-
case name
121120
case path
122121
case url
123122
case requirement
@@ -133,20 +132,17 @@ fileprivate struct DescribedPackage: Encodable {
133132
public func encode(to encoder: Encoder) throws {
134133
var container = encoder.container(keyedBy: CodingKeys.self)
135134
switch self {
136-
case .fileSystem(let name, let path):
135+
case .fileSystem(let path):
137136
try container.encode(Kind.fileSystem, forKey: .type)
138-
try container.encode(name, forKey: .name)
139137
try container.encode(path, forKey: .path)
140-
case .sourceControl(let name, let location, let requirement):
138+
case .sourceControl(let location, let requirement):
141139
try container.encode(Kind.sourceControl, forKey: .type)
142-
try container.encode(name, forKey: .name)
143140
try container.encode(location, forKey: .url)
144141
try container.encode(requirement, forKey: .requirement)
145142
case .registry(let identity, let requirement):
146143
try container.encode(Kind.registry, forKey: .type)
147144
try container.encode(identity, forKey: .identity)
148145
try container.encode(requirement, forKey: .requirement)
149-
150146
}
151147
}
152148
}
@@ -287,7 +283,7 @@ public struct PlainTextEncoder {
287283

288284
func unkeyedContainer() -> UnkeyedEncodingContainer {
289285
return PlainTextUnkeyedEncodingContainer(outputStream: outputStream, formattingOptions: formattingOptions, userInfo: userInfo, codingPath: codingPath)
290-
}
286+
}
291287

292288
func singleValueContainer() -> SingleValueEncodingContainer {
293289
return TextSingleValueEncodingContainer(outputStream: outputStream, formattingOptions: formattingOptions, userInfo: userInfo, codingPath: codingPath)

Diff for: Sources/PackageDescription/PackageDependency.swift

+66-59
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ extension Package {
127127
}
128128
}
129129

130+
// MARK: - file system
131+
130132
extension Package.Dependency {
131133
/// Adds a package dependency to a local package on the filesystem.
132134
///
@@ -136,11 +138,10 @@ extension Package.Dependency {
136138
/// on multiple tightly coupled packages.
137139
///
138140
/// - Parameter path: The path of the package.
139-
@available(_PackageDescription, obsoleted: 5.2)
140141
public static func package(
141142
path: String
142143
) -> Package.Dependency {
143-
return .package(name: nil, path: path)
144+
return .init(name: nil, path: path)
144145
}
145146

146147
/// Adds a package dependency to a local package on the filesystem.
@@ -153,9 +154,9 @@ extension Package.Dependency {
153154
/// - Parameters
154155
/// - name: The name of the Swift package or `nil` to deduce the name from path.
155156
/// - path: The local path to the package.
156-
@available(_PackageDescription, introduced: 5.2)
157+
@available(_PackageDescription, introduced: 5.2, deprecated: 5.6, message: "use package(path:) instead")
157158
public static func package(
158-
name: String? = nil,
159+
name: String,
159160
path: String
160161
) -> Package.Dependency {
161162
return .init(name: name, path: path)
@@ -184,12 +185,11 @@ extension Package.Dependency {
184185
/// - name: The name of the package, or nil to deduce it from the URL.
185186
/// - url: The valid Git URL of the package.
186187
/// - version: The minimum version requirement.
187-
@available(_PackageDescription, obsoleted: 5.2)
188188
public static func package(
189189
url: String,
190190
from version: Version
191191
) -> Package.Dependency {
192-
return .package(name: nil, url: url, from: version)
192+
return .package(url: url, .upToNextMajor(from: version))
193193
}
194194

195195
/// Adds a package dependency that uses the version requirement, starting with the given minimum version,
@@ -211,26 +211,41 @@ extension Package.Dependency {
211211
/// - name: The name of the package, or nil to deduce it from the URL.
212212
/// - url: The valid Git URL of the package.
213213
/// - version: The minimum version requirement.
214-
@available(_PackageDescription, introduced: 5.2)
214+
@available(_PackageDescription, introduced: 5.2, deprecated: 5.6, message: "use package(url:from:) instead")
215215
public static func package(
216-
name: String? = nil,
216+
name: String,
217217
url: String,
218218
from version: Version
219219
) -> Package.Dependency {
220220
return .package(name: name, url: url, .upToNextMajor(from: version))
221221
}
222-
222+
223223
/// Adds a remote package dependency given a branch requirement.
224224
///
225225
/// .package(url: "https://example.com/example-package.git", branch: "main"),
226226
///
227227
/// - Parameters:
228-
/// - name: The name of the package, or nil to deduce it from the URL.
229228
/// - url: The valid Git URL of the package.
230229
/// - branch: A dependency requirement. See static methods on `Package.Dependency.Requirement` for available options.
231230
@available(_PackageDescription, introduced: 5.5)
232231
public static func package(
233-
name: String? = nil,
232+
url: String,
233+
branch: String
234+
) -> Package.Dependency {
235+
return .package(url: url, requirement: .branch(branch))
236+
}
237+
238+
/// Adds a remote package dependency given a branch requirement.
239+
///
240+
/// .package(url: "https://example.com/example-package.git", branch: "main"),
241+
///
242+
/// - Parameters:
243+
/// - name: The name of the package, or nil to deduce it from the URL.
244+
/// - url: The valid Git URL of the package.
245+
/// - branch: A dependency requirement. See static methods on `Package.Dependency.Requirement` for available options.
246+
@available(_PackageDescription, introduced: 5.5, deprecated: 5.6, message: "use package(url:branch:) instead")
247+
public static func package(
248+
name: String,
234249
url: String,
235250
branch: String
236251
) -> Package.Dependency {
@@ -242,12 +257,27 @@ extension Package.Dependency {
242257
/// .package(url: "https://example.com/example-package.git", revision: "aa681bd6c61e22df0fd808044a886fc4a7ed3a65"),
243258
///
244259
/// - Parameters:
245-
/// - name: The name of the package, or nil to deduce it from the URL.
246260
/// - url: The valid Git URL of the package.
247261
/// - revision: A dependency requirement. See static methods on `Package.Dependency.Requirement` for available options.
248262
@available(_PackageDescription, introduced: 5.5)
249263
public static func package(
250-
name: String? = nil,
264+
url: String,
265+
revision: String
266+
) -> Package.Dependency {
267+
return .package(url: url, requirement: .revision(revision))
268+
}
269+
270+
/// Adds a remote package dependency given a revision requirement.
271+
///
272+
/// .package(url: "https://example.com/example-package.git", revision: "aa681bd6c61e22df0fd808044a886fc4a7ed3a65"),
273+
///
274+
/// - Parameters:
275+
/// - name: The name of the package, or nil to deduce it from the URL.
276+
/// - url: The valid Git URL of the package.
277+
/// - revision: A dependency requirement. See static methods on `Package.Dependency.Requirement` for available options.
278+
@available(_PackageDescription, introduced: 5.5, deprecated: 5.6, message: "use package(url:revision:) instead")
279+
public static func package(
280+
name: String,
251281
url: String,
252282
revision: String
253283
) -> Package.Dependency {
@@ -266,12 +296,11 @@ extension Package.Dependency {
266296
/// - name: The name of the package, or nil to deduce it from the URL.
267297
/// - url: The valid Git URL of the package.
268298
/// - range: The custom version range requirement.
269-
@available(_PackageDescription, obsoleted: 5.2)
270299
public static func package(
271300
url: String,
272301
_ range: Range<Version>
273302
) -> Package.Dependency {
274-
return .package(name: nil, url: url, range)
303+
return .package(name: nil, url: url, requirement: .range(range))
275304
}
276305

277306
/// Adds a package dependency starting with a specific minimum version, up to
@@ -286,9 +315,9 @@ extension Package.Dependency {
286315
/// - name: The name of the package, or `nil` to deduce it from the URL.
287316
/// - url: The valid Git URL of the package.
288317
/// - range: The custom version range requirement.
289-
@available(_PackageDescription, introduced: 5.2)
318+
@available(_PackageDescription, introduced: 5.2, deprecated: 5.6, message: "use package(url:_:) instead")
290319
public static func package(
291-
name: String? = nil,
320+
name: String,
292321
url: String,
293322
_ range: Range<Version>
294323
) -> Package.Dependency {
@@ -307,12 +336,11 @@ extension Package.Dependency {
307336
/// - name: The name of the package, or `nil` to deduce it from the URL.
308337
/// - url: The valid Git URL of the package.
309338
/// - range: The closed version range requirement.
310-
@available(_PackageDescription, obsoleted: 5.2)
311339
public static func package(
312340
url: String,
313341
_ range: ClosedRange<Version>
314342
) -> Package.Dependency {
315-
return .package(name: nil, url: url, range)
343+
return .package(name: nil, url: url, closedRange: range)
316344
}
317345

318346
/// Adds a package dependency starting with a specific minimum version, going
@@ -327,19 +355,27 @@ extension Package.Dependency {
327355
/// - name: The name of the package, or `nil` to deduce it from the URL.
328356
/// - url: The valid Git URL of the package.
329357
/// - range: The closed version range requirement.
330-
@available(_PackageDescription, introduced: 5.2)
358+
@available(_PackageDescription, introduced: 5.2, deprecated: 5.6, message: "use package(url:_:) instead")
331359
public static func package(
332-
name: String? = nil,
360+
name: String,
333361
url: String,
334362
_ range: ClosedRange<Version>
363+
) -> Package.Dependency {
364+
return .package(name: name, url: url, closedRange: range)
365+
}
366+
367+
private static func package(
368+
name: String?,
369+
url: String,
370+
closedRange: ClosedRange<Version>
335371
) -> Package.Dependency {
336372
// Increase upperbound's patch version by one.
337-
let upper = range.upperBound
373+
let upper = closedRange.upperBound
338374
let upperBound = Version(
339375
upper.major, upper.minor, upper.patch + 1,
340376
prereleaseIdentifiers: upper.prereleaseIdentifiers,
341377
buildMetadataIdentifiers: upper.buildMetadataIdentifiers)
342-
return .package(name: name, url: url, range.lowerBound ..< upperBound)
378+
return .package(name: name, url: url, requirement: .range(closedRange.lowerBound ..< upperBound))
343379
}
344380

345381
/// Adds a package dependency that uses the exact version requirement.
@@ -363,33 +399,7 @@ extension Package.Dependency {
363399
url: String,
364400
exact version: Version
365401
) -> Package.Dependency {
366-
return .package(name: nil, url: url, exact: version)
367-
}
368-
369-
/// Adds a package dependency that uses the exact version requirement.
370-
///
371-
/// This is the recommended way to specify a remote package dependency.
372-
/// It allows you to specify the minimum version you require, allows updates that include bug fixes
373-
/// and backward-compatible feature updates, but requires you to explicitly update to a new major version of the dependency.
374-
/// This approach provides the maximum flexibility on which version to use,
375-
/// while making sure you don't update to a version with breaking changes,
376-
/// and helps to prevent conflicts in your dependency graph.
377-
///
378-
/// The following example instruct the Swift Package Manager to use version `1.2.3`.
379-
///
380-
/// .package(url: "https://example.com/example-package.git", exact: "1.2.3"),
381-
///
382-
/// - Parameters:
383-
/// - name: The name of the package, or `nil` to deduce it from the URL.
384-
/// - url: The valid Git URL of the package.
385-
/// - version: The minimum version requirement.
386-
@available(_PackageDescription, introduced: 5.6)
387-
public static func package(
388-
name: String? = nil,
389-
url: String,
390-
exact version: Version
391-
) -> Package.Dependency {
392-
return .init(name: name, location: url, requirement: .exact(version))
402+
return .package(url: url, requirement: .exact(version))
393403
}
394404

395405
/// Adds a remote package dependency given a version requirement.
@@ -398,13 +408,12 @@ extension Package.Dependency {
398408
/// - name: The name of the package, or nil to deduce it from the URL.
399409
/// - url: The valid Git URL of the package.
400410
/// - requirement: A dependency requirement. See static methods on `Package.Dependency.Requirement` for available options.
401-
@available(_PackageDescription, obsoleted: 5.2, deprecated: 5.6)
411+
@available(_PackageDescription, deprecated: 5.6, message: "use specific requirement APIs instead")
402412
public static func package(
403413
url: String,
404414
_ requirement: Package.Dependency.Requirement
405415
) -> Package.Dependency {
406-
precondition(!requirement.isLocalPackage, "Use `.package(path:)` API to declare a local package dependency")
407-
return .init(name: nil, url: url, requirement: requirement)
416+
return .package(name: nil, url: url, requirement)
408417
}
409418

410419
/// Adds a remote package dependency with a given version requirement.
@@ -413,9 +422,9 @@ extension Package.Dependency {
413422
/// - name: The name of the package, or `nil` to deduce it from the URL.
414423
/// - url: The valid Git URL of the package.
415424
/// - requirement: A dependency requirement. See static methods on `Package.Dependency.Requirement` for available options.
416-
@available(_PackageDescription, introduced: 5.2, deprecated: 5.6)
425+
@available(_PackageDescription, introduced: 5.2, deprecated: 5.6, message: "use specific requirement APIs instead")
417426
public static func package(
418-
name: String? = nil,
427+
name: String?,
419428
url: String,
420429
_ requirement: Package.Dependency.Requirement
421430
) -> Package.Dependency {
@@ -424,7 +433,6 @@ extension Package.Dependency {
424433
}
425434

426435
// intentionally private to hide enum detail
427-
@available(_PackageDescription, introduced: 5.6)
428436
private static func package(
429437
name: String? = nil,
430438
url: String,
@@ -541,16 +549,15 @@ extension Package.Dependency {
541549
}
542550
}
543551

544-
545552
// MARK: - common APIs used by mistake as unavailable to provide better error messages.
546553

547554
extension Package.Dependency {
548-
@available(*, unavailable, message: "use package(url:_:) with the .exact(Version) initializer instead")
555+
@available(*, unavailable, message: "use package(url:exact:) instead")
549556
public static func package(url: String, version: Version) -> Package.Dependency {
550557
fatalError()
551558
}
552559

553-
@available(*, unavailable, message: "use package(url:_:) without the range label instead")
560+
@available(*, unavailable, message: "use package(url:_:) instead")
554561
public static func package(url: String, range: Range<Version>) -> Package.Dependency {
555562
fatalError()
556563
}

0 commit comments

Comments
 (0)