@@ -22,14 +22,31 @@ public final class PinsStore {
22
22
public let packageRef : PackageReference
23
23
24
24
/// The pinned state.
25
- public let state : CheckoutState
25
+ public let state : PinState
26
26
27
- public init ( packageRef: PackageReference , state: CheckoutState ) {
27
+ public init ( packageRef: PackageReference , state: PinState ) {
28
28
self . packageRef = packageRef
29
29
self . state = state
30
30
}
31
31
}
32
32
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
+
33
50
private let mirrors : DependencyMirrors
34
51
35
52
/// storage
@@ -70,7 +87,7 @@ public final class PinsStore {
70
87
/// - Parameters:
71
88
/// - packageRef: The package reference to pin.
72
89
/// - state: The state to pin at.
73
- public func pin( packageRef: PackageReference , state: CheckoutState ) {
90
+ public func pin( packageRef: PackageReference , state: PinState ) {
74
91
self . add ( . init(
75
92
packageRef: packageRef,
76
93
state: state
@@ -169,12 +186,12 @@ fileprivate struct PinsStorage {
169
186
let container = try V1 ( pins: pins, mirrors: mirrors)
170
187
data = try self . encoder. encode ( container)
171
188
}
172
- #if !os(Windows)
189
+ #if !os(Windows)
173
190
// rdar://83646952: add newline for POSIXy systems
174
191
if data. last != 0x0a {
175
192
data. append ( 0x0a )
176
193
}
177
- #endif
194
+ #endif
178
195
try self . fileSystem. writeFileContents ( self . path, data: data)
179
196
}
180
197
}
@@ -221,7 +238,7 @@ fileprivate struct PinsStorage {
221
238
struct Pin : Codable {
222
239
let package : String ?
223
240
let repositoryURL : String
224
- let state : CheckoutInfo
241
+ let state : State
225
242
226
243
init ( _ pin: PinsStore . Pin , mirrors: DependencyMirrors ) throws {
227
244
let location : String
@@ -237,7 +254,32 @@ fileprivate struct PinsStorage {
237
254
self . package = pin. packageRef. deprecatedName
238
255
// rdar://52529014, rdar://52529011: pin file should store the original location but remap when loading
239
256
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
+ }
241
283
}
242
284
}
243
285
}
@@ -260,7 +302,7 @@ fileprivate struct PinsStorage {
260
302
let identity : PackageIdentity
261
303
let kind : Kind
262
304
let location : String
263
- let state : CheckoutInfo
305
+ let state : State
264
306
265
307
init ( _ pin: PinsStore . Pin , mirrors: DependencyMirrors ) throws {
266
308
let kind : Kind
@@ -272,6 +314,9 @@ fileprivate struct PinsStorage {
272
314
case . remoteSourceControl( let url) :
273
315
kind = . remoteSourceControl
274
316
location = url. absoluteString
317
+ case . registry:
318
+ kind = . registry
319
+ location = " " // FIXME: this is likely not correct
275
320
default :
276
321
throw StringError ( " invalid package type \( pin. packageRef. kind) " )
277
322
}
@@ -287,28 +332,29 @@ fileprivate struct PinsStorage {
287
332
enum Kind : String , Codable {
288
333
case localSourceControl
289
334
case remoteSourceControl
335
+ case registry
290
336
}
291
- }
292
337
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
+ }
312
358
}
313
359
}
314
360
}
@@ -337,6 +383,19 @@ extension PinsStore.Pin {
337
383
}
338
384
}
339
385
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
+
340
399
extension PinsStore . Pin {
341
400
fileprivate init ( _ pin: PinsStorage . V2 . Pin , mirrors: DependencyMirrors ) throws {
342
401
let packageRef : PackageReference
@@ -351,6 +410,8 @@ extension PinsStore.Pin {
351
410
throw StringError ( " invalid url location: \( location) " )
352
411
}
353
412
packageRef = . remoteSourceControl( identity: identity, url: url)
413
+ case . registry:
414
+ packageRef = . registry( identity: identity)
354
415
}
355
416
self . init (
356
417
packageRef: packageRef,
@@ -359,15 +420,16 @@ extension PinsStore.Pin {
359
420
}
360
421
}
361
422
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 {
366
428
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 {
370
430
self = . revision( revision)
431
+ } else {
432
+ throw StringError ( " invalid pin state: \( state) " )
371
433
}
372
434
}
373
435
}
0 commit comments