diff --git a/Sources/Basics/Concurrency/AsyncProcess.swift b/Sources/Basics/Concurrency/AsyncProcess.swift index 3ca1cf19a90..3afc34a4d57 100644 --- a/Sources/Basics/Concurrency/AsyncProcess.swift +++ b/Sources/Basics/Concurrency/AsyncProcess.swift @@ -375,11 +375,12 @@ package final class AsyncProcess { environment: Environment = .current, outputRedirection: OutputRedirection = .collect, startNewProcessGroup: Bool = true, - loggingHandler: LoggingHandler? = .none + loggingHandler: LoggingHandler? = .none, + workingDirectory: AbsolutePath? = nil ) { self.arguments = arguments self.environment = environment - self.workingDirectory = nil + self.workingDirectory = workingDirectory self.outputRedirection = outputRedirection self.startNewProcessGroup = startNewProcessGroup self.loggingHandler = loggingHandler ?? AsyncProcess.loggingHandler @@ -1126,13 +1127,15 @@ extension AsyncProcess { package static func popen( arguments: [String], environment: Environment = .current, - loggingHandler: LoggingHandler? = .none + loggingHandler: LoggingHandler? = .none, + workingDirectory: AbsolutePath? = nil ) throws -> AsyncProcessResult { let process = AsyncProcess( arguments: arguments, environment: environment, outputRedirection: .collect, - loggingHandler: loggingHandler + loggingHandler: loggingHandler, + workingDirectory: workingDirectory ) try process.launch() return try process.waitUntilExit() diff --git a/Sources/_IntegrationTestSupport/Helpers.swift b/Sources/_IntegrationTestSupport/Helpers.swift index 346a7b4885c..77f095177c0 100644 --- a/Sources/_IntegrationTestSupport/Helpers.swift +++ b/Sources/_IntegrationTestSupport/Helpers.swift @@ -74,9 +74,10 @@ public let xcodebuild: AbsolutePath = { package func sh( _ arguments: CustomStringConvertible..., env: [String: String] = [:], + workingDirectory: AbsolutePath? = nil, sourceLocation: SourceLocation = #_sourceLocation, ) throws -> ShReturnType { - let result = try _sh(arguments, env: env) + let result = try _sh(arguments, env: env, workingDirectory: workingDirectory) let stdout = try result.utf8Output() let stderr = try result.utf8stderrOutput() @@ -97,6 +98,7 @@ package func sh( package func _sh( _ arguments: [CustomStringConvertible], env: [String: String] = [:], + workingDirectory: AbsolutePath? = nil ) throws -> AsyncProcessResult { var environment = Environment() @@ -109,7 +111,7 @@ package func _sh( } let result = try AsyncProcess.popen( - arguments: arguments.map(\.description), environment: environment + arguments: arguments.map(\.description), environment: environment, workingDirectory: workingDirectory ) return result } diff --git a/Tests/IntegrationTests/BasicTests.swift b/Tests/IntegrationTests/BasicTests.swift index 2aeeb5edb43..d0239106903 100644 --- a/Tests/IntegrationTests/BasicTests.swift +++ b/Tests/IntegrationTests/BasicTests.swift @@ -69,8 +69,7 @@ private struct BasicTests { #expect(dealerOutput.filter(\.isPlayingCardSuit).count == 10) // Verify that the 'git status' is clean after a build. - try localFileSystem.changeCurrentWorkingDirectory(to: packagePath) - let gitOutput = try sh("git\(ProcessInfo.exeSuffix)", "status").stdout + let gitOutput = try sh("git\(ProcessInfo.exeSuffix)", "status", workingDirectory: packagePath).stdout #expect(gitOutput.contains("nothing to commit, working tree clean")) // Verify that another 'swift build' does nothing.