@@ -122,14 +122,22 @@ fileprivate struct PinsStorage {
122
122
return try self . fileSystem. withLock ( on: self . lockFilePath, type: . shared) {
123
123
let version = try self . decoder. decode ( path: self . path, fileSystem: self . fileSystem, as: Version . self)
124
124
switch version. version {
125
- case 1 :
125
+ case V1 . version :
126
126
let v1 = try decoder. decode ( path: self . path, fileSystem: self . fileSystem, as: V1 . self)
127
127
return try v1. object. pins. map { try PinsStore . Pin ( $0, mirrors: mirrors) } . reduce ( into: [ PackageIdentity: PinsStore . Pin] ( ) ) { partial, iterator in
128
128
if partial. keys. contains ( iterator. packageRef. identity) {
129
129
throw StringError ( " duplicated entry for package \" \( iterator. packageRef. name) \" " )
130
130
}
131
131
partial [ iterator. packageRef. identity] = iterator
132
132
}
133
+ case V2 . version:
134
+ let v2 = try decoder. decode ( path: self . path, fileSystem: self . fileSystem, as: V2 . self)
135
+ return try v2. pins. map { try PinsStore . Pin ( $0, mirrors: mirrors) } . reduce ( into: [ PackageIdentity: PinsStore . Pin] ( ) ) { partial, iterator in
136
+ if partial. keys. contains ( iterator. packageRef. identity) {
137
+ throw StringError ( " duplicated entry for package \" \( iterator. packageRef. identity) \" " )
138
+ }
139
+ partial [ iterator. packageRef. identity] = iterator
140
+ }
133
141
default :
134
142
throw InternalError ( " unknown RepositoryManager version: \( version) " )
135
143
}
@@ -150,7 +158,7 @@ fileprivate struct PinsStorage {
150
158
return
151
159
}
152
160
153
- let container = V1 ( pins: pins, mirrors: mirrors)
161
+ let container = V2 ( pins: pins, mirrors: mirrors)
154
162
let data = try self . encoder. encode ( container)
155
163
try self . fileSystem. writeFileContents ( self . path, data: data)
156
164
}
@@ -172,11 +180,13 @@ fileprivate struct PinsStorage {
172
180
173
181
// v1 storage format
174
182
struct V1 : Codable {
183
+ static let version = 1
184
+
175
185
let version : Int
176
186
let object : Container
177
187
178
188
init ( pins: PinsStore . PinsMap , mirrors: DependencyMirrors ) {
179
- self . version = 1
189
+ self . version = Self . version
180
190
self . object = . init(
181
191
pins: pins. values
182
192
. sorted ( by: { $0. packageRef. identity < $1. packageRef. identity } )
@@ -200,27 +210,55 @@ fileprivate struct PinsStorage {
200
210
self . state = . init( pin. state)
201
211
}
202
212
}
213
+ }
203
214
204
- struct CheckoutInfo : Codable {
205
- let revision : String
206
- let branch : String ?
207
- let version : String ?
208
-
209
- init ( _ state: CheckoutState ) {
210
- switch state {
211
- case . version( let version, let revision) :
212
- self . version = version. description
213
- self . branch = nil
214
- self . revision = revision. identifier
215
- case . branch( let branch, let revision) :
216
- self . version = nil
217
- self . branch = branch
218
- self . revision = revision. identifier
219
- case . revision( let revision) :
220
- self . version = nil
221
- self . branch = nil
222
- self . revision = revision. identifier
223
- }
215
+ // v2 storage format
216
+ struct V2 : Codable {
217
+ static let version = 2
218
+
219
+ let version : Int
220
+ let pins : [ Pin ]
221
+
222
+ init ( pins: PinsStore . PinsMap , mirrors: DependencyMirrors ) {
223
+ self . version = Self . version
224
+ self . pins = pins. values
225
+ . sorted ( by: { $0. packageRef. identity < $1. packageRef. identity } )
226
+ . map { Pin ( $0, mirrors: mirrors) }
227
+ }
228
+
229
+ struct Pin : Codable {
230
+ let identity : PackageIdentity
231
+ let location : String
232
+ let state : CheckoutInfo
233
+
234
+ init ( _ pin: PinsStore . Pin , mirrors: DependencyMirrors ) {
235
+ self . identity = pin. packageRef. identity
236
+ // rdar://52529014, rdar://52529011: pin file should store the original location but remap when loading
237
+ self . location = mirrors. originalURL ( for: pin. packageRef. location) ?? pin. packageRef. location
238
+ self . state = . init( pin. state)
239
+ }
240
+ }
241
+ }
242
+
243
+ struct CheckoutInfo : Codable {
244
+ let revision : String
245
+ let branch : String ?
246
+ let version : String ?
247
+
248
+ init ( _ state: CheckoutState ) {
249
+ switch state {
250
+ case . version( let version, let revision) :
251
+ self . version = version. description
252
+ self . branch = nil
253
+ self . revision = revision. identifier
254
+ case . branch( let branch, let revision) :
255
+ self . version = nil
256
+ self . branch = branch
257
+ self . revision = revision. identifier
258
+ case . revision( let revision) :
259
+ self . version = nil
260
+ self . branch = nil
261
+ self . revision = revision. identifier
224
262
}
225
263
}
226
264
}
@@ -242,8 +280,21 @@ extension PinsStore.Pin {
242
280
}
243
281
}
244
282
283
+ extension PinsStore . Pin {
284
+ fileprivate init ( _ pin: PinsStorage . V2 . Pin , mirrors: DependencyMirrors ) throws {
285
+ // rdar://52529014, rdar://52529011: pin file should store the original location but remap when loading
286
+ let url = mirrors. effectiveURL ( for: pin. location)
287
+ let identity = pin. identity
288
+ let packageRef = PackageReference . remote ( identity: identity, location: url)
289
+ self . init (
290
+ packageRef: packageRef,
291
+ state: try . init( pin. state)
292
+ )
293
+ }
294
+ }
295
+
245
296
extension CheckoutState {
246
- fileprivate init ( _ state: PinsStorage . V1 . CheckoutInfo ) throws {
297
+ fileprivate init ( _ state: PinsStorage . CheckoutInfo ) throws {
247
298
let revision : Revision = . init( identifier: state. revision)
248
299
if let branch = state. branch {
249
300
self = . branch( name: branch, revision: revision)
0 commit comments