@@ -54,8 +54,13 @@ enum ManifestJSONParser {
54
54
manifest. swiftLanguageVersions = try Self . parseSwiftLanguageVersion ( package )
55
55
manifest. products = try package . getArray ( " products " ) . map ( ProductDescription . init ( v4: ) )
56
56
manifest. providers = try ? package . getArray ( " providers " ) . map ( SystemPackageProviderDescription . init ( v4: ) )
57
- manifest. targets = try package . getArray ( " targets " ) . map ( Self . parseTarget ( json: ) )
58
- manifest. dependencies = try package . getArray ( " dependencies " ) . map {
57
+ manifest. targets = try package . getArray ( " targets " ) . map {
58
+ try Self . parseTarget (
59
+ json: $0,
60
+ identityResolver: identityResolver
61
+ )
62
+ }
63
+ manifest. dependencies = try package . getArray ( " dependencies " ) . map {
59
64
try Self . parseDependency (
60
65
json: $0,
61
66
toolsVersion: toolsVersion,
@@ -97,29 +102,35 @@ enum ManifestJSONParser {
97
102
if type == " fileSystem " {
98
103
let name : String ? = kindJSON. get ( " name " )
99
104
let path : String = try kindJSON. get ( " path " )
100
- return try Self . makeFileSystemDependency (
105
+ return try Self . parseFileSystemDependency (
101
106
packageKind: packageKind,
102
107
at: path,
103
108
name: name,
104
109
identityResolver: identityResolver,
105
- fileSystem: fileSystem)
110
+ fileSystem: fileSystem
111
+ )
106
112
} else if type == " sourceControl " {
107
113
let name : String ? = kindJSON. get ( " name " )
108
114
let location : String = try kindJSON. get ( " location " )
109
115
let requirementJSON : JSON = try kindJSON. get ( " requirement " )
110
116
let requirement = try PackageDependency . SourceControl. Requirement ( v4: requirementJSON)
111
- return try Self . makeSourceControlDependency (
117
+ return try Self . parseSourceControlDependency (
112
118
packageKind: packageKind,
113
119
at: location,
114
120
name: name,
115
121
requirement: requirement,
116
122
identityResolver: identityResolver,
117
- fileSystem: fileSystem)
123
+ fileSystem: fileSystem
124
+ )
118
125
} else if type == " registry " {
119
126
let identity : String = try kindJSON. get ( " identity " )
120
127
let requirementJSON : JSON = try kindJSON. get ( " requirement " )
121
128
let requirement = try PackageDependency . Registry. Requirement ( v4: requirementJSON)
122
- return . registry( identity: . plain( identity) , requirement: requirement, productFilter: . everything)
129
+ return try Self . parseRegistryDependency (
130
+ identity: . plain( identity) ,
131
+ requirement: requirement,
132
+ identityResolver: identityResolver
133
+ )
123
134
} else {
124
135
throw InternalError ( " Unknown dependency type \( kindJSON) " )
125
136
}
@@ -133,27 +144,28 @@ enum ManifestJSONParser {
133
144
let requirementType : String = try requirementJSON. get ( String . self, forKey: " type " )
134
145
switch requirementType {
135
146
case " localPackage " :
136
- return try Self . makeFileSystemDependency (
147
+ return try Self . parseFileSystemDependency (
137
148
packageKind: packageKind,
138
149
at: url,
139
150
name: name,
140
151
identityResolver: identityResolver,
141
- fileSystem: fileSystem)
142
-
152
+ fileSystem: fileSystem
153
+ )
143
154
default :
144
155
let requirement = try PackageDependency . SourceControl. Requirement ( v4: requirementJSON)
145
- return try Self . makeSourceControlDependency (
156
+ return try Self . parseSourceControlDependency (
146
157
packageKind: packageKind,
147
158
at: url,
148
159
name: name,
149
160
requirement: requirement,
150
161
identityResolver: identityResolver,
151
- fileSystem: fileSystem)
162
+ fileSystem: fileSystem
163
+ )
152
164
}
153
165
}
154
166
}
155
167
156
- private static func makeFileSystemDependency (
168
+ private static func parseFileSystemDependency (
157
169
packageKind: PackageReference . Kind ,
158
170
at location: String ,
159
171
name: String ? ,
@@ -174,7 +186,7 @@ enum ManifestJSONParser {
174
186
productFilter: . everything)
175
187
}
176
188
177
- private static func makeSourceControlDependency (
189
+ private static func parseSourceControlDependency (
178
190
packageKind: PackageReference . Kind ,
179
191
at location: String ,
180
192
name: String ? ,
@@ -186,8 +198,25 @@ enum ManifestJSONParser {
186
198
var location = try sanitizeDependencyLocation ( fileSystem: fileSystem, packageKind: packageKind, dependencyLocation: location)
187
199
// location mapping (aka mirrors) if any
188
200
location = identityResolver. mappedLocation ( for: location)
189
- // a package in a git location, may be a remote URL or on disk
190
- if let localPath = try ? AbsolutePath ( validating: location) {
201
+ if PackageIdentity . plain ( location) . scopeAndName != nil {
202
+ // re-mapped to registry
203
+ let identity = PackageIdentity . plain ( location)
204
+ let registryRequirement : PackageDependency . Registry . Requirement
205
+ switch requirement {
206
+ case . branch, . revision:
207
+ throw StringError ( " invalid mapping of source control to registry, requirement information mismatch: cannot map branch or revision based dependencies to registry. " )
208
+ case . exact( let value) :
209
+ registryRequirement = . exact( value)
210
+ case . range( let value) :
211
+ registryRequirement = . range( value)
212
+ }
213
+ return . registry(
214
+ identity: identity,
215
+ requirement: registryRequirement,
216
+ productFilter: . everything
217
+ )
218
+ } else if let localPath = try ? AbsolutePath ( validating: location) {
219
+ // a package in a git location, may be a remote URL or on disk
191
220
// in the future this will check with the registries for the identity of the URL
192
221
let identity = try identityResolver. resolveIdentity ( for: localPath)
193
222
return . localSourceControl(
@@ -212,6 +241,43 @@ enum ManifestJSONParser {
212
241
}
213
242
}
214
243
244
+ private static func parseRegistryDependency(
245
+ identity: PackageIdentity ,
246
+ requirement: PackageDependency . Registry . Requirement ,
247
+ identityResolver: IdentityResolver
248
+ ) throws -> PackageDependency {
249
+ // location mapping (aka mirrors) if any
250
+ let location = identityResolver. mappedLocation ( for: identity. description)
251
+ if PackageIdentity . plain ( location) . scopeAndName != nil {
252
+ // re-mapped to registry
253
+ let identity = PackageIdentity . plain ( location)
254
+ return . registry(
255
+ identity: identity,
256
+ requirement: requirement,
257
+ productFilter: . everything
258
+ )
259
+ } else if let url = URL ( string: location) {
260
+ // in the future this will check with the registries for the identity of the URL
261
+ let identity = try identityResolver. resolveIdentity ( for: url)
262
+ let sourceControlRequirement : PackageDependency . SourceControl . Requirement
263
+ switch requirement {
264
+ case . exact( let value) :
265
+ sourceControlRequirement = . exact( value)
266
+ case . range( let value) :
267
+ sourceControlRequirement = . range( value)
268
+ }
269
+ return . remoteSourceControl(
270
+ identity: identity,
271
+ nameForTargetDependencyResolutionOnly: identity. description,
272
+ url: url,
273
+ requirement: sourceControlRequirement,
274
+ productFilter: . everything
275
+ )
276
+ } else {
277
+ throw StringError ( " invalid location: \( location) " )
278
+ }
279
+ }
280
+
215
281
private static func sanitizeDependencyLocation( fileSystem: TSCBasic . FileSystem , packageKind: PackageReference . Kind , dependencyLocation: String ) throws -> String {
216
282
if dependencyLocation. hasPrefix ( " ~/ " ) {
217
283
// If the dependency URL starts with '~/', try to expand it.
@@ -310,7 +376,10 @@ enum ManifestJSONParser {
310
376
return platforms
311
377
}
312
378
313
- private static func parseTarget( json: JSON ) throws -> TargetDescription {
379
+ private static func parseTarget(
380
+ json: JSON ,
381
+ identityResolver: IdentityResolver
382
+ ) throws -> TargetDescription {
314
383
let providers = try ? json
315
384
. getArray ( " providers " )
316
385
. map ( SystemPackageProviderDescription . init ( v4: ) )
@@ -319,7 +388,12 @@ enum ManifestJSONParser {
319
388
320
389
let dependencies = try json
321
390
. getArray ( " dependencies " )
322
- . map ( TargetDescription . Dependency. init ( v4: ) )
391
+ . map {
392
+ try TargetDescription . Dependency. init (
393
+ v4: $0,
394
+ identityResolver: identityResolver
395
+ )
396
+ }
323
397
324
398
let sources : [ String ] ? = try ? json. get ( " sources " )
325
399
try sources? . forEach { _ = try RelativePath ( validating: $0) }
@@ -620,7 +694,7 @@ extension TargetDescription.TargetType {
620
694
}
621
695
622
696
extension TargetDescription . Dependency {
623
- fileprivate init ( v4 json: JSON ) throws {
697
+ fileprivate init ( v4 json: JSON , identityResolver : IdentityResolver ) throws {
624
698
let type = try json. get ( String . self, forKey: " type " )
625
699
let condition = try ( try ? json. getJSON ( " condition " ) ) . flatMap ( PackageConditionDescription . init ( v4: ) )
626
700
@@ -631,7 +705,16 @@ extension TargetDescription.Dependency {
631
705
case " product " :
632
706
let name = try json. get ( String . self, forKey: " name " )
633
707
let moduleAliases : [ String : String ] ? = try ? json. get ( " moduleAliases " )
634
- self = . product( name: name, package : json. get ( " package " ) , moduleAliases: moduleAliases, condition: condition)
708
+ var package : String ? = json. get ( " package " )
709
+ if let packageName = package {
710
+ package = try identityResolver. mappedIdentity ( for: . plain( packageName) ) . description
711
+ }
712
+ self = . product(
713
+ name: name,
714
+ package : package ,
715
+ moduleAliases: moduleAliases,
716
+ condition: condition
717
+ )
635
718
636
719
case " byname " :
637
720
self = try . byName( name: json. get ( " name " ) , condition: condition)
0 commit comments