diff --git a/Xcodes/Backend/Process.swift b/Xcodes/Backend/Process.swift index 77a2782..88cdf8c 100644 --- a/Xcodes/Backend/Process.swift +++ b/Xcodes/Backend/Process.swift @@ -14,41 +14,52 @@ extension Process { static func run(_ executable: URL, workingDirectory: URL? = nil, input: String? = nil, _ arguments: [String]) -> AnyPublisher { Deferred { Future { promise in - let process = Process() - process.currentDirectoryURL = workingDirectory ?? executable.deletingLastPathComponent() - process.executableURL = executable - process.arguments = arguments - - let (stdout, stderr) = (Pipe(), Pipe()) - process.standardOutput = stdout - process.standardError = stderr - - if let input = input { - let inputPipe = Pipe() - process.standardInput = inputPipe.fileHandleForReading - inputPipe.fileHandleForWriting.write(Data(input.utf8)) - inputPipe.fileHandleForWriting.closeFile() - } - - do { - try process.run() - process.waitUntilExit() - - let output = String(data: stdout.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) ?? "" - let error = String(data: stderr.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) ?? "" + DispatchQueue.global().async { + let process = Process() + process.currentDirectoryURL = workingDirectory ?? executable.deletingLastPathComponent() + process.executableURL = executable + process.arguments = arguments - guard process.terminationReason == .exit, process.terminationStatus == 0 else { - return promise(.failure(ProcessExecutionError(process: process, standardOutput: output, standardError: error))) + let (stdout, stderr) = (Pipe(), Pipe()) + process.standardOutput = stdout + process.standardError = stderr + + if let input = input { + let inputPipe = Pipe() + process.standardInput = inputPipe.fileHandleForReading + inputPipe.fileHandleForWriting.write(Data(input.utf8)) + inputPipe.fileHandleForWriting.closeFile() + } + + do { + print("Process.run \(executable), \(input), \(arguments.joined(separator: " "))") + try process.run() + process.waitUntilExit() + + let output = String(data: stdout.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) ?? "" + let error = String(data: stderr.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) ?? "" + + dump(process) + print(output) + print(error) + guard process.terminationReason == .exit, process.terminationStatus == 0 else { + DispatchQueue.main.async { + promise(.failure(ProcessExecutionError(process: process, standardOutput: output, standardError: error))) + } + return + } + + DispatchQueue.main.async { + promise(.success((process.terminationStatus, output, error))) + } + } catch { + DispatchQueue.main.async { + promise(.failure(error)) + } } - - promise(.success((process.terminationStatus, output, error))) - } catch { - promise(.failure(error)) } } } - .subscribe(on: DispatchQueue.global()) - .receive(on: DispatchQueue.main) .eraseToAnyPublisher() } }