@@ -15,8 +15,10 @@ import PackageLoading
1515import PackageGraph
1616import PackageModel
1717import POSIX
18+ import SourceControl
1819import Utility
1920import Workspace
21+ import libc
2022
2123private class ToolWorkspaceDelegate : WorkspaceDelegate {
2224 func fetchingMissingRepositories( _ urls: Set < String > ) {
@@ -75,8 +77,16 @@ public class SwiftTool<Options: ToolOptions> {
7577 /// Path to the build directory.
7678 let buildPath : AbsolutePath
7779
80+ /// Reference to the argument parser.
7881 let parser : ArgumentParser
7982
83+ /// The process set to hold the launched processes. These will be terminated on any signal
84+ /// received by the swift tools.
85+ let processSet : ProcessSet
86+
87+ /// The interrupt handler.
88+ let interruptHandler : InterruptHandler
89+
8090 /// Create an instance of this tool.
8191 ///
8292 /// - parameter args: The command line arguments to be passed to this tool.
@@ -150,8 +160,28 @@ public class SwiftTool<Options: ToolOptions> {
150160 if let dir = options. chdir {
151161 // FIXME: This should be an API which takes AbsolutePath and maybe
152162 // should be moved to file system APIs with currentWorkingDirectory.
153- try chdir ( dir. asString)
163+ try POSIX . chdir ( dir. asString)
154164 }
165+
166+ let processSet = ProcessSet ( )
167+ interruptHandler = try InterruptHandler {
168+ // Terminate all processes on receiving an interrupt signal.
169+ processSet. terminate ( )
170+
171+ // Install the default signal handler.
172+ var action = sigaction ( )
173+ #if os(macOS)
174+ action. __sigaction_u. __sa_handler = SIG_DFL
175+ #else
176+ action. __sigaction_handler = unsafeBitCast ( SIG_DFL, to: sigaction. __Unnamed_union___sigaction_handler. self)
177+ #endif
178+ sigaction ( SIGINT, & action, nil )
179+
180+ // Die with sigint.
181+ kill ( getpid ( ) , SIGINT)
182+ }
183+ self . processSet = processSet
184+
155185 } catch {
156186 handle ( error: error)
157187 }
@@ -182,12 +212,14 @@ public class SwiftTool<Options: ToolOptions> {
182212 }
183213 let delegate = ToolWorkspaceDelegate ( )
184214 let rootPackage = try getPackageRoot ( )
215+ let provider = GitRepositoryProvider ( processSet: processSet)
185216 let workspace = try Workspace (
186217 dataPath: buildPath,
187218 editablesPath: rootPackage. appending ( component: " Packages " ) ,
188219 pinsFile: rootPackage. appending ( component: " Package.pins " ) ,
189220 manifestLoader: manifestLoader,
190- delegate: delegate
221+ delegate: delegate,
222+ repositoryProvider: provider
191223 )
192224 workspace. registerPackage ( at: rootPackage)
193225 _workspace = workspace
@@ -266,7 +298,7 @@ private func findPackageRoot() -> AbsolutePath? {
266298
267299private func getEnvBuildPath( ) -> AbsolutePath ? {
268300 // Don't rely on build path from env for SwiftPM's own tests.
269- guard getenv ( " IS_SWIFTPM_TEST " ) == nil else { return nil }
270- guard let env = getenv ( " SWIFT_BUILD_PATH " ) else { return nil }
301+ guard POSIX . getenv ( " IS_SWIFTPM_TEST " ) == nil else { return nil }
302+ guard let env = POSIX . getenv ( " SWIFT_BUILD_PATH " ) else { return nil }
271303 return AbsolutePath ( env, relativeTo: currentWorkingDirectory)
272304}
0 commit comments