@@ -139,13 +139,13 @@ public class Workspace {
139
139
let root : PackageGraphRoot
140
140
141
141
/// The dependency manifests in the transitive closure of root manifest.
142
- let dependencies : [ ( manifest: Manifest , dependency: ManagedDependency ) ]
142
+ let dependencies : [ ( manifest: Manifest , dependency: ManagedDependency , productFilter : ProductFilter ) ]
143
143
144
144
let workspace : Workspace
145
145
146
146
fileprivate init (
147
147
root: PackageGraphRoot ,
148
- dependencies: [ ( Manifest , ManagedDependency ) ] ,
148
+ dependencies: [ ( Manifest , ManagedDependency , ProductFilter ) ] ,
149
149
workspace: Workspace
150
150
) {
151
151
self . root = root
@@ -244,7 +244,7 @@ public class Workspace {
244
244
func dependencyConstraints( ) -> [ RepositoryPackageConstraint ] {
245
245
var allConstraints = [ RepositoryPackageConstraint] ( )
246
246
247
- for (externalManifest, managedDependency) in dependencies {
247
+ for (externalManifest, managedDependency, productFilter ) in dependencies {
248
248
// For edited packages, add a constraint with unversioned requirement so the
249
249
// resolver doesn't try to resolve it.
250
250
switch managedDependency. state {
@@ -259,13 +259,13 @@ public class Workspace {
259
259
let constraint = RepositoryPackageConstraint (
260
260
container: ref,
261
261
requirement: . unversioned,
262
- products: managedDependency . productFilter)
262
+ products: productFilter)
263
263
allConstraints. append ( constraint)
264
264
case . checkout, . local:
265
265
break
266
266
}
267
267
allConstraints += externalManifest. dependencyConstraints (
268
- productFilter: managedDependency . productFilter,
268
+ productFilter: productFilter,
269
269
config: workspace. config
270
270
)
271
271
}
@@ -277,7 +277,7 @@ public class Workspace {
277
277
public func editedPackagesConstraints( ) -> [ RepositoryPackageConstraint ] {
278
278
var constraints = [ RepositoryPackageConstraint] ( )
279
279
280
- for (_, managedDependency) in dependencies {
280
+ for (_, managedDependency, productFilter ) in dependencies {
281
281
switch managedDependency. state {
282
282
case . checkout, . local: continue
283
283
case . edited: break
@@ -292,7 +292,7 @@ public class Workspace {
292
292
let constraint = RepositoryPackageConstraint (
293
293
container: ref,
294
294
requirement: . unversioned,
295
- products: managedDependency . productFilter)
295
+ products: productFilter)
296
296
constraints. append ( constraint)
297
297
}
298
298
return constraints
@@ -568,7 +568,8 @@ extension Workspace {
568
568
requirement = currentState. requirement ( )
569
569
}
570
570
let constraint = RepositoryPackageConstraint (
571
- container: dependency. packageRef, requirement: requirement, products: dependency. productFilter)
571
+ // If any products are required, the rest of the package graph will supply those constraints.
572
+ container: dependency. packageRef, requirement: requirement, products: . specific( [ ] ) )
572
573
573
574
// Run the resolution.
574
575
_resolve ( root: root, forceResolution: false , extraConstraints: [ constraint] , diagnostics: diagnostics)
@@ -1039,12 +1040,11 @@ extension Workspace {
1039
1040
try fileSystem. removeFileTree ( editablesPath)
1040
1041
}
1041
1042
1042
- if let checkoutState = dependency. basedOn? . checkoutState,
1043
- let productFilter = dependency. basedOn? . productFilter {
1043
+ if let checkoutState = dependency. basedOn? . checkoutState {
1044
1044
// Restore the original checkout.
1045
1045
//
1046
1046
// The clone method will automatically update the managed dependency state.
1047
- _ = try clone ( package : dependency. packageRef, at: checkoutState, productFilter : productFilter )
1047
+ _ = try clone ( package : dependency. packageRef, at: checkoutState)
1048
1048
} else {
1049
1049
// The original dependency was removed, update the managed dependency state.
1050
1050
state. dependencies. remove ( forURL: dependency. packageRef. path)
@@ -1191,17 +1191,17 @@ extension Workspace {
1191
1191
var loadedManifests = [ String: Manifest] ( )
1192
1192
1193
1193
// Compute the transitive closure of available dependencies.
1194
- let allManifests = try ! topologicalSort ( inputManifests. map ( { KeyedPair ( $0, key: $0. name) } ) ) { node in
1195
- return node. item. dependencies . compactMap ( { dependency in
1196
- let url = config. mirroredURL ( forURL: dependency. url)
1194
+ let allManifests = try ! topologicalSort ( inputManifests. map ( { KeyedPair ( ( $0, ProductFilter . everything ) , key: $0. name) } ) ) { node in
1195
+ return node. item. 0 . dependenciesRequired ( for : node . item . 1 ) . compactMap ( { dependency in
1196
+ let url = config. mirroredURL ( forURL: dependency. declaration . url)
1197
1197
let manifest = loadedManifests [ url] ?? loadManifest ( forURL: url, diagnostics: diagnostics)
1198
1198
loadedManifests [ url] = manifest
1199
- return manifest. flatMap ( { KeyedPair ( $0 , key: $0. name) } )
1199
+ return manifest. flatMap ( { KeyedPair ( ( $0 , dependency . productFilter ) , key: $0. name) } )
1200
1200
} )
1201
1201
}
1202
1202
1203
- let allDependencyManifests = allManifests. map ( { $0. item } ) . filter ( { !root. manifests. contains ( $0) } )
1204
- let deps = allDependencyManifests. map ( { ( $0, state. dependencies [ forURL: $0. url] !) } )
1203
+ let allDependencyManifests = allManifests. map ( { $0. item } ) . filter ( { !root. manifests. contains ( $0. 0 ) } )
1204
+ let deps = allDependencyManifests. map ( { ( $0, state. dependencies [ forURL: $0. url] !, $1 ) } )
1205
1205
1206
1206
return DependencyManifests ( root: root, dependencies: deps, workspace: self )
1207
1207
}
@@ -1365,7 +1365,7 @@ extension Workspace {
1365
1365
private func artifacts( from manifests: DependencyManifests ) -> [ ManagedArtifact ] {
1366
1366
let packageAndManifests : [ ( PackageReference , Manifest ) ] =
1367
1367
zip ( manifests. root. packageRefs, manifests. root. manifests) + // Root package and manifests.
1368
- manifests. dependencies. map ( { ( $1 . packageRef, $0 ) } ) // Dependency package and manifests.
1368
+ manifests. dependencies. map ( { manifest , managed , _ in ( managed . packageRef, manifest ) } ) // Dependency package and manifests.
1369
1369
1370
1370
var artifacts : [ ManagedArtifact ] = [ ]
1371
1371
@@ -1541,7 +1541,7 @@ extension Workspace {
1541
1541
// Clone the required pins.
1542
1542
for pin in requiredPins {
1543
1543
diagnostics. wrap {
1544
- _ = try self . clone ( package : pin. packageRef, at: pin. state, productFilter : . everything )
1544
+ _ = try self . clone ( package : pin. packageRef, at: pin. state)
1545
1545
}
1546
1546
}
1547
1547
@@ -1552,7 +1552,7 @@ extension Workspace {
1552
1552
let dependencies = rootManifest. dependencies. filter { $0. requirement == . localPackage }
1553
1553
for localPackage in dependencies {
1554
1554
let package = localPackage. createPackageRef ( config: self . config)
1555
- state. dependencies. add ( ManagedDependency . local ( packageRef: package , productFilter : . everything ) )
1555
+ state. dependencies. add ( ManagedDependency . local ( packageRef: package ) )
1556
1556
}
1557
1557
}
1558
1558
diagnostics. wrap { try state. saveState ( ) }
@@ -2090,7 +2090,7 @@ extension Workspace {
2090
2090
switch dependency. state {
2091
2091
case . checkout( let checkoutState) :
2092
2092
// If some checkout dependency has been removed, clone it again.
2093
- _ = try clone ( package : dependency. packageRef, at: checkoutState, productFilter : dependency . productFilter )
2093
+ _ = try clone ( package : dependency. packageRef, at: checkoutState)
2094
2094
diagnostics. emit ( . checkedOutDependencyMissing( packageName: dependency. packageRef. name) )
2095
2095
2096
2096
case . edited:
@@ -2235,8 +2235,7 @@ extension Workspace {
2235
2235
/// - Throws: If the operation could not be satisfied.
2236
2236
func clone(
2237
2237
package : PackageReference ,
2238
- at checkoutState: CheckoutState ,
2239
- productFilter: ProductFilter
2238
+ at checkoutState: CheckoutState
2240
2239
) throws -> AbsolutePath {
2241
2240
// Get the repository.
2242
2241
let path = try fetch ( package : package )
@@ -2256,8 +2255,7 @@ extension Workspace {
2256
2255
state. dependencies. add ( ManagedDependency (
2257
2256
packageRef: package ,
2258
2257
subpath: path. relative ( to: checkoutsPath) ,
2259
- checkoutState: checkoutState,
2260
- productFilter: productFilter) )
2258
+ checkoutState: checkoutState) )
2261
2259
try state. saveState ( )
2262
2260
2263
2261
return path
@@ -2287,12 +2285,12 @@ extension Workspace {
2287
2285
checkoutState = CheckoutState ( revision: revision, branch: branch)
2288
2286
2289
2287
case . unversioned:
2290
- state. dependencies. add ( ManagedDependency . local ( packageRef: package , productFilter : productFilter ) )
2288
+ state. dependencies. add ( ManagedDependency . local ( packageRef: package ) )
2291
2289
try state. saveState ( )
2292
2290
return AbsolutePath ( package . path)
2293
2291
}
2294
2292
2295
- return try self . clone ( package : package , at: checkoutState, productFilter : productFilter )
2293
+ return try self . clone ( package : package , at: checkoutState)
2296
2294
}
2297
2295
2298
2296
/// Removes the clone and checkout of the provided specifier.
0 commit comments