From d69205ba617093a780a400193320dbd809c84676 Mon Sep 17 00:00:00 2001 From: Filip Bachul Date: Tue, 4 Jun 2024 20:12:01 +0200 Subject: [PATCH 01/10] chore: wip --- .../turborepo-lib/src/task_graph/visitor.rs | 18 ++++----- crates/turborepo-ui/src/output.rs | 39 +++++++++++++------ 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/crates/turborepo-lib/src/task_graph/visitor.rs b/crates/turborepo-lib/src/task_graph/visitor.rs index 7d8956719890c..c60fd5a6b719e 100644 --- a/crates/turborepo-lib/src/task_graph/visitor.rs +++ b/crates/turborepo-lib/src/task_graph/visitor.rs @@ -402,17 +402,17 @@ impl<'a> Visitor<'a> { } else { format!("{}:{}", task_id.package(), task_id.task()) }; - let (header, footer) = ( - (vendor_behavior.group_prefix)(&group_name), - (vendor_behavior.group_suffix)(&group_name), - ); - logger.with_header_footer(Some(header), Some(footer)); - let (error_header, error_footer) = ( - vendor_behavior.error_group_prefix.map(|f| f(&group_name)), - vendor_behavior.error_group_suffix.map(|f| f(&group_name)), + logger.with_header_footer( + Some(vendor_behavior.group_prefix), + Some(vendor_behavior.group_suffix), ); - logger.with_error_header_footer(error_header, error_footer); + + // let (error_header, error_footer) = ( + // vendor_behavior.error_group_prefix.map(|f| f(&group_name)), + // vendor_behavior.error_group_suffix.map(|f| f(&group_name)), + // ); + // logger.with_error_header_footer(error_header, error_footer); } logger } diff --git a/crates/turborepo-ui/src/output.rs b/crates/turborepo-ui/src/output.rs index 2fcedd35e30c8..2e7722b84f656 100644 --- a/crates/turborepo-ui/src/output.rs +++ b/crates/turborepo-ui/src/output.rs @@ -4,6 +4,7 @@ use std::{ sync::{Arc, Mutex, RwLock}, }; +type GroupPrefixFn = fn(group_name: &str) -> String; /// OutputSink represent a sink for outputs that can be written to from multiple /// threads through the use of Loggers. pub struct OutputSink { @@ -28,8 +29,8 @@ pub struct OutputClient { #[derive(Default)] struct Marginals { - header: Option, - footer: Option, + header: Option, + footer: Option, } pub struct OutputWriter<'a, W> { @@ -95,11 +96,19 @@ impl OutputSink { } impl OutputClient { - pub fn with_header_footer(&mut self, header: Option, footer: Option) { + pub fn with_header_footer( + &mut self, + header: Option String>, + footer: Option String>, + ) { self.primary = Marginals { header, footer }; } - pub fn with_error_header_footer(&mut self, header: Option, footer: Option) { + pub fn with_error_header_footer( + &mut self, + header: Option, + footer: Option, + ) { self.error = Marginals { header, footer }; } @@ -151,7 +160,7 @@ impl OutputClient { // to ensure that the bytes aren't interspersed. let mut writers = writers.lock().expect("lock poisoned"); if let Some(prefix) = header { - writers.out.write_all(prefix.as_bytes())?; + writers.out.write_all(prefix("name").as_bytes())?; } for SinkBytes { buffer, @@ -165,7 +174,7 @@ impl OutputClient { writer.write_all(buffer)?; } if let Some(suffix) = footer { - writers.out.write_all(suffix.as_bytes())?; + writers.out.write_all(suffix("name").as_bytes())?; } } @@ -381,13 +390,19 @@ mod test { fn test_marginals() -> io::Result<()> { let sink = OutputSink::new(Vec::new(), Vec::new()); let mut group1_logger = sink.logger(OutputClientBehavior::Grouped); - group1_logger - .with_header_footer(Some("good header\n".into()), Some("good footer\n".into())); - group1_logger - .with_error_header_footer(Some("bad header\n".into()), Some("bad footer\n".into())); + group1_logger.with_header_footer( + Some(|_name| "good header\n".into()), + Some(|_name| "good footer\n".into()), + ); + group1_logger.with_error_header_footer( + Some(|_name| "bad header\n".into()), + Some(|_name| "bad footer\n".into()), + ); let mut group2_logger = sink.logger(OutputClientBehavior::Grouped); - group2_logger - .with_header_footer(Some("good header\n".into()), Some("good footer\n".into())); + group2_logger.with_header_footer( + Some(|_name| "good header\n".into()), + Some(|_name| "good footer\n".into()), + ); let mut group1_out = group1_logger.stdout(); let mut group2_out = group2_logger.stdout(); From 92cfb0745dfa5565466e3b39a27e2d48770480b0 Mon Sep 17 00:00:00 2001 From: Filip Bachul Date: Tue, 4 Jun 2024 20:25:33 +0200 Subject: [PATCH 02/10] chore: import groupprefix --- Cargo.lock | 1 + crates/turborepo-ci/src/lib.rs | 5 ++++- crates/turborepo-ci/src/vendor_behavior.rs | 2 +- crates/turborepo-ui/Cargo.toml | 1 + crates/turborepo-ui/src/output.rs | 3 ++- 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 650edbc7ce0af..cc970a583ed2e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11458,6 +11458,7 @@ dependencies = [ "tracing", "tui-term", "turbopath", + "turborepo-ci", "turborepo-vt100", "winapi", ] diff --git a/crates/turborepo-ci/src/lib.rs b/crates/turborepo-ci/src/lib.rs index 5e4428f9b2276..462d296a8c1bb 100644 --- a/crates/turborepo-ci/src/lib.rs +++ b/crates/turborepo-ci/src/lib.rs @@ -6,7 +6,10 @@ mod vendors; use std::{env, sync::OnceLock}; use crate::vendors::get_vendors; -pub use crate::{vendor_behavior::VendorBehavior, vendors::Vendor}; +pub use crate::{ + vendor_behavior::{GroupPrefixFn, VendorBehavior}, + vendors::Vendor, +}; static IS_CI: OnceLock = OnceLock::new(); static VENDOR: OnceLock> = OnceLock::new(); diff --git a/crates/turborepo-ci/src/vendor_behavior.rs b/crates/turborepo-ci/src/vendor_behavior.rs index 396e81a8dc269..696e0bff4737c 100644 --- a/crates/turborepo-ci/src/vendor_behavior.rs +++ b/crates/turborepo-ci/src/vendor_behavior.rs @@ -1,4 +1,4 @@ -type GroupPrefixFn = fn(group_name: &str) -> String; +pub type GroupPrefixFn = fn(group_name: &str) -> String; #[derive(Clone, Debug, PartialEq)] pub struct VendorBehavior { diff --git a/crates/turborepo-ui/Cargo.toml b/crates/turborepo-ui/Cargo.toml index 68b9aaaf9219d..e417e7d75401c 100644 --- a/crates/turborepo-ui/Cargo.toml +++ b/crates/turborepo-ui/Cargo.toml @@ -27,5 +27,6 @@ thiserror = { workspace = true } tracing = { workspace = true } tui-term = { workspace = true } turbopath = { workspace = true } +turborepo-ci = { workspace = true } turborepo-vt100 = { workspace = true } winapi = "0.3.9" diff --git a/crates/turborepo-ui/src/output.rs b/crates/turborepo-ui/src/output.rs index 2e7722b84f656..d20c9ee036dfc 100644 --- a/crates/turborepo-ui/src/output.rs +++ b/crates/turborepo-ui/src/output.rs @@ -4,7 +4,8 @@ use std::{ sync::{Arc, Mutex, RwLock}, }; -type GroupPrefixFn = fn(group_name: &str) -> String; +use turborepo_ci::GroupPrefixFn; + /// OutputSink represent a sink for outputs that can be written to from multiple /// threads through the use of Loggers. pub struct OutputSink { From 9f0965501f009e4c9d1631e1391d385c91b425ce Mon Sep 17 00:00:00 2001 From: Filip Bachul Date: Tue, 4 Jun 2024 21:17:32 +0200 Subject: [PATCH 03/10] chore: it works ;o --- crates/turborepo-ci/src/lib.rs | 2 +- crates/turborepo-ci/src/vendor_behavior.rs | 21 ++++++++---- crates/turborepo-ci/src/vendors.rs | 34 +++++++++++++------ .../turborepo-lib/src/task_graph/visitor.rs | 8 ++--- crates/turborepo-ui/src/output.rs | 20 +++++------ 5 files changed, 52 insertions(+), 33 deletions(-) diff --git a/crates/turborepo-ci/src/lib.rs b/crates/turborepo-ci/src/lib.rs index 462d296a8c1bb..424e2367fd8e0 100644 --- a/crates/turborepo-ci/src/lib.rs +++ b/crates/turborepo-ci/src/lib.rs @@ -7,7 +7,7 @@ use std::{env, sync::OnceLock}; use crate::vendors::get_vendors; pub use crate::{ - vendor_behavior::{GroupPrefixFn, VendorBehavior}, + vendor_behavior::{GroupPrefixFn, GroupPrefixFnFactory, VendorBehavior}, vendors::Vendor, }; diff --git a/crates/turborepo-ci/src/vendor_behavior.rs b/crates/turborepo-ci/src/vendor_behavior.rs index 696e0bff4737c..58ed275e31074 100644 --- a/crates/turborepo-ci/src/vendor_behavior.rs +++ b/crates/turborepo-ci/src/vendor_behavior.rs @@ -1,15 +1,18 @@ -pub type GroupPrefixFn = fn(group_name: &str) -> String; +use std::sync::Arc; + +pub type GroupPrefixFn = Arc String + Send + Sync>; +pub type GroupPrefixFnFactory = fn(group_name: String) -> GroupPrefixFn; #[derive(Clone, Debug, PartialEq)] pub struct VendorBehavior { - pub group_prefix: GroupPrefixFn, - pub group_suffix: GroupPrefixFn, - pub error_group_prefix: Option, - pub error_group_suffix: Option, + pub group_prefix: GroupPrefixFnFactory, + pub group_suffix: GroupPrefixFnFactory, + pub error_group_prefix: Option, + pub error_group_suffix: Option, } impl VendorBehavior { - pub fn new(prefix: GroupPrefixFn, suffix: GroupPrefixFn) -> Self { + pub fn new(prefix: GroupPrefixFnFactory, suffix: GroupPrefixFnFactory) -> Self { Self { group_prefix: prefix, group_suffix: suffix, @@ -18,7 +21,11 @@ impl VendorBehavior { } } - pub fn with_error(mut self, prefix: GroupPrefixFn, suffix: GroupPrefixFn) -> Self { + pub fn with_error( + mut self, + prefix: GroupPrefixFnFactory, + suffix: GroupPrefixFnFactory, + ) -> Self { self.error_group_prefix = Some(prefix); self.error_group_suffix = Some(suffix); self diff --git a/crates/turborepo-ci/src/vendors.rs b/crates/turborepo-ci/src/vendors.rs index 0f061b0c0c775..ee3eb75afd022 100644 --- a/crates/turborepo-ci/src/vendors.rs +++ b/crates/turborepo-ci/src/vendors.rs @@ -1,4 +1,8 @@ -use std::{collections::HashMap, fmt::Debug, sync::OnceLock}; +use std::{ + collections::HashMap, + fmt::Debug, + sync::{Arc, OnceLock}, +}; use crate::vendor_behavior::VendorBehavior; @@ -78,8 +82,8 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { branch_env_var: None, username_env_var: None, behavior: Some(VendorBehavior::new( - |group_name| format!("##[group]{group_name}\r\n"), - |_| String::from("##[endgroup]\r\n"), + |group_name| Arc::new(move || format!("##[group]{group_name}\r\n")), + |_| Arc::new(|| String::from("##[endgroup]\r\n")), )), }, Vendor { @@ -268,12 +272,14 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { username_env_var: Some("GITHUB_ACTOR"), behavior: Some( VendorBehavior::new( - |group_name| format!("::group::{group_name}\n"), - |_| String::from("::endgroup::\n"), + |group_name| Arc::new(move || format!("::group::{group_name}\n")), + |_| Arc::new(|| String::from("::endgroup::\n")), ) .with_error( - |group_name| format!("\x1B[;31m{group_name}\x1B[;0m\n"), - |_| String::new(), + |group_name| { + Arc::new(move || format!("\x1B[;31m{group_name}\x1B[;0m\n")) + }, + |_| Arc::new(|| String::new()), ), ), }, @@ -553,8 +559,12 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { branch_env_var: None, username_env_var: None, behavior: Some(VendorBehavior::new( - |group_name| format!("##teamcity[blockOpened name='{group_name}']"), - |group_name| format!("##teamcity[blockClosed name='{group_name}']"), + |group_name| { + Arc::new(move || format!("##teamcity[blockOpened name='{group_name}']")) + }, + |group_name| { + Arc::new(move || format!("##teamcity[blockClosed name='{group_name}']")) + }, )), }, Vendor { @@ -569,8 +579,10 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { branch_env_var: None, username_env_var: None, behavior: Some(VendorBehavior::new( - |group_name| format!("travis_fold:start:{group_name}\r\n"), - |group_name| format!("travis_fold:end:{group_name}\r\n"), + |group_name| { + Arc::new(move || format!("travis_fold:start:{group_name}\r\n")) + }, + |group_name| Arc::new(move || format!("travis_fold:end:{group_name}\r\n")), )), }, Vendor { diff --git a/crates/turborepo-lib/src/task_graph/visitor.rs b/crates/turborepo-lib/src/task_graph/visitor.rs index c60fd5a6b719e..481758dd791ed 100644 --- a/crates/turborepo-lib/src/task_graph/visitor.rs +++ b/crates/turborepo-lib/src/task_graph/visitor.rs @@ -403,10 +403,10 @@ impl<'a> Visitor<'a> { format!("{}:{}", task_id.package(), task_id.task()) }; - logger.with_header_footer( - Some(vendor_behavior.group_prefix), - Some(vendor_behavior.group_suffix), - ); + let header_factory = (vendor_behavior.group_prefix)(group_name.to_owned()); + let footer_factory = (vendor_behavior.group_suffix)(group_name.to_owned()); + + logger.with_header_footer(Some(header_factory), Some(footer_factory)); // let (error_header, error_footer) = ( // vendor_behavior.error_group_prefix.map(|f| f(&group_name)), diff --git a/crates/turborepo-ui/src/output.rs b/crates/turborepo-ui/src/output.rs index d20c9ee036dfc..de90e207fed4a 100644 --- a/crates/turborepo-ui/src/output.rs +++ b/crates/turborepo-ui/src/output.rs @@ -99,8 +99,8 @@ impl OutputSink { impl OutputClient { pub fn with_header_footer( &mut self, - header: Option String>, - footer: Option String>, + header: Option, + footer: Option, ) { self.primary = Marginals { header, footer }; } @@ -161,7 +161,7 @@ impl OutputClient { // to ensure that the bytes aren't interspersed. let mut writers = writers.lock().expect("lock poisoned"); if let Some(prefix) = header { - writers.out.write_all(prefix("name").as_bytes())?; + writers.out.write_all(prefix().as_bytes())?; } for SinkBytes { buffer, @@ -175,7 +175,7 @@ impl OutputClient { writer.write_all(buffer)?; } if let Some(suffix) = footer { - writers.out.write_all(suffix("name").as_bytes())?; + writers.out.write_all(suffix().as_bytes())?; } } @@ -392,17 +392,17 @@ mod test { let sink = OutputSink::new(Vec::new(), Vec::new()); let mut group1_logger = sink.logger(OutputClientBehavior::Grouped); group1_logger.with_header_footer( - Some(|_name| "good header\n".into()), - Some(|_name| "good footer\n".into()), + Some(Arc::new(|| "good header\n".into())), + Some(Arc::new(|| "good footer\n".into())), ); group1_logger.with_error_header_footer( - Some(|_name| "bad header\n".into()), - Some(|_name| "bad footer\n".into()), + Some(Arc::new(|| "bad header\n".into())), + Some(Arc::new(|| "bad footer\n".into())), ); let mut group2_logger = sink.logger(OutputClientBehavior::Grouped); group2_logger.with_header_footer( - Some(|_name| "good header\n".into()), - Some(|_name| "good footer\n".into()), + Some(Arc::new(|| "good header\n".into())), + Some(Arc::new(|| "good footer\n".into())), ); let mut group1_out = group1_logger.stdout(); From e727ef3cdb3c2cb245b7e74c4eb6378059f05abf Mon Sep 17 00:00:00 2001 From: Filip Bachul Date: Tue, 4 Jun 2024 21:32:19 +0200 Subject: [PATCH 04/10] chore: implement --- Cargo.lock | 2 ++ crates/turborepo-ci/Cargo.toml | 1 + crates/turborepo-ci/src/vendor_behavior.rs | 4 +++- crates/turborepo-ci/src/vendors.rs | 24 +++++++++++++--------- crates/turborepo-ui/Cargo.toml | 1 + crates/turborepo-ui/src/output.rs | 18 ++++++++-------- 6 files changed, 31 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cc970a583ed2e..b13ab306c0775 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11104,6 +11104,7 @@ dependencies = [ name = "turborepo-ci" version = "0.1.0" dependencies = [ + "chrono", "test-case", "tracing", ] @@ -11444,6 +11445,7 @@ version = "0.1.0" dependencies = [ "anyhow", "atty", + "chrono", "console", "crossterm 0.26.1", "dialoguer", diff --git a/crates/turborepo-ci/Cargo.toml b/crates/turborepo-ci/Cargo.toml index 4d833b5ddf49c..024bf81589bcf 100644 --- a/crates/turborepo-ci/Cargo.toml +++ b/crates/turborepo-ci/Cargo.toml @@ -10,6 +10,7 @@ license = "MIT" workspace = true [dependencies] +chrono = { workspace = true } tracing = { workspace = true } [dev-dependencies] diff --git a/crates/turborepo-ci/src/vendor_behavior.rs b/crates/turborepo-ci/src/vendor_behavior.rs index 58ed275e31074..145fb9adc30ca 100644 --- a/crates/turborepo-ci/src/vendor_behavior.rs +++ b/crates/turborepo-ci/src/vendor_behavior.rs @@ -1,6 +1,8 @@ use std::sync::Arc; -pub type GroupPrefixFn = Arc String + Send + Sync>; +use chrono::{DateTime, Utc}; + +pub type GroupPrefixFn = Arc) -> String + Send + Sync>; pub type GroupPrefixFnFactory = fn(group_name: String) -> GroupPrefixFn; #[derive(Clone, Debug, PartialEq)] diff --git a/crates/turborepo-ci/src/vendors.rs b/crates/turborepo-ci/src/vendors.rs index ee3eb75afd022..e1c621d257648 100644 --- a/crates/turborepo-ci/src/vendors.rs +++ b/crates/turborepo-ci/src/vendors.rs @@ -82,8 +82,8 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { branch_env_var: None, username_env_var: None, behavior: Some(VendorBehavior::new( - |group_name| Arc::new(move || format!("##[group]{group_name}\r\n")), - |_| Arc::new(|| String::from("##[endgroup]\r\n")), + |group_name| Arc::new(move |_| format!("##[group]{group_name}\r\n")), + |_| Arc::new(|_| String::from("##[endgroup]\r\n")), )), }, Vendor { @@ -272,14 +272,14 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { username_env_var: Some("GITHUB_ACTOR"), behavior: Some( VendorBehavior::new( - |group_name| Arc::new(move || format!("::group::{group_name}\n")), - |_| Arc::new(|| String::from("::endgroup::\n")), + |group_name| Arc::new(move |_| format!("::group::{group_name}\n")), + |_| Arc::new(move |_| String::from("::endgroup::\n")), ) .with_error( |group_name| { - Arc::new(move || format!("\x1B[;31m{group_name}\x1B[;0m\n")) + Arc::new(move |_| format!("\x1B[;31m{group_name}\x1B[;0m\n")) }, - |_| Arc::new(|| String::new()), + |_| Arc::new(|_| String::new()), ), ), }, @@ -560,10 +560,14 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { username_env_var: None, behavior: Some(VendorBehavior::new( |group_name| { - Arc::new(move || format!("##teamcity[blockOpened name='{group_name}']")) + Arc::new(move |_| { + format!("##teamcity[blockOpened name='{group_name}']") + }) }, |group_name| { - Arc::new(move || format!("##teamcity[blockClosed name='{group_name}']")) + Arc::new(move |_| { + format!("##teamcity[blockClosed name='{group_name}']") + }) }, )), }, @@ -580,9 +584,9 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { username_env_var: None, behavior: Some(VendorBehavior::new( |group_name| { - Arc::new(move || format!("travis_fold:start:{group_name}\r\n")) + Arc::new(move |_| format!("travis_fold:start:{group_name}\r\n")) }, - |group_name| Arc::new(move || format!("travis_fold:end:{group_name}\r\n")), + |group_name| Arc::new(move |_| format!("travis_fold:end:{group_name}\r\n")), )), }, Vendor { diff --git a/crates/turborepo-ui/Cargo.toml b/crates/turborepo-ui/Cargo.toml index e417e7d75401c..64fa50adaa3d0 100644 --- a/crates/turborepo-ui/Cargo.toml +++ b/crates/turborepo-ui/Cargo.toml @@ -16,6 +16,7 @@ workspace = true [dependencies] atty = { workspace = true } +chrono = { workspace = true } console = { workspace = true } crossterm = "0.26.1" dialoguer = { workspace = true } diff --git a/crates/turborepo-ui/src/output.rs b/crates/turborepo-ui/src/output.rs index de90e207fed4a..4b9d26140fe7f 100644 --- a/crates/turborepo-ui/src/output.rs +++ b/crates/turborepo-ui/src/output.rs @@ -161,7 +161,8 @@ impl OutputClient { // to ensure that the bytes aren't interspersed. let mut writers = writers.lock().expect("lock poisoned"); if let Some(prefix) = header { - writers.out.write_all(prefix().as_bytes())?; + let start_time = chrono::Utc::now(); + writers.out.write_all(prefix(start_time).as_bytes())?; } for SinkBytes { buffer, @@ -175,7 +176,8 @@ impl OutputClient { writer.write_all(buffer)?; } if let Some(suffix) = footer { - writers.out.write_all(suffix().as_bytes())?; + let end_time = chrono::Utc::now(); + writers.out.write_all(suffix(end_time).as_bytes())?; } } @@ -392,17 +394,17 @@ mod test { let sink = OutputSink::new(Vec::new(), Vec::new()); let mut group1_logger = sink.logger(OutputClientBehavior::Grouped); group1_logger.with_header_footer( - Some(Arc::new(|| "good header\n".into())), - Some(Arc::new(|| "good footer\n".into())), + Some(Arc::new(|_| "good header\n".into())), + Some(Arc::new(|_| "good footer\n".into())), ); group1_logger.with_error_header_footer( - Some(Arc::new(|| "bad header\n".into())), - Some(Arc::new(|| "bad footer\n".into())), + Some(Arc::new(|_| "bad header\n".into())), + Some(Arc::new(|_| "bad footer\n".into())), ); let mut group2_logger = sink.logger(OutputClientBehavior::Grouped); group2_logger.with_header_footer( - Some(Arc::new(|| "good header\n".into())), - Some(Arc::new(|| "good footer\n".into())), + Some(Arc::new(|_| "good header\n".into())), + Some(Arc::new(|_| "good footer\n".into())), ); let mut group1_out = group1_logger.stdout(); From 6b540194d9b4fd2c8dc395154d2935bbf95b2e21 Mon Sep 17 00:00:00 2001 From: Filip Bachul Date: Tue, 4 Jun 2024 21:51:01 +0200 Subject: [PATCH 05/10] chore: restore error header --- crates/turborepo-lib/src/task_graph/visitor.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/crates/turborepo-lib/src/task_graph/visitor.rs b/crates/turborepo-lib/src/task_graph/visitor.rs index 481758dd791ed..11a11bbc25c21 100644 --- a/crates/turborepo-lib/src/task_graph/visitor.rs +++ b/crates/turborepo-lib/src/task_graph/visitor.rs @@ -408,11 +408,15 @@ impl<'a> Visitor<'a> { logger.with_header_footer(Some(header_factory), Some(footer_factory)); - // let (error_header, error_footer) = ( - // vendor_behavior.error_group_prefix.map(|f| f(&group_name)), - // vendor_behavior.error_group_suffix.map(|f| f(&group_name)), - // ); - // logger.with_error_header_footer(error_header, error_footer); + let (error_header, error_footer) = ( + vendor_behavior + .error_group_prefix + .map(|f| f(group_name.to_owned())), + vendor_behavior + .error_group_suffix + .map(|f| f(group_name.to_owned())), + ); + logger.with_error_header_footer(error_header, error_footer); } logger } From a73cf2459305a7b84ffbfe92efaa94db530ea96c Mon Sep 17 00:00:00 2001 From: Filip Bachul Date: Tue, 4 Jun 2024 22:02:34 +0200 Subject: [PATCH 06/10] chore: add Gitlab VendorBehavior --- crates/turborepo-ci/src/vendors.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/crates/turborepo-ci/src/vendors.rs b/crates/turborepo-ci/src/vendors.rs index e1c621d257648..ed48a1c2f5482 100644 --- a/crates/turborepo-ci/src/vendors.rs +++ b/crates/turborepo-ci/src/vendors.rs @@ -294,7 +294,26 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { sha_env_var: None, branch_env_var: None, username_env_var: None, - behavior: None, + // https://docs.gitlab.com/ee/ci/jobs/#custom-collapsible-sections + behavior: Some(VendorBehavior::new( + |group_name| { + Arc::new(move |start_time| { + let timestamp = start_time.timestamp(); + format!( + "\\e[0Ksection_start:{timestamp}:{group_name}\\r\\ + e[0K{group_name}" + ) + }) + }, + |group_name| { + Arc::new(move |end_time| { + let timestamp = end_time.timestamp(); + String::from(format!( + "\\e[0Ksection_end:{timestamp}:{group_name}\\r\\e[0K" + )) + }) + }, + )), }, Vendor { name: "GoCD", From 7f42b1795022e0f938b03f5ae8be452f356af939 Mon Sep 17 00:00:00 2001 From: Filip Bachul Date: Tue, 4 Jun 2024 22:04:23 +0200 Subject: [PATCH 07/10] chore: make GroupPrefixFnFactory private --- crates/turborepo-ci/src/lib.rs | 2 +- crates/turborepo-ci/src/vendor_behavior.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/turborepo-ci/src/lib.rs b/crates/turborepo-ci/src/lib.rs index 424e2367fd8e0..462d296a8c1bb 100644 --- a/crates/turborepo-ci/src/lib.rs +++ b/crates/turborepo-ci/src/lib.rs @@ -7,7 +7,7 @@ use std::{env, sync::OnceLock}; use crate::vendors::get_vendors; pub use crate::{ - vendor_behavior::{GroupPrefixFn, GroupPrefixFnFactory, VendorBehavior}, + vendor_behavior::{GroupPrefixFn, VendorBehavior}, vendors::Vendor, }; diff --git a/crates/turborepo-ci/src/vendor_behavior.rs b/crates/turborepo-ci/src/vendor_behavior.rs index 145fb9adc30ca..54de63b717d40 100644 --- a/crates/turborepo-ci/src/vendor_behavior.rs +++ b/crates/turborepo-ci/src/vendor_behavior.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use chrono::{DateTime, Utc}; pub type GroupPrefixFn = Arc) -> String + Send + Sync>; -pub type GroupPrefixFnFactory = fn(group_name: String) -> GroupPrefixFn; +type GroupPrefixFnFactory = fn(group_name: String) -> GroupPrefixFn; #[derive(Clone, Debug, PartialEq)] pub struct VendorBehavior { From e0e8aa452738096f74e8653be6dff1050b285e60 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Tue, 18 Jun 2024 12:56:28 -0700 Subject: [PATCH 08/10] Update crates/turborepo-ci/src/vendors.rs --- crates/turborepo-ci/src/vendors.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/turborepo-ci/src/vendors.rs b/crates/turborepo-ci/src/vendors.rs index ed48a1c2f5482..82d50d6b86268 100644 --- a/crates/turborepo-ci/src/vendors.rs +++ b/crates/turborepo-ci/src/vendors.rs @@ -308,9 +308,9 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { |group_name| { Arc::new(move |end_time| { let timestamp = end_time.timestamp(); - String::from(format!( + format!( "\\e[0Ksection_end:{timestamp}:{group_name}\\r\\e[0K" - )) + ) }) }, )), From 416cb9209c19489a8243499ae96296de92508bb2 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Tue, 18 Jun 2024 12:59:15 -0700 Subject: [PATCH 09/10] Update crates/turborepo-ci/src/vendors.rs --- crates/turborepo-ci/src/vendors.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/turborepo-ci/src/vendors.rs b/crates/turborepo-ci/src/vendors.rs index 82d50d6b86268..21f781085d727 100644 --- a/crates/turborepo-ci/src/vendors.rs +++ b/crates/turborepo-ci/src/vendors.rs @@ -308,9 +308,7 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { |group_name| { Arc::new(move |end_time| { let timestamp = end_time.timestamp(); - format!( - "\\e[0Ksection_end:{timestamp}:{group_name}\\r\\e[0K" - ) + format!("\\e[0Ksection_end:{timestamp}:{group_name}\\r\\e[0K") }) }, )), From f658d08017b45d1eaf2b69cb3740ee7f1611cdc3 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Tue, 18 Jun 2024 14:42:10 -0700 Subject: [PATCH 10/10] Update crates/turborepo-ci/src/vendors.rs --- crates/turborepo-ci/src/vendors.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/turborepo-ci/src/vendors.rs b/crates/turborepo-ci/src/vendors.rs index 21f781085d727..e4311709850c1 100644 --- a/crates/turborepo-ci/src/vendors.rs +++ b/crates/turborepo-ci/src/vendors.rs @@ -308,7 +308,7 @@ pub(crate) fn get_vendors() -> &'static [Vendor] { |group_name| { Arc::new(move |end_time| { let timestamp = end_time.timestamp(); - format!("\\e[0Ksection_end:{timestamp}:{group_name}\\r\\e[0K") + format!("\\e[0Ksection_end:{timestamp}:{group_name}\\r\\e[0K") }) }, )),