Skip to content

Commit e887924

Browse files
authored
Add PackageIdentity type (#3057)
* Replace PackageReference.PackageIdentity with top-level PackageIdentity type * Change access level of PackageReference.computeDefaultName to internal * Extract testPackageReference into new PackageIdentityTests file * Allow package identity to be configurable via dependency injection Rename PackageIdentityTests to LegacyPackageIdentityTests * Revert change to access level of computeDefaultName, making it public * Remove LosslessStringConvertible conformance * Add documentation comment for provider type property * Add initializer that takes an AbsolutePath parameter * Remove commented @warn_unqualified_access attribute * Add argument label to public PackageIdentity initializers Distinguish between path and URL initializers at call sites
1 parent f904b5c commit e887924

29 files changed

+857
-152
lines changed

Sources/PackageCollections/PackageCollections.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ public struct PackageCollections: PackageCollectionsProtocol {
298298
}
299299

300300
func findPackage(
301-
identifier: PackageReference.PackageIdentity,
301+
identifier: PackageIdentity,
302302
profile: PackageCollectionsModel.Profile? = nil,
303303
callback: @escaping (Result<PackageCollectionsModel.PackageSearchResult.Item, Error>) -> Void
304304
) {

Sources/PackageCollections/Storage/PackageCollectionsStorage.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public protocol PackageCollectionsStorage {
6969
/// - identifier: The package identifier
7070
/// - collectionIdentifiers: Optional. The identifiers of the `PackageCollection`s
7171
/// - callback: The closure to invoke when result becomes available
72-
func findPackage(identifier: PackageReference.PackageIdentity,
72+
func findPackage(identifier: PackageIdentity,
7373
collectionIdentifiers: [PackageCollectionsModel.CollectionIdentifier]?,
7474
callback: @escaping (Result<PackageCollectionsModel.PackageSearchResult.Item, Error>) -> Void)
7575

@@ -335,7 +335,7 @@ final class SQLitePackageCollectionsStorage: PackageCollectionsStorage, Closable
335335
}
336336

337337
// TODO: this is PoC for search, need a more performant version of this
338-
func findPackage(identifier: PackageReference.PackageIdentity,
338+
func findPackage(identifier: PackageIdentity,
339339
collectionIdentifiers: [PackageCollectionsModel.CollectionIdentifier]?,
340340
callback: @escaping (Result<PackageCollectionsModel.PackageSearchResult.Item, Error>) -> Void) {
341341
self.list(identifiers: collectionIdentifiers) { result in

Sources/PackageCollections/Utility.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ extension PackageReference {
5353
/// Initializes a `PackageReference` from `RepositorySpecifier`
5454
init(repository: RepositorySpecifier, kind: PackageReference.Kind = .remote) {
5555
self.init(
56-
identity: PackageReference.computeIdentity(packageURL: repository.url),
56+
identity: PackageIdentity(url: repository.url),
5757
path: repository.url,
5858
kind: kind
5959
)

Sources/PackageGraph/PackageGraph+Loading.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ extension PackageGraph {
3838
// the URL but that shouldn't be needed after <rdar://problem/33693433>
3939
// Ensure that identity and package name are the same once we have an
4040
// API to specify identity in the manifest file
41-
let manifestMapSequence = (root.manifests + externalManifests).map({ (PackageReference.computeIdentity(packageURL: $0.url), $0) })
41+
let manifestMapSequence = (root.manifests + externalManifests).map({ (PackageIdentity(url: $0.url), $0) })
4242
let manifestMap = Dictionary(uniqueKeysWithValues: manifestMapSequence)
4343
let successors: (GraphLoadingNode) -> [GraphLoadingNode] = { node in
4444
node.requiredDependencies().compactMap({ dependency in
4545
let url = mirrors.effectiveURL(forURL: dependency.url)
46-
return manifestMap[PackageReference.computeIdentity(packageURL: url)].map { manifest in
46+
return manifestMap[PackageIdentity(url: url)].map { manifest in
4747
GraphLoadingNode(manifest: manifest, productFilter: dependency.productFilter)
4848
}
4949
})
@@ -52,11 +52,11 @@ extension PackageGraph {
5252
// Construct the root manifest and root dependencies set.
5353
let rootManifestSet = Set(root.manifests)
5454
let rootDependencies = Set(root.dependencies.compactMap({
55-
manifestMap[PackageReference.computeIdentity(packageURL: $0.url)]
55+
manifestMap[PackageIdentity(url: $0.url)]
5656
}))
5757
let rootManifestNodes = root.manifests.map { GraphLoadingNode(manifest: $0, productFilter: .everything) }
5858
let rootDependencyNodes = root.dependencies.lazy.compactMap { (dependency: PackageDependencyDescription) -> GraphLoadingNode? in
59-
guard let manifest = manifestMap[PackageReference.computeIdentity(packageURL: dependency.url)] else { return nil }
59+
guard let manifest = manifestMap[PackageIdentity(url: dependency.url)] else { return nil }
6060
return GraphLoadingNode(manifest: manifest, productFilter: dependency.productFilter)
6161
}
6262
let inputManifests = rootManifestNodes + rootDependencyNodes
@@ -209,8 +209,8 @@ private func createResolvedPackages(
209209
})
210210

211211
// Create a map of package builders keyed by the package identity.
212-
let packageMapByIdentity: [String: ResolvedPackageBuilder] = packageBuilders.spm_createDictionary{
213-
let identity = PackageReference.computeIdentity(packageURL: $0.package.manifest.url)
212+
let packageMapByIdentity: [PackageIdentity: ResolvedPackageBuilder] = packageBuilders.spm_createDictionary{
213+
let identity = PackageIdentity(url: $0.package.manifest.url)
214214
return (identity, $0)
215215
}
216216
let packageMapByName: [String: ResolvedPackageBuilder] = packageBuilders.spm_createDictionary{ ($0.package.name, $0) }
@@ -229,7 +229,7 @@ private func createResolvedPackages(
229229

230230
// Otherwise, look it up by its identity.
231231
let url = mirrors.effectiveURL(forURL: dependency.url)
232-
let resolvedPackage = packageMapByIdentity[PackageReference.computeIdentity(packageURL: url)]
232+
let resolvedPackage = packageMapByIdentity[PackageIdentity(url: url)]
233233

234234
// We check that the explicit package dependency name matches the package name.
235235
if let resolvedPackage = resolvedPackage,
@@ -360,10 +360,10 @@ private func createResolvedPackages(
360360
// dependency to share the same name. We don't check this in manifest loading for root-packages so
361361
// we can provide a more detailed diagnostic here.
362362
let referencedPackageURL = mirrors.effectiveURL(forURL: product.packageBuilder.package.manifest.url)
363-
let referencedPackageIdentity = PackageReference.computeIdentity(packageURL: referencedPackageURL)
363+
let referencedPackageIdentity = PackageIdentity(url: referencedPackageURL)
364364
let packageDependency = packageBuilder.package.manifest.dependencies.first { package in
365365
let packageURL = mirrors.effectiveURL(forURL: package.url)
366-
let packageIdentity = PackageReference.computeIdentity(packageURL: packageURL)
366+
let packageIdentity = PackageIdentity(url: packageURL)
367367
return packageIdentity == referencedPackageIdentity
368368
}!
369369

Sources/PackageGraph/PackageGraphRoot.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public struct PackageGraphRoot {
4848
/// Create a package graph root.
4949
public init(input: PackageGraphRootInput, manifests: [Manifest], explicitProduct: String? = nil) {
5050
self.packageRefs = zip(input.packages, manifests).map { (path, manifest) in
51-
let identity = PackageReference.computeIdentity(packageURL: manifest.url)
51+
let identity = PackageIdentity(url: manifest.url)
5252
return PackageReference(identity: identity, path: path.pathString, kind: .root)
5353
}
5454
self.manifests = manifests

Sources/PackageGraph/PackageModel+Extensions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ extension PackageDependencyDescription {
2323
// We should instead use the declared URL of a package dependency
2424
// as its identity, as it will be needed for supporting package
2525
// registries.
26-
let identity = PackageReference.computeIdentity(packageURL: effectiveURL)
26+
let identity = PackageIdentity(url: effectiveURL)
2727

2828
return PackageReference(
2929
identity: identity,

Sources/PackageGraph/PinsStore.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import SourceControl
1414
import PackageModel
1515

1616
public final class PinsStore {
17-
public typealias PinsMap = [PackageReference.PackageIdentity: PinsStore.Pin]
17+
public typealias PinsMap = [PackageIdentity: PinsStore.Pin]
1818

1919
public struct Pin: Equatable {
2020
/// The package reference of the pinned dependency.
@@ -135,7 +135,7 @@ extension PinsStore.Pin: JSONMappable, JSONSerializable {
135135
public init(json: JSON) throws {
136136
let name: String? = json.get("package")
137137
let url: String = try json.get("repositoryURL")
138-
let identity = PackageReference.computeIdentity(packageURL: url)
138+
let identity = PackageIdentity(url: url)
139139
let ref = PackageReference(identity: identity, path: url)
140140
self.packageRef = name.flatMap(ref.with(newName:)) ?? ref
141141
self.state = try json.get("state")

Sources/PackageGraph/Pubgrub/Incompatibility.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ extension Incompatibility {
105105
case noAvailableVersion
106106

107107
/// A version-based dependency contains unversioned-based dependency.
108-
case versionBasedDependencyContainsUnversionedDependency(versionedDependency: String, unversionedDependency: String)
108+
case versionBasedDependencyContainsUnversionedDependency(versionedDependency: PackageReference, unversionedDependency: PackageReference)
109109

110110
/// The package's tools version is incompatible.
111111
case incompatibleToolsVersion

Sources/PackageGraph/Pubgrub/PubgrubDependencyResolver.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ public final class PubgrubDependencyResolver {
396396
pinsMap: PinsStore.PinsMap = [:]
397397
) throws -> [(container: PackageReference, binding: BoundVersion, products: ProductFilter)] {
398398
let root = DependencyResolutionNode.root(package: PackageReference(
399-
identity: "<synthesized-root>",
399+
identity: PackageIdentity(url: "<synthesized-root>"),
400400
path: "<synthesized-root-path>",
401401
name: nil,
402402
kind: .root
@@ -895,7 +895,7 @@ private final class DiagnosticReportBuilder {
895895
case .conflict:
896896
break
897897
case .versionBasedDependencyContainsUnversionedDependency(let versionedDependency, let unversionedDependency):
898-
return "package \(versionedDependency) is required using a version-based requirement and it depends on unversion package \(unversionedDependency)"
898+
return "package \(versionedDependency.identity) is required using a version-based requirement and it depends on unversion package \(unversionedDependency.identity)"
899899
case .incompatibleToolsVersion:
900900
let term = incompatibility.terms.first!
901901
return "\(description(for: term, normalizeRange: true)) contains incompatible tools version"
@@ -979,7 +979,7 @@ private final class DiagnosticReportBuilder {
979979

980980
// FIXME: This is duplicated and wrong.
981981
private func isFailure(_ incompatibility: Incompatibility) -> Bool {
982-
return incompatibility.terms.count == 1 && incompatibility.terms.first?.node.package.identity == "<synthesized-root>"
982+
return incompatibility.terms.count == 1 && incompatibility.terms.first?.node.package.identity == PackageIdentity(url: "<synthesized-root>")
983983
}
984984

985985
private func description(for term: Term, normalizeRange: Bool = false) -> String {
@@ -1180,8 +1180,8 @@ private final class PubGrubPackageContainer {
11801180
// Version-based packages are not allowed to contain unversioned dependencies.
11811181
guard case .versionSet = dep.requirement else {
11821182
let cause: Incompatibility.Cause = .versionBasedDependencyContainsUnversionedDependency(
1183-
versionedDependency: package.identity,
1184-
unversionedDependency: dep.identifier.identity)
1183+
versionedDependency: package,
1184+
unversionedDependency: dep.identifier)
11851185
return [Incompatibility(Term(node, .exact(version)), root: root, cause: cause)]
11861186
}
11871187

Sources/PackageLoading/ManifestLoader.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ public final class ManifestLoader: ManifestLoaderProtocol {
268268
}
269269

270270
// Get the JSON string for the manifest.
271-
let identity = PackageReference.computeIdentity(packageURL: baseURL)
271+
let identity = PackageIdentity(url: baseURL)
272272
let jsonString = try loadJSONString(
273273
path: inputPath,
274274
toolsVersion: toolsVersion,
@@ -388,7 +388,7 @@ public final class ManifestLoader: ManifestLoaderProtocol {
388388
diagnostics: DiagnosticsEngine?
389389
) throws {
390390
let dependenciesByIdentity = Dictionary(grouping: manifest.dependencies, by: { dependency in
391-
PackageReference.computeIdentity(packageURL: dependency.url)
391+
PackageIdentity(url: dependency.url)
392392
})
393393

394394
let duplicateDependencyIdentities = dependenciesByIdentity
@@ -476,7 +476,7 @@ public final class ManifestLoader: ManifestLoaderProtocol {
476476
private func loadJSONString(
477477
path inputPath: AbsolutePath,
478478
toolsVersion: ToolsVersion,
479-
packageIdentity: String,
479+
packageIdentity: PackageIdentity,
480480
fs: FileSystem? = nil,
481481
diagnostics: DiagnosticsEngine? = nil
482482
) throws -> String {
@@ -560,7 +560,7 @@ public final class ManifestLoader: ManifestLoaderProtocol {
560560
}
561561

562562
fileprivate struct ManifestCacheKey {
563-
let packageIdentity: String
563+
let packageIdentity: PackageIdentity
564564
let pathOrContents: ManifestPathOrContents
565565
let toolsVersion: ToolsVersion
566566
let env: [String: String]
@@ -621,7 +621,7 @@ public final class ManifestLoader: ManifestLoaderProtocol {
621621

622622
/// Parse the manifest at the given path to JSON.
623623
fileprivate func parse(
624-
packageIdentity: String,
624+
packageIdentity: PackageIdentity,
625625
pathOrContents: ManifestPathOrContents,
626626
toolsVersion: ToolsVersion
627627
) -> ManifestParseResult {
@@ -706,7 +706,7 @@ public final class ManifestLoader: ManifestLoaderProtocol {
706706
// Add the arguments for emitting serialized diagnostics, if requested.
707707
if serializedDiagnostics, cacheDir != nil {
708708
let diaDir = cacheDir.appending(component: "ManifestLoading")
709-
let diagnosticFile = diaDir.appending(component: packageIdentity + ".dia")
709+
let diagnosticFile = diaDir.appending(component: "\(packageIdentity).dia")
710710
try localFileSystem.createDirectory(diaDir, recursive: true)
711711
cmd += ["-Xfrontend", "-serialize-diagnostics-path", "-Xfrontend", diagnosticFile.pathString]
712712
manifestParseResult.diagnosticFile = diagnosticFile
@@ -939,7 +939,7 @@ extension TSCBasic.Diagnostic.Message {
939939
.error("invalid type for binary product '\(productName)'; products referencing only binary targets must have a type of 'library'")
940940
}
941941

942-
static func duplicateDependency(dependencyIdentity: String) -> Self {
942+
static func duplicateDependency(dependencyIdentity: PackageIdentity) -> Self {
943943
.error("duplicate dependency '\(dependencyIdentity)'")
944944
}
945945

Sources/PackageModel/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ add_library(PackageModel
2222
ManifestSourceGeneration.swift
2323
ModuleMapType.swift
2424
Package.swift
25+
PackageIdentity.swift
2526
PackageReference.swift
2627
Platform.swift
2728
Product.swift

0 commit comments

Comments
 (0)