@@ -300,6 +300,9 @@ public class Workspace {
300300 /// Skip updating containers while fetching them.
301301 fileprivate let skipUpdate : Bool
302302
303+ /// The active package resolver. This is set during a dependency resolution operation.
304+ fileprivate var activeResolver : PackageResolver ?
305+
303306 /// Typealias for dependency resolver we use in the workspace.
304307 fileprivate typealias PackageDependencyResolver = DependencyResolver
305308 fileprivate typealias PubgrubResolver = PubgrubDependencyResolver
@@ -539,6 +542,17 @@ extension Workspace {
539542 try ? fileSystem. removeFileTree ( dataPath)
540543 }
541544
545+ /// Cancel the active dependency resolution operation.
546+ ///
547+ /// Only legacy resolver is supported right now. This method is thread-safe.
548+ public func cancelActiveResolverOperation( ) {
549+ switch activeResolver {
550+ case . legacy( let resolver) ? :
551+ resolver. cancel ( )
552+ default : break
553+ }
554+ }
555+
542556 /// Updates the current dependencies.
543557 ///
544558 /// - Parameters:
@@ -579,7 +593,14 @@ extension Workspace {
579593 let resolutionStartTime = Date ( )
580594
581595 // Resolve the dependencies.
582- let updateResults = resolveDependencies ( dependencies: updateConstraints, diagnostics: diagnostics)
596+ let resolver = createResolver ( )
597+ activeResolver = resolver
598+
599+ let updateResults = resolveDependencies ( resolver: resolver, dependencies: updateConstraints, diagnostics: diagnostics)
600+
601+ // Reset the active resolver.
602+ activeResolver = nil
603+
583604 guard !diagnostics. hasErrors else { return }
584605
585606 // Emit the time taken to perform dependency resolution.
@@ -1217,8 +1238,11 @@ extension Workspace {
12171238 // Perform dependency resolution.
12181239 let resolverDiagnostics = DiagnosticsEngine ( )
12191240 var resolver = createResolver ( )
1241+ activeResolver = resolver
1242+
12201243 var result = resolveDependencies (
12211244 resolver: resolver, dependencies: constraints, pins: validPins, diagnostics: resolverDiagnostics)
1245+ activeResolver = nil
12221246
12231247 // If we fail, we just try again without any pins because the pins might
12241248 // be completely incompatible.
@@ -1586,13 +1610,11 @@ extension Workspace {
15861610
15871611 /// Runs the dependency resolver based on constraints provided and returns the results.
15881612 fileprivate func resolveDependencies(
1589- resolver: PackageResolver ? = nil ,
1613+ resolver: PackageResolver ,
15901614 dependencies: [ RepositoryPackageConstraint ] ,
15911615 pins: [ RepositoryPackageConstraint ] = [ ] ,
15921616 diagnostics: DiagnosticsEngine
15931617 ) -> [ ( container: PackageReference , binding: BoundVersion ) ] {
1594- let resolver = resolver ?? createResolver ( )
1595-
15961618 let result = resolver. resolve ( dependencies: dependencies, pins: pins)
15971619
15981620 // Take an action based on the result.
0 commit comments