Skip to content

Commit 1e5474d

Browse files
committed
Add source control URL to PackageReference.Kind.registry
To track all packages that have been mapped from a source control URL, this change adds another associated value to the registry enum case for a PackageReference.Kind and persists this information in the Package.resolved so every subsequent run the Workspace can derive an identity map. This will assure that if a user were to also rely on a lock-file behaviour from the Package.resolved (by passing --force-resolved-versions or equivalent), that SwiftPM can successfully resolve without needing to hit the registry endpoints.
1 parent 8073996 commit 1e5474d

23 files changed

Lines changed: 162 additions & 48 deletions

Sources/PackageGraph/PackageModel+Extensions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ extension PackageDependency {
2727
packageKind = .remoteSourceControl(url)
2828
}
2929
case .registry(let settings):
30-
packageKind = .registry(settings.identity)
30+
packageKind = .registry(settings.identity, settings.sourceControlURL)
3131
}
3232
return PackageReference(identity: self.identity, kind: packageKind)
3333
}

Sources/PackageGraph/ResolvedPackagesStore.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,21 +439,24 @@ private struct ResolvedPackagesStorage {
439439
let identity: PackageIdentity
440440
let kind: Kind
441441
let location: String
442+
let originalLocation: String?
442443
let state: State
443444

444445
init(_ pin: ResolvedPackagesStore.ResolvedPackage, mirrors: DependencyMirrors) throws {
445446
let kind: Kind
446447
let location: String
448+
var originalLocation: String? = nil
447449
switch pin.packageRef.kind {
448450
case .localSourceControl(let path):
449451
kind = .localSourceControl
450452
location = path.pathString
451453
case .remoteSourceControl(let url):
452454
kind = .remoteSourceControl
453455
location = url.absoluteString
454-
case .registry:
456+
case .registry(_, let originalURL):
455457
kind = .registry
456458
location = "" // FIXME: this is likely not correct
459+
originalLocation = originalURL?.absoluteString
457460
default:
458461
throw StringError("invalid package type \(pin.packageRef.kind)")
459462
}
@@ -463,6 +466,7 @@ private struct ResolvedPackagesStorage {
463466
// rdar://52529014, rdar://52529011: pin file should store the original location but remap when loading
464467
self.location = mirrors.original(for: location) ?? location
465468
self.state = .init(pin.state)
469+
self.originalLocation = originalLocation
466470
}
467471
}
468472

@@ -564,7 +568,7 @@ extension ResolvedPackagesStore.ResolvedPackage {
564568
case .remoteSourceControl:
565569
packageRef = .remoteSourceControl(identity: identity, url: SourceControlURL(location))
566570
case .registry:
567-
packageRef = .registry(identity: identity)
571+
packageRef = .registry(identity: identity, originalURL: pin.originalLocation)
568572
}
569573
self.init(
570574
packageRef: packageRef,

Sources/PackageLoading/ManifestJSONParser.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ enum ManifestJSONParser {
9999
dependency: $0,
100100
toolsVersion: toolsVersion,
101101
parentPackagePath: packagePath,
102-
identityResolver: identityResolver,
102+
// identityResolver: identityResolver,
103103
dependencyMapper: dependencyMapper,
104104
fileSystem: fileSystem
105105
)
@@ -166,7 +166,7 @@ enum ManifestJSONParser {
166166
dependency: Serialization.PackageDependency,
167167
toolsVersion: ToolsVersion,
168168
parentPackagePath: AbsolutePath,
169-
identityResolver: IdentityResolver,
169+
// identityResolver: IdentityResolver,
170170
dependencyMapper: DependencyMapper,
171171
fileSystem: FileSystem
172172
) throws -> PackageDependency {

Sources/PackageLoading/ManifestLoader.swift

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,11 @@ public protocol ManifestLoaderProtocol {
125125
dependencyMapper: DependencyMapper,
126126
fileSystem: FileSystem,
127127
observabilityScope: ObservabilityScope,
128-
delegateQueue: DispatchQueue
128+
delegateQueue: DispatchQueue,
129+
identityLookupCache: ThreadSafeKeyValueStore<
130+
SourceControlURL,
131+
(result: Result<PackageIdentity?, Error>, expirationTime: DispatchTime)
132+
>
129133
) async throws -> Manifest
130134

131135
/// Reset any internal cache held by the manifest loader.
@@ -198,7 +202,11 @@ extension ManifestLoaderProtocol {
198202
dependencyMapper: DependencyMapper,
199203
fileSystem: FileSystem,
200204
observabilityScope: ObservabilityScope,
201-
delegateQueue: DispatchQueue
205+
delegateQueue: DispatchQueue,
206+
identityLookupCache: ThreadSafeKeyValueStore<
207+
SourceControlURL,
208+
(result: Result<PackageIdentity?, Error>, expirationTime: DispatchTime)
209+
>
202210
) async throws -> Manifest {
203211
// find the manifest path and parse it's tools-version
204212
let manifestPath = try ManifestLoader.findManifest(
@@ -225,7 +233,8 @@ extension ManifestLoaderProtocol {
225233
dependencyMapper: dependencyMapper,
226234
fileSystem: fileSystem,
227235
observabilityScope: observabilityScope,
228-
delegateQueue: delegateQueue
236+
delegateQueue: delegateQueue,
237+
identityLookupCache: identityLookupCache
229238
)
230239
}
231240
}
@@ -310,7 +319,11 @@ public final class ManifestLoader: ManifestLoaderProtocol {
310319
dependencyMapper: DependencyMapper,
311320
fileSystem: FileSystem,
312321
observabilityScope: ObservabilityScope,
313-
delegateQueue: DispatchQueue
322+
delegateQueue: DispatchQueue,
323+
identityLookupCache: ThreadSafeKeyValueStore<
324+
SourceControlURL,
325+
(result: Result<PackageIdentity?, Error>, expirationTime: DispatchTime)
326+
>
314327
) async throws -> Manifest {
315328
// Inform the delegate.
316329
let start = DispatchTime.now()

Sources/PackageModel/IdentityResolver.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public struct DefaultIdentityResolver: IdentityResolver {
4444
return try self.resolveIdentity(for: path)
4545
case .remoteSourceControl(let url):
4646
return try self.resolveIdentity(for: url)
47-
case .registry(let identity):
47+
case .registry(let identity, _):
4848
return identity
4949
}
5050
}

Sources/PackageModel/Manifest/PackageDependencyDescription.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ public enum PackageDependency: Equatable, Hashable, Sendable {
163163
public let requirement: Requirement
164164
public let productFilter: ProductFilter
165165
package let traits: Set<Trait>?
166+
public let sourceControlURL: SourceControlURL?
166167

167168
/// The dependency requirement.
168169
public enum Requirement: Equatable, Hashable, Sendable {
@@ -435,14 +436,16 @@ public enum PackageDependency: Equatable, Hashable, Sendable {
435436
identity: PackageIdentity,
436437
requirement: Registry.Requirement,
437438
productFilter: ProductFilter,
438-
traits: Set<Trait>?
439+
traits: Set<Trait>?,
440+
sourceControlURL: SourceControlURL? = nil
439441
) -> Self {
440442
.registry(
441443
.init(
442444
identity: identity,
443445
requirement: requirement,
444446
productFilter: productFilter,
445-
traits: traits
447+
traits: traits,
448+
sourceControlURL: sourceControlURL
446449
)
447450
)
448451
}

Sources/PackageModel/PackageReference.swift

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public struct PackageReference {
3232
case remoteSourceControl(SourceControlURL)
3333

3434
/// A package from a registry.
35-
case registry(PackageIdentity)
35+
case registry(PackageIdentity, SourceControlURL?)
3636

3737
// FIXME: we should not need this once we migrate off URLs
3838
//@available(*, deprecated)
@@ -46,7 +46,7 @@ public struct PackageReference {
4646
return path.pathString
4747
case .remoteSourceControl(let url):
4848
return url.absoluteString
49-
case .registry(let identity):
49+
case .registry(let identity, _):
5050
// FIXME: this is a placeholder
5151
return identity.description
5252
}
@@ -68,7 +68,7 @@ public struct PackageReference {
6868
return "localSourceControl \(path)"
6969
case .remoteSourceControl(let url):
7070
return "remoteSourceControl \(url)"
71-
case .registry(let identity):
71+
case .registry(let identity, _):
7272
return "registry \(identity)"
7373
}
7474
}
@@ -130,7 +130,7 @@ public struct PackageReference {
130130
self.deprecatedName = name ?? PackageIdentityParser.computeDefaultName(fromPath: path)
131131
case .remoteSourceControl(let url):
132132
self.deprecatedName = name ?? PackageIdentityParser.computeDefaultName(fromURL: url)
133-
case .registry(let identity):
133+
case .registry(let identity, _):
134134
// FIXME: this is a placeholder
135135
self.deprecatedName = name ?? identity.description
136136
}
@@ -157,8 +157,14 @@ public struct PackageReference {
157157
PackageReference(identity: identity, kind: .remoteSourceControl(url))
158158
}
159159

160-
public static func registry(identity: PackageIdentity) -> PackageReference {
161-
PackageReference(identity: identity, kind: .registry(identity))
160+
public static func registry(identity: PackageIdentity, originalURL: String?) -> PackageReference {
161+
let originalURL: SourceControlURL? = if let originalURL {
162+
SourceControlURL(originalURL)
163+
} else {
164+
nil
165+
}
166+
167+
return PackageReference(identity: identity, kind: .registry(identity, originalURL))
162168
}
163169
}
164170

Sources/PackageRegistry/RegistryClient.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,6 @@ public final class RegistryClient: AsyncCancellable {
640640
observabilityScope: ObservabilityScope
641641
) async throws -> String {
642642
let (registryIdentity, registry) = try self.unwrapRegistry(from: package)
643-
644643
try await withAvailabilityCheck(
645644
registry: registry,
646645
observabilityScope: observabilityScope
@@ -806,6 +805,7 @@ public final class RegistryClient: AsyncCancellable {
806805

807806
// first get the release metadata
808807
// TODO: this should be included in the archive to save the extra HTTP call
808+
print("getting source archive for registry")
809809
let versionMetadata = try await self.getPackageVersionMetadata(
810810
package: package,
811811
version: version,

Sources/PackageRegistry/RegistryDownloadsManager.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public class RegistryDownloadsManager: AsyncCancellable {
5656
version: Version,
5757
observabilityScope: ObservabilityScope
5858
) async throws -> Basics.AbsolutePath {
59+
print("BP performing lookup for package \(package) in registrydownloadsmanager")
5960
let packageRelativePath: Basics.RelativePath
6061
let packagePath: Basics.AbsolutePath
6162

Sources/PackageRegistry/SignatureValidation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ extension ObservabilityMetadata {
649649
public static func registryPackageMetadata(identity: PackageIdentity.RegistryIdentity) -> Self {
650650
var metadata = ObservabilityMetadata()
651651
metadata.packageIdentity = identity.underlying
652-
metadata.packageKind = .registry(identity.underlying)
652+
metadata.packageKind = .registry(identity.underlying, nil)
653653
return metadata
654654
}
655655
}

0 commit comments

Comments
 (0)