Skip to content

Commit 9e9fab2

Browse files
authored
initial integration of registry dependencies (#3863)
motivation: support registry dependencies changes: * make PinStore::state more generic (instead of CheckoutState) so it can handle non-checkout dependencies state * clean up CheckoutState and move it to the Workspace module where it belongs * wire calls to fetch and delete registry dependencies as part of dependency resolution in Workspace * adjust call-sites tests * adjust to registry client changes
1 parent 56dfe45 commit 9e9fab2

22 files changed

+1060
-593
lines changed

Sources/Commands/SwiftTool.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,3 +1170,10 @@ extension SwiftToolOptions {
11701170
}
11711171
}
11721172
}
1173+
1174+
extension Workspace.ManagedDependency {
1175+
fileprivate var isEdited: Bool {
1176+
if case .edited = self.state { return true }
1177+
return false
1178+
}
1179+
}

Sources/PackageGraph/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
add_library(PackageGraph
1010
BoundVersion.swift
11-
CheckoutState.swift
1211
DependencyMirrors.swift
1312
DependencyResolutionNode.swift
1413
DependencyResolver.swift

Sources/PackageGraph/CheckoutState.swift

Lines changed: 0 additions & 72 deletions
This file was deleted.

Sources/PackageGraph/PackageModel+Extensions.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,8 @@ extension PackageDependency {
2525
case .remote(let url):
2626
packageKind = .remoteSourceControl(url)
2727
}
28-
case .registry:
29-
// FIXME
30-
fatalError("registry based dependencies not implemented yet")
28+
case .registry(let settings):
29+
packageKind = .registry(settings.identity)
3130
}
3231
return PackageReference(identity: self.identity, kind: packageKind)
3332
}

Sources/PackageGraph/PinsStore.swift

Lines changed: 97 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,31 @@ public final class PinsStore {
2222
public let packageRef: PackageReference
2323

2424
/// The pinned state.
25-
public let state: CheckoutState
25+
public let state: PinState
2626

27-
public init(packageRef: PackageReference, state: CheckoutState) {
27+
public init(packageRef: PackageReference, state: PinState) {
2828
self.packageRef = packageRef
2929
self.state = state
3030
}
3131
}
3232

33+
public enum PinState: Equatable, CustomStringConvertible {
34+
case branch(name: String, revision: String)
35+
case version(_ version: Version, revision: String?)
36+
case revision(_ revision: String)
37+
38+
public var description: String {
39+
switch self {
40+
case .version(let version, _):
41+
return version.description
42+
case .branch(let name, _):
43+
return name
44+
case .revision(let revision):
45+
return revision
46+
}
47+
}
48+
}
49+
3350
private let mirrors: DependencyMirrors
3451

3552
/// storage
@@ -70,7 +87,7 @@ public final class PinsStore {
7087
/// - Parameters:
7188
/// - packageRef: The package reference to pin.
7289
/// - state: The state to pin at.
73-
public func pin(packageRef: PackageReference, state: CheckoutState) {
90+
public func pin(packageRef: PackageReference, state: PinState) {
7491
self.add(.init(
7592
packageRef: packageRef,
7693
state: state
@@ -169,12 +186,12 @@ fileprivate struct PinsStorage {
169186
let container = try V1(pins: pins, mirrors: mirrors)
170187
data = try self.encoder.encode(container)
171188
}
172-
#if !os(Windows)
189+
#if !os(Windows)
173190
// rdar://83646952: add newline for POSIXy systems
174191
if data.last != 0x0a {
175192
data.append(0x0a)
176193
}
177-
#endif
194+
#endif
178195
try self.fileSystem.writeFileContents(self.path, data: data)
179196
}
180197
}
@@ -221,7 +238,7 @@ fileprivate struct PinsStorage {
221238
struct Pin: Codable {
222239
let package: String?
223240
let repositoryURL: String
224-
let state: CheckoutInfo
241+
let state: State
225242

226243
init(_ pin: PinsStore.Pin, mirrors: DependencyMirrors) throws {
227244
let location: String
@@ -237,7 +254,32 @@ fileprivate struct PinsStorage {
237254
self.package = pin.packageRef.deprecatedName
238255
// rdar://52529014, rdar://52529011: pin file should store the original location but remap when loading
239256
self.repositoryURL = mirrors.originalURL(for: location) ?? location
240-
self.state = .init(pin.state)
257+
self.state = try .init(pin.state)
258+
}
259+
}
260+
261+
struct State: Codable {
262+
let revision: String
263+
let branch: String?
264+
let version: String?
265+
266+
init(_ state: PinsStore.PinState) throws {
267+
switch state {
268+
case .version(let version, let revision) where revision != nil:
269+
self.version = version.description
270+
self.branch = nil
271+
self.revision = revision! // nil guarded above in case
272+
case .branch(let branch, let revision):
273+
self.version = nil
274+
self.branch = branch
275+
self.revision = revision
276+
case .revision(let revision):
277+
self.version = nil
278+
self.branch = nil
279+
self.revision = revision
280+
default:
281+
throw StringError("invalid pin state: \(state)")
282+
}
241283
}
242284
}
243285
}
@@ -260,7 +302,7 @@ fileprivate struct PinsStorage {
260302
let identity: PackageIdentity
261303
let kind: Kind
262304
let location: String
263-
let state: CheckoutInfo
305+
let state: State
264306

265307
init(_ pin: PinsStore.Pin, mirrors: DependencyMirrors) throws {
266308
let kind: Kind
@@ -272,6 +314,9 @@ fileprivate struct PinsStorage {
272314
case .remoteSourceControl(let url):
273315
kind = .remoteSourceControl
274316
location = url.absoluteString
317+
case .registry:
318+
kind = .registry
319+
location = "" // FIXME: this is likely not correct
275320
default:
276321
throw StringError("invalid package type \(pin.packageRef.kind)")
277322
}
@@ -287,28 +332,29 @@ fileprivate struct PinsStorage {
287332
enum Kind: String, Codable {
288333
case localSourceControl
289334
case remoteSourceControl
335+
case registry
290336
}
291-
}
292337

293-
struct CheckoutInfo: Codable {
294-
let revision: String
295-
let branch: String?
296-
let version: String?
297-
298-
init(_ state: CheckoutState) {
299-
switch state {
300-
case .version(let version, let revision):
301-
self.version = version.description
302-
self.branch = nil
303-
self.revision = revision.identifier
304-
case .branch(let branch, let revision):
305-
self.version = nil
306-
self.branch = branch
307-
self.revision = revision.identifier
308-
case .revision(let revision):
309-
self.version = nil
310-
self.branch = nil
311-
self.revision = revision.identifier
338+
struct State: Codable {
339+
let version: String?
340+
let branch: String?
341+
let revision: String?
342+
343+
init(_ state: PinsStore.PinState) {
344+
switch state {
345+
case .version(let version, let revision):
346+
self.version = version.description
347+
self.branch = nil
348+
self.revision = revision
349+
case .branch(let branch, let revision):
350+
self.version = nil
351+
self.branch = branch
352+
self.revision = revision
353+
case .revision(let revision):
354+
self.version = nil
355+
self.branch = nil
356+
self.revision = revision
357+
}
312358
}
313359
}
314360
}
@@ -337,6 +383,19 @@ extension PinsStore.Pin {
337383
}
338384
}
339385

386+
extension PinsStore.PinState {
387+
fileprivate init(_ state: PinsStorage.V1.State) throws {
388+
let revision = state.revision
389+
if let version = state.version {
390+
self = try .version(Version(versionString: version), revision: revision)
391+
} else if let branch = state.branch {
392+
self = .branch(name: branch, revision: revision)
393+
} else {
394+
self = .revision(revision)
395+
}
396+
}
397+
}
398+
340399
extension PinsStore.Pin {
341400
fileprivate init(_ pin: PinsStorage.V2.Pin, mirrors: DependencyMirrors) throws {
342401
let packageRef: PackageReference
@@ -351,6 +410,8 @@ extension PinsStore.Pin {
351410
throw StringError("invalid url location: \(location)")
352411
}
353412
packageRef = .remoteSourceControl(identity: identity, url: url)
413+
case .registry:
414+
packageRef = .registry(identity: identity)
354415
}
355416
self.init(
356417
packageRef: packageRef,
@@ -359,15 +420,16 @@ extension PinsStore.Pin {
359420
}
360421
}
361422

362-
extension CheckoutState {
363-
fileprivate init(_ state: PinsStorage.CheckoutInfo) throws {
364-
let revision: Revision = .init(identifier: state.revision)
365-
if let branch = state.branch {
423+
extension PinsStore.PinState {
424+
fileprivate init(_ state: PinsStorage.V2.State) throws {
425+
if let version = state.version {
426+
self = try .version(Version(versionString: version), revision: state.revision)
427+
} else if let branch = state.branch, let revision = state.revision {
366428
self = .branch(name: branch, revision: revision)
367-
} else if let version = state.version {
368-
self = try .version(Version(versionString: version), revision: revision)
369-
} else {
429+
} else if let revision = state.revision {
370430
self = .revision(revision)
431+
} else {
432+
throw StringError("invalid pin state: \(state)")
371433
}
372434
}
373435
}

Sources/PackageGraph/Pubgrub/PubgrubDependencyResolver.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ public struct PubgrubDependencyResolver {
346346
// already a commit, then its pin entry doesn't matter in practice.
347347
let revisionForDependencies: String
348348
if case .branch(revision, let pinRevision) = pinsMap[package.identity]?.state {
349-
revisionForDependencies = pinRevision.identifier
349+
revisionForDependencies = pinRevision
350350

351351
// Mark the package as overridden with the pinned revision and record the branch as well.
352352
overriddenPackages[package] = (version: .revision(revisionForDependencies, branch: revision), products: constraint.products)

0 commit comments

Comments
 (0)