|
1 | 1 | use crate::gradle_command::GradleCommandError;
|
2 | 2 | use crate::GRADLE_TASK_NAME_HEROKU_START_DAEMON;
|
| 3 | +use buildpacks_jvm_shared::output::{self, CmdError}; |
3 | 4 | use libcnb::Env;
|
4 |
| -use libherokubuildpack::command::CommandExt; |
5 |
| -use std::io::{stderr, stdout}; |
6 | 5 | use std::path::Path;
|
7 |
| -use std::process::Command; |
| 6 | +use std::process::{Command, Stdio}; |
| 7 | +use tempfile::NamedTempFile; |
| 8 | + |
| 9 | +pub(crate) struct GradleDaemonLog { |
| 10 | + file: NamedTempFile, |
| 11 | +} |
8 | 12 |
|
9 | 13 | pub(crate) fn start(
|
10 | 14 | gradle_wrapper_executable_path: &Path,
|
11 | 15 | gradle_env: &Env,
|
12 |
| -) -> Result<(), GradleCommandError<()>> { |
13 |
| - let output = Command::new(gradle_wrapper_executable_path) |
| 16 | +) -> Result<GradleDaemonLog, GradleCommandError<()>> { |
| 17 | + let log = GradleDaemonLog { |
| 18 | + file: tempfile::NamedTempFile::new().map_err(GradleCommandError::Io)?, |
| 19 | + }; |
| 20 | + std::fs::write(&log.file, "").map_err(GradleCommandError::Io)?; |
| 21 | + let mut command = Command::new(gradle_wrapper_executable_path); |
| 22 | + command |
14 | 23 | .args([
|
15 | 24 | // Fixes an issue when running under Apple Rosetta emulation
|
16 | 25 | "-Djdk.lang.Process.launchMechanism=vfork",
|
17 | 26 | "--daemon",
|
18 | 27 | GRADLE_TASK_NAME_HEROKU_START_DAEMON,
|
19 | 28 | ])
|
20 |
| - .envs(gradle_env) |
21 |
| - .output_and_write_streams(stdout(), stderr()) |
22 |
| - .map_err(GradleCommandError::Io)?; |
| 29 | + .envs(gradle_env); |
| 30 | + let file = log.file.reopen().map_err(GradleCommandError::Io)?; |
| 31 | + |
| 32 | + command.stdout(Stdio::from( |
| 33 | + file.try_clone().map_err(GradleCommandError::Io)?, |
| 34 | + )); |
| 35 | + command.stderr(Stdio::from(file)); |
23 | 36 |
|
24 |
| - if output.status.success() { |
25 |
| - Ok(()) |
26 |
| - } else { |
27 |
| - Err(GradleCommandError::UnexpectedExitStatus { |
28 |
| - status: output.status, |
29 |
| - stdout: String::from_utf8_lossy(&output.stdout).into_owned(), |
30 |
| - stderr: String::from_utf8_lossy(&output.stderr).into_owned(), |
31 |
| - }) |
32 |
| - } |
| 37 | + let _ = output::run_command(command, true).map_err(|error| match error { |
| 38 | + CmdError::SystemError(_, error) => GradleCommandError::Io(error), |
| 39 | + CmdError::NonZeroExitNotStreamed(named_output) |
| 40 | + | CmdError::NonZeroExitAlreadyStreamed(named_output) => { |
| 41 | + GradleCommandError::UnexpectedExitStatus { |
| 42 | + status: *named_output.status(), |
| 43 | + stdout: named_output.stdout_lossy(), |
| 44 | + stderr: named_output.stderr_lossy(), |
| 45 | + } |
| 46 | + } |
| 47 | + })?; |
| 48 | + Ok(log) |
33 | 49 | }
|
34 | 50 |
|
35 | 51 | pub(crate) fn stop(
|
|
0 commit comments