diff --git a/buildpacks/gradle/src/main.rs b/buildpacks/gradle/src/main.rs index 63ba44ab..1cd05355 100644 --- a/buildpacks/gradle/src/main.rs +++ b/buildpacks/gradle/src/main.rs @@ -6,8 +6,10 @@ use crate::gradle_command::GradleCommandError; use crate::layers::gradle_home::handle_gradle_home_layer; use crate::GradleBuildpackError::{GradleBuildIoError, GradleBuildUnexpectedStatusError}; use buildpacks_jvm_shared as shared; +use buildpacks_jvm_shared::output; use buildpacks_jvm_shared::output::{ - print_buildpack_name, print_section, print_subsection, track_timing, + print_buildpack_name, print_section, print_subsection, track_timing, BuildpackOutputText, + BuildpackOutputTextSection, }; #[cfg(test)] use buildpacks_jvm_shared_test as _; @@ -20,7 +22,6 @@ use libcnb::{buildpack_main, Buildpack, Env}; #[cfg(test)] use libcnb_test as _; use libherokubuildpack::command::CommandExt; -use libherokubuildpack::log::log_header; use serde::Deserialize; use std::io::{stderr, stdout}; use std::process::{Command, ExitStatus}; @@ -126,7 +127,11 @@ impl Buildpack for GradleBuildpack { }) .ok_or(GradleBuildpackError::BuildTaskUnknown)?; - log_header("Running build task"); + print_section("Running Gradle build"); + print_subsection(BuildpackOutputText::new(vec![ + BuildpackOutputTextSection::regular("Running "), + BuildpackOutputTextSection::command(format!("./gradlew {} -x check", task_name)), + ])); let output = Command::new(&gradle_wrapper_executable_path) .current_dir(&context.app_dir) diff --git a/buildpacks/maven/src/main.rs b/buildpacks/maven/src/main.rs index 7a372dc5..b746711b 100644 --- a/buildpacks/maven/src/main.rs +++ b/buildpacks/maven/src/main.rs @@ -212,7 +212,7 @@ impl Buildpack for MavenBuildpack { output::print_section("Running Maven build"); output::print_subsection(BuildpackOutputText::new(vec![ BuildpackOutputTextSection::regular("Running "), - BuildpackOutputTextSection::value(format!( + BuildpackOutputTextSection::command(format!( "{} {} {}", mvn_executable.to_string_lossy(), shell_words::join(&maven_options), diff --git a/buildpacks/sbt/src/main.rs b/buildpacks/sbt/src/main.rs index 56f63112..86177c71 100644 --- a/buildpacks/sbt/src/main.rs +++ b/buildpacks/sbt/src/main.rs @@ -109,7 +109,7 @@ impl Buildpack for SbtBuildpack { output::print_section("Running sbt build"); output::print_subsection(BuildpackOutputText::new(vec![ BuildpackOutputTextSection::regular("Running "), - BuildpackOutputTextSection::value(format!("sbt {}", shell_words::join(&tasks))), + BuildpackOutputTextSection::command(format!("sbt {}", shell_words::join(&tasks))), ])); let mut command = Command::new("sbt"); diff --git a/shared/src/output.rs b/shared/src/output.rs index 115e9f6f..1f79222f 100644 --- a/shared/src/output.rs +++ b/shared/src/output.rs @@ -5,7 +5,7 @@ use std::time::{Duration, Instant}; pub fn print_buildpack_name(buildpack_name: impl AsRef) { let buildpack_name = buildpack_name.as_ref(); - println!("{ANSI_BUILDPACK_NAME_CODE}# {buildpack_name}{ANSI_RESET_CODE}\n"); + print!("\n{ANSI_BUILDPACK_NAME_CODE}# {buildpack_name}{ANSI_RESET_CODE}\n\n"); } pub fn print_section(text: impl Into) { @@ -71,10 +71,19 @@ pub fn run_command E, F2: FnOnce(Output) -> E>( let child = if quiet { command.output_and_write_streams(std::io::sink(), std::io::sink()) } else { - command.output_and_write_streams( - line_mapped(std::io::stdout(), add_prefix_to_non_empty(" ")), - line_mapped(std::io::stderr(), add_prefix_to_non_empty(" ")), - ) + const SPACE_ASCII: u8 = 0x20; + let prefix = vec![SPACE_ASCII; 6]; + + print!("\n"); + + let output = command.output_and_write_streams( + line_mapped(std::io::stdout(), add_prefix_to_non_empty(prefix.clone())), + line_mapped(std::io::stderr(), add_prefix_to_non_empty(prefix)), + ); + + print!("\n"); + + output }; child.map_err(io_error_fn).and_then(|output| { @@ -222,6 +231,10 @@ impl BuildpackOutputTextSection { pub fn value(value: impl Into) -> Self { BuildpackOutputTextSection::Value(value.into()) } + + pub fn command(value: impl Into) -> Self { + BuildpackOutputTextSection::Command(value.into()) + } } impl From for BuildpackOutputText { @@ -283,12 +296,12 @@ fn format_duration(duration: &Duration) -> String { const VALUE_DELIMITER_CHAR: char = '`'; const ANSI_RESET_CODE: &str = "\u{1b}[0m"; -const ANSI_VALUE_CODE: &str = "\u{1b}[0;34m"; +const ANSI_VALUE_CODE: &str = "\u{1b}[0;33m"; const ANSI_YELLOW_CODE: &str = "\u{1b}[0;33m"; const ANSI_RED_CODE: &str = "\u{1b}[0;31m"; const ANSI_BUILDPACK_NAME_CODE: &str = "\u{1b}[1;35m"; const ANSI_URL_CODE: &str = "\u{1b}[0;34m"; -const ANSI_COMMAND_CODE: &str = "\u{1b}[0;34m"; +const ANSI_COMMAND_CODE: &str = "\u{1b}[0;36m"; const ERROR_WARNING_LINE_PREFIX: &str = "! "; #[cfg(test)] @@ -311,7 +324,7 @@ mod test { ..Default::default() }; - assert_eq!(text.to_ansi_string(), "\u{1b}[0m\u{1b}[0;33m! Hello\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! `\u{1b}[0;34mWorld\u{1b}[0m`\u{1b}[0;33m\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! How\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! are you?"); + assert_eq!(text.to_ansi_string(), "\u{1b}[0m\u{1b}[0;33m! Hello\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! `\u{1b}[0;33mWorld\u{1b}[0m`\u{1b}[0;33m\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! How\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! are you?"); } #[test] @@ -329,7 +342,7 @@ mod test { assert_eq!( text.to_ansi_string(), - "\u{1b}[0m\u{1b}[0;33m! Intro\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! `\u{1b}[0;34mWith\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! \u{1b}[0;34mNewline\u{1b}[0m`\u{1b}[0;33m\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! Outro" + "\u{1b}[0m\u{1b}[0;33m! Intro\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! `\u{1b}[0;33mWith\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! \u{1b}[0;33mNewline\u{1b}[0m`\u{1b}[0;33m\u{1b}[0m\n\u{1b}[0m\u{1b}[0;33m! Outro" ); }