From 46c070d9e19316c624246f5541f76d28315fc5d1 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:08:46 -0600 Subject: [PATCH 01/37] Introduce function style print --- jruby_executable/src/bin/jruby_build.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/jruby_executable/src/bin/jruby_build.rs b/jruby_executable/src/bin/jruby_build.rs index d311a61..e2f2add 100644 --- a/jruby_executable/src/bin/jruby_build.rs +++ b/jruby_executable/src/bin/jruby_build.rs @@ -1,4 +1,4 @@ -use bullet_stream::{Print, style}; +use bullet_stream::{Print, global::print, style}; use clap::Parser; use fs_err::PathExt; use gem_version::GemVersion; @@ -107,9 +107,9 @@ fn jruby_build(args: &Args) -> Result<(), Box> { let tgz_name = format!("ruby-{ruby_stdlib_version}-jruby-{version}.tgz"); - log = { - let mut bullet = log.bullet("Creating tgz archives"); - bullet = bullet.sub_bullet(format!( + _ = { + print::bullet("Creating tgz archives"); + print::sub_bullet(format!( "Inventory file {}", style::value(inventory.to_string_lossy()) )); @@ -119,16 +119,16 @@ fn jruby_build(args: &Args) -> Result<(), Box> { let tar_file = fs_err::File::create(tar_dir.join(&tgz_name))?; - let timer = bullet.start_timer(format!("Write {}", tar_file.path().display())); + let timer = print::sub_start_timer(format!("Write {}", tar_file.path().display())); tar_dir_to_file(&jruby_dir, &tar_file)?; - bullet = timer.done(); + timer.done(); let tar_path = tar_file.path(); let sha = sha256_from_path(tar_path)?; let sha_seven = sha.chars().take(7).collect::(); let sha_seven_path = append_filename_with(tar_path, &format!("-{sha_seven}"), ".tgz")?; - bullet = bullet.sub_bullet(format!("Write {}", sha_seven_path.display(),)); + print::sub_bullet(format!("Write {}", sha_seven_path.display(),)); fs_err::copy(tar_file.path(), &sha_seven_path)?; let timestamp = chrono::Utc::now(); @@ -181,11 +181,9 @@ fn jruby_build(args: &Args) -> Result<(), Box> { fs_err::create_dir_all(&dir)?; let path = dir.join(&tgz_name); - bullet = bullet.sub_bullet(format!("Write {}", path.display())); + print::sub_bullet(format!("Write {}", path.display())); fs_err::copy(tar_file.path(), &path)?; } - - bullet.done() }; log.done(); From f924d19eeffcc7eec1120c774c926061163f33de Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:11:53 -0600 Subject: [PATCH 02/37] Function style print interface --- jruby_executable/src/bin/jruby_build.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/jruby_executable/src/bin/jruby_build.rs b/jruby_executable/src/bin/jruby_build.rs index e2f2add..c8c0d0b 100644 --- a/jruby_executable/src/bin/jruby_build.rs +++ b/jruby_executable/src/bin/jruby_build.rs @@ -92,17 +92,15 @@ fn jruby_build(args: &Args) -> Result<(), Box> { bullet.done() }; - log = { - let bullet = log.bullet("Checking for `ruby` binstub"); + _ = { + print::bullet("Checking for `ruby` binstub"); let ruby_bin = jruby_dir.join("bin").join("ruby"); if ruby_bin.fs_err_try_exists()? { - bullet.sub_bullet("File exists") + print::sub_bullet("File exists") } else { - let sub = bullet.sub_bullet("Create ruby symlink to jruby"); + print::sub_bullet("Create ruby symlink to jruby"); fs_err::os::unix::fs::symlink("jruby", ruby_bin)?; - sub } - .done() }; let tgz_name = format!("ruby-{ruby_stdlib_version}-jruby-{version}.tgz"); From 74336a4e539d0d50eceb26fc06e6dd2f9ee0d4ee Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:12:27 -0600 Subject: [PATCH 03/37] Function style print interface --- jruby_executable/src/bin/jruby_build.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/jruby_executable/src/bin/jruby_build.rs b/jruby_executable/src/bin/jruby_build.rs index c8c0d0b..1ff50e3 100644 --- a/jruby_executable/src/bin/jruby_build.rs +++ b/jruby_executable/src/bin/jruby_build.rs @@ -72,24 +72,22 @@ fn jruby_build(args: &Args) -> Result<(), Box> { let jruby_dir = extracted_path.join(format!("jruby-{version}")); - log = { - let mut bullet = log.bullet("Removing unnecessary files"); + _ = { + print::bullet("Removing unnecessary files"); for pattern in &["*.bat", "*.dll", "*.exe"] { for path in glob::glob(&jruby_dir.join("bin").join(pattern).to_string_lossy())? .collect::, _>>()? { - bullet = bullet.sub_bullet(format!("Remove {}", path.display())); + print::sub_bullet(format!("Remove {}", path.display())); fs_err::remove_file(path)?; } } let path = jruby_dir.join("lib").join("target"); if path.fs_err_try_exists()? { - bullet = bullet.sub_bullet(format!("Remove recursive {}", path.display())); + print::sub_bullet(format!("Remove recursive {}", path.display())); fs_err::remove_dir_all(&path)?; } - - bullet.done() }; _ = { From 36b3a795eb46cbd9969cca1f691b41dcd16fa605 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:14:14 -0600 Subject: [PATCH 04/37] Function style print interface --- jruby_executable/src/bin/jruby_build.rs | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/jruby_executable/src/bin/jruby_build.rs b/jruby_executable/src/bin/jruby_build.rs index 1ff50e3..c30752e 100644 --- a/jruby_executable/src/bin/jruby_build.rs +++ b/jruby_executable/src/bin/jruby_build.rs @@ -48,24 +48,21 @@ fn jruby_build(args: &Args) -> Result<(), Box> { TarDownloadPath(volume_cache_dir.join(format!("jruby-dist-{version}-bin.tar.gz"))); if download_path.as_ref().fs_err_try_exists()? { - log = log - .bullet(format!( - "Using cached JRuby archive {}", - download_path.as_ref().display() - )) - .done(); + print::bullet(format!( + "Using cached JRuby archive {}", + download_path.as_ref().display() + )); } else { let url = format!( "https://repo1.maven.org/maven2/org/jruby/jruby-dist/{version}/jruby-dist-{version}-bin.tar.gz" ); - let timer = log - .bullet("Download JRuby") - .sub_bullet(format!("To {}", download_path.as_ref().to_string_lossy())) - .sub_bullet(format!("From {}", style::url(&url))) - .start_timer("Downloading"); - download_tar(&url, &download_path)?; + print::bullet("Download JRuby"); + print::sub_bullet(format!("To {}", download_path.as_ref().to_string_lossy())); + print::sub_bullet(format!("From {}", style::url(&url))); - log = timer.done().done(); + let timer = print::sub_start_timer("Downloading"); + download_tar(&url, &download_path)?; + timer.done(); } untar_to_dir(&download_path, &extracted_path)?; From 4c0421bc4bbb4d5ca0ad0b6d773afc58d9047ebf Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:16:05 -0600 Subject: [PATCH 05/37] Function style print interface --- jruby_executable/src/bin/jruby_build.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/jruby_executable/src/bin/jruby_build.rs b/jruby_executable/src/bin/jruby_build.rs index c30752e..5c647c1 100644 --- a/jruby_executable/src/bin/jruby_build.rs +++ b/jruby_executable/src/bin/jruby_build.rs @@ -14,6 +14,7 @@ use shared::{ use std::convert::From; use std::error::Error; use std::str::FromStr; +use std::time::Instant; static S3_BASE_URL: &str = "https://heroku-buildpack-ruby.s3.us-east-1.amazonaws.com"; @@ -32,7 +33,8 @@ fn jruby_build(args: &Args) -> Result<(), Box> { base_image, } = args; - let mut log = Print::new(std::io::stderr()).h1("Building JRuby"); + let start = Instant::now(); + print::h2("Building JRuby"); let inventory = source_dir().join("jruby_inventory.toml"); let volume_cache_dir = source_dir().join("cache"); let volume_output_dir = source_dir().join("output"); @@ -179,8 +181,7 @@ fn jruby_build(args: &Args) -> Result<(), Box> { } }; - log.done(); - + print::all_done(&Some(start)); Ok(()) } From 1d600b7b80f44c0f3ceb0a10258cce7cb083a0a2 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:16:24 -0600 Subject: [PATCH 06/37] Remove unused assignment --- jruby_executable/src/bin/jruby_build.rs | 144 ++++++++++++------------ 1 file changed, 70 insertions(+), 74 deletions(-) diff --git a/jruby_executable/src/bin/jruby_build.rs b/jruby_executable/src/bin/jruby_build.rs index 5c647c1..23eadd4 100644 --- a/jruby_executable/src/bin/jruby_build.rs +++ b/jruby_executable/src/bin/jruby_build.rs @@ -102,84 +102,80 @@ fn jruby_build(args: &Args) -> Result<(), Box> { let tgz_name = format!("ruby-{ruby_stdlib_version}-jruby-{version}.tgz"); - _ = { - print::bullet("Creating tgz archives"); - print::sub_bullet(format!( - "Inventory file {}", - style::value(inventory.to_string_lossy()) - )); - let tar_dir = volume_output_dir.join(base_image.to_string()); - - fs_err::create_dir_all(&tar_dir)?; - - let tar_file = fs_err::File::create(tar_dir.join(&tgz_name))?; + print::bullet("Creating tgz archives"); + print::sub_bullet(format!( + "Inventory file {}", + style::value(inventory.to_string_lossy()) + )); + let tar_dir = volume_output_dir.join(base_image.to_string()); + + fs_err::create_dir_all(&tar_dir)?; + + let tar_file = fs_err::File::create(tar_dir.join(&tgz_name))?; + + let timer = print::sub_start_timer(format!("Write {}", tar_file.path().display())); + tar_dir_to_file(&jruby_dir, &tar_file)?; + timer.done(); + + let tar_path = tar_file.path(); + let sha = sha256_from_path(tar_path)?; + let sha_seven = sha.chars().take(7).collect::(); + let sha_seven_path = append_filename_with(tar_path, &format!("-{sha_seven}"), ".tgz")?; + + print::sub_bullet(format!("Write {}", sha_seven_path.display(),)); + fs_err::copy(tar_file.path(), &sha_seven_path)?; + + let timestamp = chrono::Utc::now(); + for cpu_arch in [Arch::Amd64, Arch::Arm64] { + let distro_version = base_image.distro_version(); + let artifact = Artifact { + version: GemVersion::from_str(version)?, + os: inventory::artifact::Os::Linux, + arch: cpu_arch, + url: format!( + "{S3_BASE_URL}/{}", + sha_seven_path.strip_prefix(&volume_output_dir)?.display() + ), + checksum: format!("sha256:{sha}").parse()?, + metadata: ArtifactMetadata { + distro_version, + timestamp, + }, + }; + atomic_inventory_update(&inventory, |inventory| { + for prior in &inventory.artifacts { + if let Err(error) = artifact_same_url_different_checksum(prior, &artifact) { + // TODO: Investigate bullet stream ownership + println!( + "{}", + style::important(format!("!!!!!!!!!! Error updating inventory: {error}")) + ); + + fs_err::remove_file(&sha_seven_path)?; + return Err(error); + }; + } - let timer = print::sub_start_timer(format!("Write {}", tar_file.path().display())); - tar_dir_to_file(&jruby_dir, &tar_file)?; - timer.done(); + inventory + .artifacts + .retain(|a| artifact_is_different(a, &artifact)); - let tar_path = tar_file.path(); - let sha = sha256_from_path(tar_path)?; - let sha_seven = sha.chars().take(7).collect::(); - let sha_seven_path = append_filename_with(tar_path, &format!("-{sha_seven}"), ".tgz")?; - - print::sub_bullet(format!("Write {}", sha_seven_path.display(),)); - fs_err::copy(tar_file.path(), &sha_seven_path)?; - - let timestamp = chrono::Utc::now(); - for cpu_arch in [Arch::Amd64, Arch::Arm64] { - let distro_version = base_image.distro_version(); - let artifact = Artifact { - version: GemVersion::from_str(version)?, - os: inventory::artifact::Os::Linux, - arch: cpu_arch, - url: format!( - "{S3_BASE_URL}/{}", - sha_seven_path.strip_prefix(&volume_output_dir)?.display() - ), - checksum: format!("sha256:{sha}").parse()?, - metadata: ArtifactMetadata { - distro_version, - timestamp, - }, - }; - atomic_inventory_update(&inventory, |inventory| { - for prior in &inventory.artifacts { - if let Err(error) = artifact_same_url_different_checksum(prior, &artifact) { - // TODO: Investigate bullet stream ownership - println!( - "{}", - style::important(format!( - "!!!!!!!!!! Error updating inventory: {error}" - )) - ); - - fs_err::remove_file(&sha_seven_path)?; - return Err(error); - }; - } - - inventory - .artifacts - .retain(|a| artifact_is_different(a, &artifact)); - - inventory.push(artifact); - Ok(()) - })? - } + inventory.push(artifact); + Ok(()) + })? + } - // Can be removed once manifest file support is fully rolled out - for cpu_arch in [Arch::Amd64, Arch::Arm64] { - let dir = volume_output_dir - .join(base_image.to_string()) - .join(cpu_arch.to_string()); - fs_err::create_dir_all(&dir)?; + // Can be removed once manifest file support is fully rolled out + for cpu_arch in [Arch::Amd64, Arch::Arm64] { + let dir = volume_output_dir + .join(base_image.to_string()) + .join(cpu_arch.to_string()); + fs_err::create_dir_all(&dir)?; - let path = dir.join(&tgz_name); - print::sub_bullet(format!("Write {}", path.display())); - fs_err::copy(tar_file.path(), &path)?; - } - }; + let path = dir.join(&tgz_name); + print::sub_bullet(format!("Write {}", path.display())); + fs_err::copy(tar_file.path(), &path)?; + } print::all_done(&Some(start)); Ok(()) From 235e9cd8991af978b7ec34204c20dc98087daa09 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:16:36 -0600 Subject: [PATCH 07/37] Remove unused assignment --- jruby_executable/src/bin/jruby_build.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/jruby_executable/src/bin/jruby_build.rs b/jruby_executable/src/bin/jruby_build.rs index 23eadd4..4c6d562 100644 --- a/jruby_executable/src/bin/jruby_build.rs +++ b/jruby_executable/src/bin/jruby_build.rs @@ -89,16 +89,13 @@ fn jruby_build(args: &Args) -> Result<(), Box> { } }; - _ = { - print::bullet("Checking for `ruby` binstub"); - let ruby_bin = jruby_dir.join("bin").join("ruby"); - if ruby_bin.fs_err_try_exists()? { - print::sub_bullet("File exists") - } else { - print::sub_bullet("Create ruby symlink to jruby"); - fs_err::os::unix::fs::symlink("jruby", ruby_bin)?; - } - }; + let ruby_bin = jruby_dir.join("bin").join("ruby"); + if ruby_bin.fs_err_try_exists()? { + print::sub_bullet("File exists") + } else { + print::sub_bullet("Create ruby symlink to jruby"); + fs_err::os::unix::fs::symlink("jruby", ruby_bin)?; + } let tgz_name = format!("ruby-{ruby_stdlib_version}-jruby-{version}.tgz"); From 1f58bcd1f1b9bfd46da75fdbd37e8451448fa809 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:16:48 -0600 Subject: [PATCH 08/37] Remove unused assignment --- jruby_executable/src/bin/jruby_build.rs | 28 ++++++++++++------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/jruby_executable/src/bin/jruby_build.rs b/jruby_executable/src/bin/jruby_build.rs index 4c6d562..1d9df46 100644 --- a/jruby_executable/src/bin/jruby_build.rs +++ b/jruby_executable/src/bin/jruby_build.rs @@ -71,23 +71,21 @@ fn jruby_build(args: &Args) -> Result<(), Box> { let jruby_dir = extracted_path.join(format!("jruby-{version}")); - _ = { - print::bullet("Removing unnecessary files"); - for pattern in &["*.bat", "*.dll", "*.exe"] { - for path in glob::glob(&jruby_dir.join("bin").join(pattern).to_string_lossy())? - .collect::, _>>()? - { - print::sub_bullet(format!("Remove {}", path.display())); - fs_err::remove_file(path)?; - } + print::bullet("Removing unnecessary files"); + for pattern in &["*.bat", "*.dll", "*.exe"] { + for path in glob::glob(&jruby_dir.join("bin").join(pattern).to_string_lossy())? + .collect::, _>>()? + { + print::sub_bullet(format!("Remove {}", path.display())); + fs_err::remove_file(path)?; } + } - let path = jruby_dir.join("lib").join("target"); - if path.fs_err_try_exists()? { - print::sub_bullet(format!("Remove recursive {}", path.display())); - fs_err::remove_dir_all(&path)?; - } - }; + let path = jruby_dir.join("lib").join("target"); + if path.fs_err_try_exists()? { + print::sub_bullet(format!("Remove recursive {}", path.display())); + fs_err::remove_dir_all(&path)?; + } let ruby_bin = jruby_dir.join("bin").join("ruby"); if ruby_bin.fs_err_try_exists()? { From 7d03a5abd78f5c0d18a2314c01e1e9d9545ba4a9 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:17:53 -0600 Subject: [PATCH 09/37] Remove Print struct --- jruby_executable/src/bin/jruby_build.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/jruby_executable/src/bin/jruby_build.rs b/jruby_executable/src/bin/jruby_build.rs index 1d9df46..3dbebdd 100644 --- a/jruby_executable/src/bin/jruby_build.rs +++ b/jruby_executable/src/bin/jruby_build.rs @@ -1,4 +1,4 @@ -use bullet_stream::{Print, global::print, style}; +use bullet_stream::{global::print, style}; use clap::Parser; use fs_err::PathExt; use gem_version::GemVersion; @@ -179,13 +179,11 @@ fn jruby_build(args: &Args) -> Result<(), Box> { fn main() { let args = Args::parse(); if let Err(error) = jruby_build(&args) { - Print::new(std::io::stderr()) - .without_header() - .error(formatdoc! {" - ❌ Command failed ❌ + print::error(formatdoc! {" + ❌ Command failed ❌ - {error} - "}); + {error} + "}); std::process::exit(1); } } From 9cf79a1f9b361341cb4f47375acab864cc25c5f1 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:18:39 -0600 Subject: [PATCH 10/37] Remove Print struct --- jruby_executable/src/bin/jruby_changelog.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/jruby_executable/src/bin/jruby_changelog.rs b/jruby_executable/src/bin/jruby_changelog.rs index c861347..98f0c76 100644 --- a/jruby_executable/src/bin/jruby_changelog.rs +++ b/jruby_executable/src/bin/jruby_changelog.rs @@ -1,6 +1,6 @@ use std::error::Error; -use bullet_stream::Print; +use bullet_stream::global::print; use clap::Parser; use indoc::formatdoc; use jruby_executable::jruby_build_properties; @@ -40,13 +40,11 @@ fn jruby_changelog(args: &Args) -> Result<(), Box> { fn main() { let args = Args::parse(); if let Err(error) = jruby_changelog(&args) { - Print::new(std::io::stderr()) - .without_header() - .error(formatdoc! {" - ❌ Command failed ❌ + print::error(formatdoc! {" + ❌ Command failed ❌ - {error} - "}); + {error} + "}); std::process::exit(1); } From e04002cedec80983c4cfcf10f04308764ccae5e9 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:19:10 -0600 Subject: [PATCH 11/37] Prefer print over println --- jruby_executable/src/bin/jruby_changelog.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jruby_executable/src/bin/jruby_changelog.rs b/jruby_executable/src/bin/jruby_changelog.rs index 98f0c76..0062334 100644 --- a/jruby_executable/src/bin/jruby_changelog.rs +++ b/jruby_executable/src/bin/jruby_changelog.rs @@ -32,7 +32,7 @@ fn jruby_changelog(args: &Args) -> Result<(), Box> { The JRuby release notes can be found on the [JRuby website](https://www.jruby.org/news). "}; - println!("{changelog}"); + print::plain(changelog); Ok(()) } From 7992919dc232bb90994d8ef2bc67b718a306bec1 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:24:52 -0600 Subject: [PATCH 12/37] Remove struct usage --- jruby_executable/src/bin/jruby_check.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/jruby_executable/src/bin/jruby_check.rs b/jruby_executable/src/bin/jruby_check.rs index faf7a20..cc7a47c 100644 --- a/jruby_executable/src/bin/jruby_check.rs +++ b/jruby_executable/src/bin/jruby_check.rs @@ -1,4 +1,4 @@ -use bullet_stream::{Print, style}; +use bullet_stream::{Print, global::print, style}; use clap::Parser; use fun_run::CommandWithName; use indoc::formatdoc; @@ -133,13 +133,11 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { fn main() { let args = RubyArgs::parse(); if let Err(error) = jruby_check(&args) { - Print::new(std::io::stderr()) - .without_header() - .error(formatdoc! {" - ❌ Command failed ❌ + print::error(formatdoc! {" + ❌ Command failed ❌ - {error} - "}); + {error} + "}); std::process::exit(1); } } From 0e81b512d93c4546332a2b9a242b5544d2402aa4 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:26:48 -0600 Subject: [PATCH 13/37] Remove struct usage --- ruby_executable/src/bin/ruby_build.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/ruby_executable/src/bin/ruby_build.rs b/ruby_executable/src/bin/ruby_build.rs index bd049f8..3d0233b 100644 --- a/ruby_executable/src/bin/ruby_build.rs +++ b/ruby_executable/src/bin/ruby_build.rs @@ -1,4 +1,4 @@ -use bullet_stream::{Print, style}; +use bullet_stream::{Print, global::print, style}; use clap::Parser; use fs_err::PathExt; use fun_run::CommandWithName; @@ -215,13 +215,11 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { fn main() { let args = RubyArgs::parse(); if let Err(error) = ruby_build(&args) { - Print::new(std::io::stderr()) - .without_header() - .error(formatdoc! {" - ❌ Command failed ❌ + print::error(formatdoc! {" + ❌ Command failed ❌ - {error} - "}); + {error} + "}); std::process::exit(1); } } From e61b61bc19583be8eef9824dcd2f9b3a467af0e9 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:26:55 -0600 Subject: [PATCH 14/37] Remove struct usage --- ruby_executable/src/bin/ruby_changelog.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/ruby_executable/src/bin/ruby_changelog.rs b/ruby_executable/src/bin/ruby_changelog.rs index 3edcc75..ff7c71c 100644 --- a/ruby_executable/src/bin/ruby_changelog.rs +++ b/ruby_executable/src/bin/ruby_changelog.rs @@ -1,6 +1,6 @@ use std::{error::Error, io::Write}; -use bullet_stream::Print; +use bullet_stream::global::print; use clap::Parser; use indoc::formatdoc; use shared::RubyDownloadVersion; @@ -58,13 +58,11 @@ where fn main() { let args = Args::parse(); if let Err(error) = ruby_changelog(&args, std::io::stdout()) { - Print::new(std::io::stderr()) - .without_header() - .error(formatdoc! {" - ❌ Command failed ❌ + print::error(formatdoc! {" + ❌ Command failed ❌ - {error} - "}); + {error} + "}); std::process::exit(1); } } From cfeb10318efc65883ce6537d948b44cf18fc143d Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:27:01 -0600 Subject: [PATCH 15/37] Remove struct usage --- ruby_executable/src/bin/ruby_check.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/ruby_executable/src/bin/ruby_check.rs b/ruby_executable/src/bin/ruby_check.rs index 1002dd0..9936ddb 100644 --- a/ruby_executable/src/bin/ruby_check.rs +++ b/ruby_executable/src/bin/ruby_check.rs @@ -1,4 +1,4 @@ -use bullet_stream::{Print, style}; +use bullet_stream::{Print, global::print, style}; use clap::Parser; use fun_run::CommandWithName; use indoc::formatdoc; @@ -81,13 +81,11 @@ fn ruby_check(args: &RubyArgs) -> Result<(), Box> { fn main() { let args = RubyArgs::parse(); if let Err(error) = ruby_check(&args) { - Print::new(std::io::stderr()) - .without_header() - .error(formatdoc! {" - ❌ Command failed ❌ + print::error(formatdoc! {" + ❌ Command failed ❌ - {error} - "}); + {error} + "}); std::process::exit(1); } } From cfe04463632f18fc3a473b91866d78d6fb777a78 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:27:08 -0600 Subject: [PATCH 16/37] Remove struct usage --- shared/src/bin/inventory_check.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/shared/src/bin/inventory_check.rs b/shared/src/bin/inventory_check.rs index e42951b..3f8df3b 100644 --- a/shared/src/bin/inventory_check.rs +++ b/shared/src/bin/inventory_check.rs @@ -1,3 +1,4 @@ +use bullet_stream::global::print; use clap::Parser; use indoc::formatdoc; use shared::inventory_check; @@ -17,13 +18,11 @@ fn check(path: &Path) -> Result<(), Box> { fn main() { let args = Args::parse(); if let Err(error) = check(&args.path) { - bullet_stream::Print::new(std::io::stderr()) - .without_header() - .error(formatdoc! {" - ❌ Command failed ❌ + print::error(formatdoc! {" + ❌ Command failed ❌ - {error} - "}); + {error} + "}); std::process::exit(1); } } From d85b01be699c0c318e21b127aeef4e779e653a14 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:37:32 -0600 Subject: [PATCH 17/37] Prefer print over println --- jruby_executable/src/bin/jruby_check.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jruby_executable/src/bin/jruby_check.rs b/jruby_executable/src/bin/jruby_check.rs index cc7a47c..aa5212e 100644 --- a/jruby_executable/src/bin/jruby_check.rs +++ b/jruby_executable/src/bin/jruby_check.rs @@ -121,7 +121,7 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { }; log.done(); - eprintln!(); + print::plain(""); // Print results to STDOUT for github summary println!("## JRuby {version} stdlib {jruby_stdlib_version} linux/{arch} for {base_image}"); From 75a698307ce898688d68d2da59b6d329c1bac070 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:39:46 -0600 Subject: [PATCH 18/37] Function print interface --- jruby_executable/src/bin/jruby_check.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/jruby_executable/src/bin/jruby_check.rs b/jruby_executable/src/bin/jruby_check.rs index aa5212e..3422de6 100644 --- a/jruby_executable/src/bin/jruby_check.rs +++ b/jruby_executable/src/bin/jruby_check.rs @@ -79,7 +79,7 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { bullet.done() }; - let (log, result) = { + let (_, result) = { let inner_jruby_path = PathBuf::from(INNER_OUTPUT) .join(base_image.to_string()) .join(format!("ruby-{jruby_stdlib_version}-jruby-{version}.tgz")); @@ -110,17 +110,13 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { .join(" && "), ); - let mut cmd_stream = log.bullet("Versions"); + print::bullet("Versions"); - let result = cmd_stream.stream_with( - format!("Running {}", style::command(cmd.name())), - |stdout, stderr| cmd.stream_output(stdout, stderr), - )?; + let result = print::sub_stream_cmd(cmd)?; - (cmd_stream.done(), result) + ((), result) }; - log.done(); print::plain(""); // Print results to STDOUT for github summary From 96f0a03a6658047b8c6bac1b8a5a89a33783e4ca Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:41:19 -0600 Subject: [PATCH 19/37] Function print interface --- jruby_executable/src/bin/jruby_check.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/jruby_executable/src/bin/jruby_check.rs b/jruby_executable/src/bin/jruby_check.rs index 3422de6..cbedb29 100644 --- a/jruby_executable/src/bin/jruby_check.rs +++ b/jruby_executable/src/bin/jruby_check.rs @@ -62,8 +62,8 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { let outside_output = source_dir().join("output"); - log = { - let mut bullet = log.bullet(format!("Docker image {image_name}")); + _ = { + print::bullet(format!("Docker image {image_name}")); let mut docker_build = Command::new("docker"); docker_build.arg("build"); docker_build.args(["--platform", &format!("linux/{arch}")]); @@ -71,12 +71,7 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { docker_build.args(["--tag", &image_name]); docker_build.args(["--file", &dockerfile_path.display().to_string()]); docker_build.arg(source_dir().to_str().expect("Path to str")); - let _ = bullet.stream_with( - format!("Building via {}", style::command(docker_build.name())), - |stdout, stderr| docker_build.stream_output(stdout, stderr), - )?; - - bullet.done() + print::sub_stream_cmd(docker_build)?; }; let (_, result) = { From 900030d21baf9c14644acb9895353970808b58d0 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:43:54 -0600 Subject: [PATCH 20/37] Function print interface --- jruby_executable/src/bin/jruby_check.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/jruby_executable/src/bin/jruby_check.rs b/jruby_executable/src/bin/jruby_check.rs index cbedb29..d5335ab 100644 --- a/jruby_executable/src/bin/jruby_check.rs +++ b/jruby_executable/src/bin/jruby_check.rs @@ -43,9 +43,7 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { let image_name = format!("heroku/jruby-builder:{base_image}"); - let mut stream = log - .bullet(format!("Dockerfile for {image_name}")) - .start_stream("Contents"); + print::bullet(format!("Dockerfile for {image_name}")); let dockerfile = formatdoc! {" FROM heroku/heroku:{distro_number}-build @@ -54,12 +52,10 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { RUN apt-get update -y; apt-get install default-jre default-jdk -y "}; - write!(stream, "{dockerfile}")?; + print::sub_stream_with("Contents", |mut stream, _| write!(stream, "{dockerfile}"))?; fs_err::write(&dockerfile_path, dockerfile)?; - log = stream.done().done(); - let outside_output = source_dir().join("output"); _ = { From ef5a1611c7a7ccaf2b334db7ef832465e80f03ab Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:45:01 -0600 Subject: [PATCH 21/37] Function print interface --- jruby_executable/src/bin/jruby_check.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jruby_executable/src/bin/jruby_check.rs b/jruby_executable/src/bin/jruby_check.rs index d5335ab..741db68 100644 --- a/jruby_executable/src/bin/jruby_check.rs +++ b/jruby_executable/src/bin/jruby_check.rs @@ -7,6 +7,7 @@ use libherokubuildpack::inventory::artifact::Arch; use shared::{BaseImage, source_dir}; use std::error::Error; use std::io::Write; +use std::time::Instant; use std::{path::PathBuf, process::Command}; static INNER_OUTPUT: &str = "/tmp/output"; @@ -33,7 +34,8 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { let jruby_stdlib_version = jruby_build_properties(version)?.ruby_stdlib_version()?; // Log progress to STDERR, print results to STDOUT directly - let mut log = Print::new(std::io::stderr()).h1(format!( + let start = Instant::now(); + print::h2(format!( "Prepare: Checking JRuby version ({version} linux/{arch} stdlib {jruby_stdlib_version}) for {base_image}", )); let distro_number = base_image.distro_number(); @@ -108,6 +110,8 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { ((), result) }; + print::all_done(&Some(start)); + print::plain(""); // Print results to STDOUT for github summary From 3c30240cfbc483bfb32916355c5c56f648ed9ddb Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:47:01 -0600 Subject: [PATCH 22/37] Remove unused assignment --- jruby_executable/src/bin/jruby_check.rs | 30 +++++++++++-------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/jruby_executable/src/bin/jruby_check.rs b/jruby_executable/src/bin/jruby_check.rs index 741db68..9b2c9e5 100644 --- a/jruby_executable/src/bin/jruby_check.rs +++ b/jruby_executable/src/bin/jruby_check.rs @@ -60,19 +60,17 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { let outside_output = source_dir().join("output"); - _ = { - print::bullet(format!("Docker image {image_name}")); - let mut docker_build = Command::new("docker"); - docker_build.arg("build"); - docker_build.args(["--platform", &format!("linux/{arch}")]); - docker_build.args(["--progress", "plain"]); - docker_build.args(["--tag", &image_name]); - docker_build.args(["--file", &dockerfile_path.display().to_string()]); - docker_build.arg(source_dir().to_str().expect("Path to str")); - print::sub_stream_cmd(docker_build)?; - }; - - let (_, result) = { + print::bullet(format!("Docker image {image_name}")); + let mut docker_build = Command::new("docker"); + docker_build.arg("build"); + docker_build.args(["--platform", &format!("linux/{arch}")]); + docker_build.args(["--progress", "plain"]); + docker_build.args(["--tag", &image_name]); + docker_build.args(["--file", &dockerfile_path.display().to_string()]); + docker_build.arg(source_dir().to_str().expect("Path to str")); + print::sub_stream_cmd(docker_build)?; + + let output = { let inner_jruby_path = PathBuf::from(INNER_OUTPUT) .join(base_image.to_string()) .join(format!("ruby-{jruby_stdlib_version}-jruby-{version}.tgz")); @@ -105,9 +103,7 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { print::bullet("Versions"); - let result = print::sub_stream_cmd(cmd)?; - - ((), result) + print::sub_stream_cmd(cmd)? }; print::all_done(&Some(start)); @@ -117,7 +113,7 @@ fn jruby_check(args: &RubyArgs) -> Result<(), Box> { // Print results to STDOUT for github summary println!("## JRuby {version} stdlib {jruby_stdlib_version} linux/{arch} for {base_image}"); println!(); - println!("{}", result.stdout_lossy()); + println!("{}", output.stdout_lossy()); Ok(()) } From babb1b0b5e15ecc2c748f4fa657b865c13bfa755 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:47:19 -0600 Subject: [PATCH 23/37] Remove unused imports --- jruby_executable/src/bin/jruby_check.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jruby_executable/src/bin/jruby_check.rs b/jruby_executable/src/bin/jruby_check.rs index 9b2c9e5..9d7c481 100644 --- a/jruby_executable/src/bin/jruby_check.rs +++ b/jruby_executable/src/bin/jruby_check.rs @@ -1,6 +1,5 @@ -use bullet_stream::{Print, global::print, style}; +use bullet_stream::global::print; use clap::Parser; -use fun_run::CommandWithName; use indoc::formatdoc; use jruby_executable::jruby_build_properties; use libherokubuildpack::inventory::artifact::Arch; From 6f615df019499e0d65a2d085cfb2436424ccf7ae Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:48:01 -0600 Subject: [PATCH 24/37] Use print interface --- ruby_executable/src/bin/ruby_build.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ruby_executable/src/bin/ruby_build.rs b/ruby_executable/src/bin/ruby_build.rs index 3d0233b..e3889de 100644 --- a/ruby_executable/src/bin/ruby_build.rs +++ b/ruby_executable/src/bin/ruby_build.rs @@ -18,6 +18,7 @@ use std::{ path::{Path, PathBuf}, process::Command, str::FromStr, + time::Instant, }; static INNER_OUTPUT: &str = "/tmp/output"; @@ -64,6 +65,7 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { base_image, } = args; + let start = Instant::now(); let mut log = Print::new(std::io::stderr()).h1("Building Ruby"); let inventory = source_dir().join("ruby_inventory.toml"); let volume_cache_dir = source_dir().join("cache"); @@ -150,7 +152,7 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { bullet.done() }; - log = { + _ = { let mut bullet = log.bullet(format!( "Updating manifest {}", style::value(inventory.to_string_lossy()) @@ -207,7 +209,7 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { bullet.done() }; - log.done(); + print::all_done(&Some(start)); Ok(()) } From e4b284ec8e155d2f962cfee836e15629f12e2dec Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:49:04 -0600 Subject: [PATCH 25/37] Use print interface --- ruby_executable/src/bin/ruby_build.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ruby_executable/src/bin/ruby_build.rs b/ruby_executable/src/bin/ruby_build.rs index e3889de..8a0bb5f 100644 --- a/ruby_executable/src/bin/ruby_build.rs +++ b/ruby_executable/src/bin/ruby_build.rs @@ -153,7 +153,7 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { }; _ = { - let mut bullet = log.bullet(format!( + print::bullet(format!( "Updating manifest {}", style::value(inventory.to_string_lossy()) )); @@ -168,7 +168,7 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { sha_seven_path.strip_prefix(&volume_output_dir)?.display() ); - bullet = bullet.sub_bullet(format!("Copying SHA tgz {}", sha_seven_path.display(),)); + print::sub_bullet(format!("Copying SHA tgz {}", sha_seven_path.display(),)); fs_err::copy(output_tar, &sha_seven_path)?; let artifact = Artifact { @@ -205,8 +205,6 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { Ok(()) })?; - - bullet.done() }; print::all_done(&Some(start)); From 05a16a3b6360a0185f86b69bb785240c75f6c0ce Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:49:43 -0600 Subject: [PATCH 26/37] Use print interface --- ruby_executable/src/bin/ruby_build.rs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/ruby_executable/src/bin/ruby_build.rs b/ruby_executable/src/bin/ruby_build.rs index 8a0bb5f..4b92c08 100644 --- a/ruby_executable/src/bin/ruby_build.rs +++ b/ruby_executable/src/bin/ruby_build.rs @@ -123,8 +123,8 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { bullet.done() }; - log = { - let mut bullet = log.bullet("Make Ruby"); + _ = { + print::bullet("Make Ruby"); let input_tar = PathBuf::from(INNER_CACHE).join(format!("ruby-source-{version}.tgz")); let output_tar = output_tar_path(Path::new(INNER_OUTPUT), version, base_image, arch); let volume_cache = volume_cache_dir.display(); @@ -145,11 +145,7 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { output_tar.display() )); - bullet.stream_with( - format!("Running {}", style::command(docker_run.name())), - |stdout, stderr| docker_run.stream_output(stdout, stderr), - )?; - bullet.done() + print::sub_stream_cmd(docker_run)?; }; _ = { From 944847f7684f4a4bb72051b67166ee54d657f3f1 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:50:23 -0600 Subject: [PATCH 27/37] Use print interface --- ruby_executable/src/bin/ruby_build.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ruby_executable/src/bin/ruby_build.rs b/ruby_executable/src/bin/ruby_build.rs index 4b92c08..6b23958 100644 --- a/ruby_executable/src/bin/ruby_build.rs +++ b/ruby_executable/src/bin/ruby_build.rs @@ -108,19 +108,17 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { let download_tar_path = TarDownloadPath(volume_cache_dir.join(format!("ruby-source-{version}.tgz"))); - log = if Path::fs_err_try_exists(download_tar_path.as_ref())? { - log.bullet(format!( + if Path::fs_err_try_exists(download_tar_path.as_ref())? { + print::bullet(format!( "Using cached tarball {}", download_tar_path.as_ref().display() )) - .done() } else { - let bullet = log.bullet(format!( + print::bullet(format!( "Downloading {version} to {}", download_tar_path.as_ref().display() )); download_tar(&version.download_url(), &download_tar_path)?; - bullet.done() }; _ = { From 8ec927e60c9b58cb292099a80775cbbe7fbb7745 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:51:30 -0600 Subject: [PATCH 28/37] Use print interface --- ruby_executable/src/bin/ruby_build.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/ruby_executable/src/bin/ruby_build.rs b/ruby_executable/src/bin/ruby_build.rs index 6b23958..983ca66 100644 --- a/ruby_executable/src/bin/ruby_build.rs +++ b/ruby_executable/src/bin/ruby_build.rs @@ -88,8 +88,8 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { bullet.done() }; - log = { - let mut bullet = log.bullet(format!("Docker image {image_name}")); + _ = { + print::bullet(format!("Docker image {image_name}")); let mut docker_build = Command::new("docker"); docker_build.arg("build"); docker_build.args(["--platform", &format!("linux/{arch}")]); @@ -97,12 +97,7 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { docker_build.args(["--tag", &image_name]); docker_build.args(["--file", &dockerfile_path.display().to_string()]); docker_build.arg(source_dir()); - let _ = bullet.stream_with( - format!("Building via {}", style::command(docker_build.name())), - |stdout, stderr| docker_build.stream_output(stdout, stderr), - )?; - - bullet.done() + print::sub_stream_cmd(docker_build)?; }; let download_tar_path = From efc7c83c9d8e96393a7f74292a46bdb339473819 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:52:26 -0600 Subject: [PATCH 29/37] Use print interface --- ruby_executable/src/bin/ruby_build.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ruby_executable/src/bin/ruby_build.rs b/ruby_executable/src/bin/ruby_build.rs index 983ca66..53d354c 100644 --- a/ruby_executable/src/bin/ruby_build.rs +++ b/ruby_executable/src/bin/ruby_build.rs @@ -79,13 +79,12 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { let dockerfile = ruby_dockerfile_contents(base_image); let dockerfile_path = temp_dir.path().join("Dockerfile"); - log = { - let mut bullet = log.bullet("Dockerfile"); - bullet.stream_with("Writing contents to tmpdir", |mut stream, _| { - write!(stream, "{dockerfile}")?; - fs_err::write(&dockerfile_path, &dockerfile) + _ = { + print::bullet("Dockerfile"); + print::sub_stream_with("Writing contents to tmpdir", |mut stream, _| { + write!(stream, "{dockerfile}") + .and_then(|_| fs_err::write(&dockerfile_path, &dockerfile)) })?; - bullet.done() }; _ = { From 82450917367b8afc425b813088e61466e3eeacec Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:53:02 -0600 Subject: [PATCH 30/37] Use print interface --- ruby_executable/src/bin/ruby_build.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ruby_executable/src/bin/ruby_build.rs b/ruby_executable/src/bin/ruby_build.rs index 53d354c..1523428 100644 --- a/ruby_executable/src/bin/ruby_build.rs +++ b/ruby_executable/src/bin/ruby_build.rs @@ -1,7 +1,6 @@ -use bullet_stream::{Print, global::print, style}; +use bullet_stream::{global::print, style}; use clap::Parser; use fs_err::PathExt; -use fun_run::CommandWithName; use gem_version::GemVersion; use indoc::{formatdoc, indoc}; use libherokubuildpack::inventory::{ @@ -66,7 +65,7 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { } = args; let start = Instant::now(); - let mut log = Print::new(std::io::stderr()).h1("Building Ruby"); + print::h2("Building Ruby"); let inventory = source_dir().join("ruby_inventory.toml"); let volume_cache_dir = source_dir().join("cache"); let volume_output_dir = source_dir().join("output"); From 6d161ec531141dd4f998f754c65e1105b72090b6 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:54:03 -0600 Subject: [PATCH 31/37] Remove unused assignments --- ruby_executable/src/bin/ruby_build.rs | 181 ++++++++++++-------------- 1 file changed, 86 insertions(+), 95 deletions(-) diff --git a/ruby_executable/src/bin/ruby_build.rs b/ruby_executable/src/bin/ruby_build.rs index 1523428..90a5dc9 100644 --- a/ruby_executable/src/bin/ruby_build.rs +++ b/ruby_executable/src/bin/ruby_build.rs @@ -78,25 +78,20 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { let dockerfile = ruby_dockerfile_contents(base_image); let dockerfile_path = temp_dir.path().join("Dockerfile"); - _ = { - print::bullet("Dockerfile"); - print::sub_stream_with("Writing contents to tmpdir", |mut stream, _| { - write!(stream, "{dockerfile}") - .and_then(|_| fs_err::write(&dockerfile_path, &dockerfile)) - })?; - }; - - _ = { - print::bullet(format!("Docker image {image_name}")); - let mut docker_build = Command::new("docker"); - docker_build.arg("build"); - docker_build.args(["--platform", &format!("linux/{arch}")]); - docker_build.args(["--progress", "plain"]); - docker_build.args(["--tag", &image_name]); - docker_build.args(["--file", &dockerfile_path.display().to_string()]); - docker_build.arg(source_dir()); - print::sub_stream_cmd(docker_build)?; - }; + print::bullet("Dockerfile"); + print::sub_stream_with("Writing contents to tmpdir", |mut stream, _| { + write!(stream, "{dockerfile}").and_then(|_| fs_err::write(&dockerfile_path, &dockerfile)) + })?; + + print::bullet(format!("Docker image {image_name}")); + let mut docker_build = Command::new("docker"); + docker_build.arg("build"); + docker_build.args(["--platform", &format!("linux/{arch}")]); + docker_build.args(["--progress", "plain"]); + docker_build.args(["--tag", &image_name]); + docker_build.args(["--file", &dockerfile_path.display().to_string()]); + docker_build.arg(source_dir()); + print::sub_stream_cmd(docker_build)?; let download_tar_path = TarDownloadPath(volume_cache_dir.join(format!("ruby-source-{version}.tgz"))); @@ -114,85 +109,81 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { download_tar(&version.download_url(), &download_tar_path)?; }; - _ = { - print::bullet("Make Ruby"); - let input_tar = PathBuf::from(INNER_CACHE).join(format!("ruby-source-{version}.tgz")); - let output_tar = output_tar_path(Path::new(INNER_OUTPUT), version, base_image, arch); - let volume_cache = volume_cache_dir.display(); - let volume_output = volume_output_dir.display(); - - let mut docker_run = Command::new("docker"); - docker_run.arg("run"); - docker_run.arg("--rm"); - docker_run.args(["--platform", &format!("linux/{arch}")]); - docker_run.args(["--volume", &format!("{volume_output}:{INNER_OUTPUT}")]); - docker_run.args(["--volume", &format!("{volume_cache}:{INNER_CACHE}")]); - - docker_run.arg(&image_name); - docker_run.args(["bash", "-c"]); - docker_run.arg(format!( - "./make_ruby.sh {} {}", - input_tar.display(), - output_tar.display() - )); - - print::sub_stream_cmd(docker_run)?; + print::bullet("Make Ruby"); + let input_tar = PathBuf::from(INNER_CACHE).join(format!("ruby-source-{version}.tgz")); + let output_tar = output_tar_path(Path::new(INNER_OUTPUT), version, base_image, arch); + let volume_cache = volume_cache_dir.display(); + let volume_output = volume_output_dir.display(); + + let mut docker_run = Command::new("docker"); + docker_run.arg("run"); + docker_run.arg("--rm"); + docker_run.args(["--platform", &format!("linux/{arch}")]); + docker_run.args(["--volume", &format!("{volume_output}:{INNER_OUTPUT}")]); + docker_run.args(["--volume", &format!("{volume_cache}:{INNER_CACHE}")]); + + docker_run.arg(&image_name); + docker_run.args(["bash", "-c"]); + docker_run.arg(format!( + "./make_ruby.sh {} {}", + input_tar.display(), + output_tar.display() + )); + + print::sub_stream_cmd(docker_run)?; + + print::bullet(format!( + "Updating manifest {}", + style::value(inventory.to_string_lossy()) + )); + + let output_tar = output_tar_path(&volume_output_dir, version, base_image, arch); + + let sha = sha256_from_path(&output_tar)?; + let sha_seven = sha.chars().take(7).collect::(); + let sha_seven_path = append_filename_with(&output_tar, &format!("-{sha_seven}"), ".tgz")?; + let url = format!( + "{S3_BASE_URL}/{}", + sha_seven_path.strip_prefix(&volume_output_dir)?.display() + ); + + print::sub_bullet(format!("Copying SHA tgz {}", sha_seven_path.display(),)); + fs_err::copy(output_tar, &sha_seven_path)?; + + let artifact = Artifact { + version: GemVersion::from_str(&version.bundler_format())?, + os: inventory::artifact::Os::Linux, + arch: *arch, + url, + checksum: format!("sha256:{sha}").parse()?, + metadata: ArtifactMetadata { + distro_version: base_image.distro_version(), + timestamp: chrono::Utc::now(), + }, }; - _ = { - print::bullet(format!( - "Updating manifest {}", - style::value(inventory.to_string_lossy()) - )); + atomic_inventory_update(&inventory, |inventory| { + for prior in &inventory.artifacts { + if let Err(error) = artifact_same_url_different_checksum(prior, &artifact) { + // TODO: Investigate bullet stream ownership + println!( + "{}", + style::important(format!("!!!!!!!!!! Error updating inventory: {error}")) + ); - let output_tar = output_tar_path(&volume_output_dir, version, base_image, arch); - - let sha = sha256_from_path(&output_tar)?; - let sha_seven = sha.chars().take(7).collect::(); - let sha_seven_path = append_filename_with(&output_tar, &format!("-{sha_seven}"), ".tgz")?; - let url = format!( - "{S3_BASE_URL}/{}", - sha_seven_path.strip_prefix(&volume_output_dir)?.display() - ); - - print::sub_bullet(format!("Copying SHA tgz {}", sha_seven_path.display(),)); - fs_err::copy(output_tar, &sha_seven_path)?; - - let artifact = Artifact { - version: GemVersion::from_str(&version.bundler_format())?, - os: inventory::artifact::Os::Linux, - arch: *arch, - url, - checksum: format!("sha256:{sha}").parse()?, - metadata: ArtifactMetadata { - distro_version: base_image.distro_version(), - timestamp: chrono::Utc::now(), - }, - }; - - atomic_inventory_update(&inventory, |inventory| { - for prior in &inventory.artifacts { - if let Err(error) = artifact_same_url_different_checksum(prior, &artifact) { - // TODO: Investigate bullet stream ownership - println!( - "{}", - style::important(format!("!!!!!!!!!! Error updating inventory: {error}")) - ); - - fs_err::remove_file(&sha_seven_path)?; - return Err(error); - }; - } - - inventory - .artifacts - .retain(|a| artifact_is_different(a, &artifact)); - - inventory.push(artifact); - - Ok(()) - })?; - }; + fs_err::remove_file(&sha_seven_path)?; + return Err(error); + }; + } + + inventory + .artifacts + .retain(|a| artifact_is_different(a, &artifact)); + + inventory.push(artifact); + + Ok(()) + })?; print::all_done(&Some(start)); From e4c6febf183353281fe4fea4fbc8343eedd89ad6 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:54:58 -0600 Subject: [PATCH 32/37] Prefer print function --- ruby_executable/src/bin/ruby_check.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/ruby_executable/src/bin/ruby_check.rs b/ruby_executable/src/bin/ruby_check.rs index 9936ddb..249c967 100644 --- a/ruby_executable/src/bin/ruby_check.rs +++ b/ruby_executable/src/bin/ruby_check.rs @@ -60,20 +60,15 @@ fn ruby_check(args: &RubyArgs) -> Result<(), Box> { .join(" && "), ); - let mut cmd_stream = log.bullet("Versions"); + print::bullet("Versions"); + let output = print::sub_stream_cmd(cmd)?; - let result = cmd_stream.stream_with( - format!("Running {}", style::command(cmd.name())), - |stdout, stderr| cmd.stream_output(stdout, stderr), - )?; - - cmd_stream.done().done(); eprintln!(); // Print results to STDOUT for github summary println!("## Ruby {version} linux/{arch} for {base_image}"); println!(); - println!("{}", result.stdout_lossy()); + println!("{}", output.stdout_lossy()); Ok(()) } From 2a078094365bf73073852a7d809ef0e78d61641e Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:55:42 -0600 Subject: [PATCH 33/37] Prefer print function --- ruby_executable/src/bin/ruby_check.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ruby_executable/src/bin/ruby_check.rs b/ruby_executable/src/bin/ruby_check.rs index 249c967..b59aec1 100644 --- a/ruby_executable/src/bin/ruby_check.rs +++ b/ruby_executable/src/bin/ruby_check.rs @@ -4,7 +4,7 @@ use fun_run::CommandWithName; use indoc::formatdoc; use libherokubuildpack::inventory::artifact::Arch; use shared::{BaseImage, RubyDownloadVersion, output_tar_path, source_dir}; -use std::{error::Error, path::PathBuf, process::Command}; +use std::{error::Error, path::PathBuf, process::Command, time::Instant}; static INNER_OUTPUT: &str = "/tmp/output"; @@ -26,6 +26,7 @@ fn ruby_check(args: &RubyArgs) -> Result<(), Box> { version, base_image, } = args; + let start = Instant::now(); let log = Print::new(std::io::stderr()).h1(format!( "Checking Ruby version ({version} linux/{arch}) for {base_image}", )); @@ -63,7 +64,8 @@ fn ruby_check(args: &RubyArgs) -> Result<(), Box> { print::bullet("Versions"); let output = print::sub_stream_cmd(cmd)?; - eprintln!(); + print::all_done(&Some(start)); + print::plain(""); // Print results to STDOUT for github summary println!("## Ruby {version} linux/{arch} for {base_image}"); From a0e86d3bf654d3ecfe9be377d424658943645b67 Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:56:29 -0600 Subject: [PATCH 34/37] Prefer print function --- ruby_executable/src/bin/ruby_check.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ruby_executable/src/bin/ruby_check.rs b/ruby_executable/src/bin/ruby_check.rs index b59aec1..8c7a95c 100644 --- a/ruby_executable/src/bin/ruby_check.rs +++ b/ruby_executable/src/bin/ruby_check.rs @@ -1,6 +1,5 @@ -use bullet_stream::{Print, global::print, style}; +use bullet_stream::global::print; use clap::Parser; -use fun_run::CommandWithName; use indoc::formatdoc; use libherokubuildpack::inventory::artifact::Arch; use shared::{BaseImage, RubyDownloadVersion, output_tar_path, source_dir}; @@ -27,7 +26,7 @@ fn ruby_check(args: &RubyArgs) -> Result<(), Box> { base_image, } = args; let start = Instant::now(); - let log = Print::new(std::io::stderr()).h1(format!( + print::h2(format!( "Checking Ruby version ({version} linux/{arch}) for {base_image}", )); let path = output_tar_path(&PathBuf::from(INNER_OUTPUT), version, base_image, arch); From 987e38a1f4c8d9fa1a626dc9260d15e02adb1bee Mon Sep 17 00:00:00 2001 From: Schneems Date: Mon, 17 Nov 2025 13:58:32 -0600 Subject: [PATCH 35/37] Remove unused function --- shared/src/lib.rs | 66 +---------------------------------------------- 1 file changed, 1 insertion(+), 65 deletions(-) diff --git a/shared/src/lib.rs b/shared/src/lib.rs index 6487910..9112ca3 100644 --- a/shared/src/lib.rs +++ b/shared/src/lib.rs @@ -1,9 +1,6 @@ -use bullet_stream::Print; -use bullet_stream::state::SubBullet; use fs_err::{File, PathExt}; use fun_run::CommandWithName; use libherokubuildpack::inventory::artifact::Arch; -use std::io::{Read, Seek, SeekFrom, Write}; use std::path::{Path, PathBuf}; use std::process::Command; @@ -184,51 +181,6 @@ pub fn tar_dir_to_file(compiled_dir: &Path, tar_file: &File) -> Result<(), Error Ok(()) } -// # Binstubs have a "shebang" on the first line that tells the OS -// # how to execute the file if it's called directly i.e. `$ ./script.rb` instead -// # of `$ ruby ./script.rb`. -// # -// # We need the shebang to be portable (not use an absolute path) so we check -// # for any ruby shebang lines and replace them with `#!/usr/bin/env ruby` -// # which translates to telling the os "Use the `ruby` executable from the same -// location as `which ruby`" to run this program. -pub fn update_shebangs_in_dir( - mut log: Print>, - path: &Path, -) -> Result>, Error> -where - W: Send + Write + Sync + 'static, -{ - let dir = fs_err::read_dir(path).map_err(Error::FsError)?; - for entry in dir { - let entry = entry.map_err(Error::FsError)?; - let entry_path = entry.path(); - if entry_path.is_file() { - let mut file = fs_err::OpenOptions::new() - .read(true) - .write(true) - .open(&entry_path) - .map_err(Error::FsError)?; - let mut contents = String::new(); - - log = log.sub_bullet(format!("Reading {}", entry_path.display())); - if file.read_to_string(&mut contents).is_ok() { - if let Some(contents) = update_shebang(contents) { - log = log.sub_bullet(format!("Updating shebang in {}", entry_path.display())); - file.seek(SeekFrom::Start(0)).map_err(Error::FsError)?; - file.write_all(contents.as_bytes()) - .map_err(Error::FsError)?; - } else { - log = log.sub_bullet("Skipping (no ruby shebang found)"); - } - } else { - log = log.sub_bullet("Skipping (possibly binary file)"); - } - } - } - Ok(log) -} - pub fn update_shebang(contents: String) -> Option { if let Some(shebang) = contents.lines().next() { if shebang.starts_with("#!") && shebang.contains("/ruby") { @@ -244,6 +196,7 @@ pub fn update_shebang(contents: String) -> Option { #[cfg(test)] mod test { use super::*; + use std::io::Read; use std::str::FromStr; use std::thread; use tempfile::tempdir; @@ -273,23 +226,6 @@ mod test { assert_eq!(updated_contents, None); } - #[test] - fn test_update_shebangs_in_dir() { - let dir = tempfile::tempdir().unwrap(); - let file_path = dir.path().join("script.rb"); - - let mut file = File::create(&file_path).unwrap(); - writeln!(file, "#!/path/to/ruby\nprint 'Hello, world!'").unwrap(); - - let log = Print::new(std::io::stdout()) - .without_header() - .bullet("shebangs"); - _ = update_shebangs_in_dir(log, dir.path()).unwrap(); - - let contents = fs_err::read_to_string(&file_path).unwrap(); - assert_eq!(contents, "#!/usr/bin/env ruby\nprint 'Hello, world!'\n"); - } - #[test] fn test_validate_version_for_stack() { assert!( From 091b090f733cef8b8435eb02b5fbdcf2c7f74af9 Mon Sep 17 00:00:00 2001 From: Schneems Date: Tue, 18 Nov 2025 11:08:19 -0600 Subject: [PATCH 36/37] Add accidentally removed bullet --- jruby_executable/src/bin/jruby_build.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/jruby_executable/src/bin/jruby_build.rs b/jruby_executable/src/bin/jruby_build.rs index 3dbebdd..0530b42 100644 --- a/jruby_executable/src/bin/jruby_build.rs +++ b/jruby_executable/src/bin/jruby_build.rs @@ -87,6 +87,7 @@ fn jruby_build(args: &Args) -> Result<(), Box> { fs_err::remove_dir_all(&path)?; } + print::bullet("Checking for `ruby` binstub"); let ruby_bin = jruby_dir.join("bin").join("ruby"); if ruby_bin.fs_err_try_exists()? { print::sub_bullet("File exists") From d52a7880000f1cc0a33a56606c8a500d8c2ca677 Mon Sep 17 00:00:00 2001 From: Schneems Date: Tue, 18 Nov 2025 11:09:56 -0600 Subject: [PATCH 37/37] Address TODO comment --- jruby_executable/src/bin/jruby_build.rs | 6 +----- ruby_executable/src/bin/ruby_build.rs | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/jruby_executable/src/bin/jruby_build.rs b/jruby_executable/src/bin/jruby_build.rs index 0530b42..8204709 100644 --- a/jruby_executable/src/bin/jruby_build.rs +++ b/jruby_executable/src/bin/jruby_build.rs @@ -141,11 +141,7 @@ fn jruby_build(args: &Args) -> Result<(), Box> { atomic_inventory_update(&inventory, |inventory| { for prior in &inventory.artifacts { if let Err(error) = artifact_same_url_different_checksum(prior, &artifact) { - // TODO: Investigate bullet stream ownership - println!( - "{}", - style::important(format!("!!!!!!!!!! Error updating inventory: {error}")) - ); + print::error(format!("Error updating inventory\n\nError: {error}")); fs_err::remove_file(&sha_seven_path)?; return Err(error); diff --git a/ruby_executable/src/bin/ruby_build.rs b/ruby_executable/src/bin/ruby_build.rs index 90a5dc9..3d26940 100644 --- a/ruby_executable/src/bin/ruby_build.rs +++ b/ruby_executable/src/bin/ruby_build.rs @@ -165,11 +165,7 @@ fn ruby_build(args: &RubyArgs) -> Result<(), Box> { atomic_inventory_update(&inventory, |inventory| { for prior in &inventory.artifacts { if let Err(error) = artifact_same_url_different_checksum(prior, &artifact) { - // TODO: Investigate bullet stream ownership - println!( - "{}", - style::important(format!("!!!!!!!!!! Error updating inventory: {error}")) - ); + print::error(format!("Error updating inventory\n\nError: {error}")); fs_err::remove_file(&sha_seven_path)?; return Err(error);