From 9a1ebd451e2949d435d6ec068b76e27949932116 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Thu, 29 Feb 2024 14:09:08 -0800 Subject: [PATCH 1/5] get_config_path is now an AbsoluteSystemPathBuf --- crates/turborepo-telemetry/Cargo.toml | 1 + crates/turborepo-telemetry/src/config.rs | 47 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/crates/turborepo-telemetry/Cargo.toml b/crates/turborepo-telemetry/Cargo.toml index af206874bea3b..346eb8792812f 100644 --- a/crates/turborepo-telemetry/Cargo.toml +++ b/crates/turborepo-telemetry/Cargo.toml @@ -30,6 +30,7 @@ sha2 = "0.10.8" thiserror = { workspace = true } tokio = { workspace = true, features = ["full", "time"] } tracing = { workspace = true } +turbopath = { workspace = true } turborepo-api-client = { workspace = true } turborepo-dirs = { path = "../turborepo-dirs" } turborepo-ui = { workspace = true } diff --git a/crates/turborepo-telemetry/src/config.rs b/crates/turborepo-telemetry/src/config.rs index 950ba9b1cc6cc..cbcd06026c02d 100644 --- a/crates/turborepo-telemetry/src/config.rs +++ b/crates/turborepo-telemetry/src/config.rs @@ -1,4 +1,4 @@ -use std::{env, fs, path::Path}; +use std::{env, fs}; use chrono::{DateTime, Utc}; pub use config::{Config, ConfigError, File, FileFormat}; @@ -7,6 +7,7 @@ use serde::{Deserialize, Serialize}; use serde_json; use sha2::{Digest, Sha256}; use tracing::{debug, error}; +use turbopath::AbsoluteSystemPathBuf; use turborepo_dirs::config_dir; use turborepo_ui::{color, BOLD, GREY, UI, UNDERLINE}; use uuid::Uuid; @@ -56,12 +57,12 @@ impl TelemetryConfig { pub fn new() -> Result { let file_path = &get_config_path()?; debug!("Telemetry config path: {}", file_path); - if !Path::new(file_path).try_exists().unwrap_or(false) { + if !file_path.exists() { write_new_config()?; } let mut settings = Config::builder(); - settings = settings.add_source(File::new(file_path, FileFormat::Json)); + settings = settings.add_source(File::new(file_path.as_str(), FileFormat::Json)); let settings = settings.build(); // If this is a FileParse error, we assume something corrupted the file or @@ -219,18 +220,25 @@ impl TelemetryConfig { } } -fn get_config_path() -> Result { +fn get_config_path() -> Result { if cfg!(test) { - let tmp_dir = env::temp_dir(); - let config_path = tmp_dir.join("test-telemetry.json"); - Ok(config_path.to_str().unwrap().to_string()) + let tmp_dir = AbsoluteSystemPathBuf::try_from(env::temp_dir()).unwrap(); + let config_path = tmp_dir.join_component("test-telemetry.json"); + Ok(config_path) } else { let config_dir = config_dir().ok_or(ConfigError::Message( "Unable to find telemetry config directory".to_string(), ))?; + let abs_config_dir = + AbsoluteSystemPathBuf::try_from(config_dir.as_path()).map_err(|e| { + ConfigError::Message(format!( + "Invalid config directory {}: {}", + config_dir.display(), + e + )) + })?; // stored as a sibling to the turbo global config - let config_path = config_dir.join("turborepo").join("telemetry.json"); - Ok(config_path.to_str().unwrap().to_string()) + Ok(abs_config_dir.join_components(&["turborepo", "telemetry.json"])) } } @@ -239,24 +247,15 @@ fn write_new_config() -> Result<(), ConfigError> { let serialized = serde_json::to_string_pretty(&TelemetryConfigContents::default()) .map_err(|e| ConfigError::Message(e.to_string()))?; - // Extract the directory path from the file path - let dir_path = Path::new(&file_path).parent().ok_or_else(|| { - ConfigError::Message("Failed to extract directory path from file path".to_string()) - })?; - // Create the directory if it doesn't exist - if !dir_path.try_exists().unwrap_or(false) { - fs::create_dir_all(dir_path).map_err(|e| { - ConfigError::Message(format!( - "Failed to create directory {}: {}", - dir_path.display(), - e - )) - })?; - } + file_path + .ensure_dir() + .map_err(|_| ConfigError::Message("Failed to create director".to_string()))?; // Write the file - fs::write(&file_path, serialized).map_err(|e| ConfigError::Message(e.to_string()))?; + file_path + .create_with_contents(serialized) + .map_err(|e| ConfigError::Message(e.to_string()))?; Ok(()) } From 369dcc561668e5d4c26ed3ec38d85327169479ed Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Thu, 29 Feb 2024 14:11:20 -0800 Subject: [PATCH 2/5] write_new_config takes an AbsoluteSystemPath --- crates/turborepo-telemetry/src/config.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/crates/turborepo-telemetry/src/config.rs b/crates/turborepo-telemetry/src/config.rs index cbcd06026c02d..34b09fe2ed591 100644 --- a/crates/turborepo-telemetry/src/config.rs +++ b/crates/turborepo-telemetry/src/config.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; use serde_json; use sha2::{Digest, Sha256}; use tracing::{debug, error}; -use turbopath::AbsoluteSystemPathBuf; +use turbopath::{AbsoluteSystemPath, AbsoluteSystemPathBuf}; use turborepo_dirs::config_dir; use turborepo_ui::{color, BOLD, GREY, UI, UNDERLINE}; use uuid::Uuid; @@ -58,7 +58,7 @@ impl TelemetryConfig { let file_path = &get_config_path()?; debug!("Telemetry config path: {}", file_path); if !file_path.exists() { - write_new_config()?; + write_new_config(&file_path)?; } let mut settings = Config::builder(); @@ -72,8 +72,10 @@ impl TelemetryConfig { let config = match settings { Ok(settings) => settings.try_deserialize::()?, Err(ConfigError::FileParse { .. }) => { - fs::remove_file(file_path).map_err(|e| ConfigError::Message(e.to_string()))?; - write_new_config()?; + file_path + .remove_file() + .map_err(|e| ConfigError::Message(e.to_string()))?; + write_new_config(&file_path)?; return Err(settings.unwrap_err()); } // Propagate other errors @@ -242,8 +244,7 @@ fn get_config_path() -> Result { } } -fn write_new_config() -> Result<(), ConfigError> { - let file_path = get_config_path()?; +fn write_new_config(file_path: &AbsoluteSystemPath) -> Result<(), ConfigError> { let serialized = serde_json::to_string_pretty(&TelemetryConfigContents::default()) .map_err(|e| ConfigError::Message(e.to_string()))?; From 9630b2d6095b6923f653e5c8bc79a72b70c77984 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Thu, 29 Feb 2024 14:12:49 -0800 Subject: [PATCH 3/5] TelemetryConfig uses an AbsoluteSystemPathBuf for config_path --- crates/turborepo-telemetry/src/config.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/turborepo-telemetry/src/config.rs b/crates/turborepo-telemetry/src/config.rs index 34b09fe2ed591..289cc4cbb4476 100644 --- a/crates/turborepo-telemetry/src/config.rs +++ b/crates/turborepo-telemetry/src/config.rs @@ -49,20 +49,20 @@ impl Default for TelemetryConfigContents { #[derive(Debug)] pub struct TelemetryConfig { - config_path: String, + config_path: AbsoluteSystemPathBuf, config: TelemetryConfigContents, } impl TelemetryConfig { pub fn new() -> Result { - let file_path = &get_config_path()?; - debug!("Telemetry config path: {}", file_path); - if !file_path.exists() { - write_new_config(&file_path)?; + let config_path = get_config_path()?; + debug!("Telemetry config path: {}", config_path); + if !config_path.exists() { + write_new_config(&config_path)?; } let mut settings = Config::builder(); - settings = settings.add_source(File::new(file_path.as_str(), FileFormat::Json)); + settings = settings.add_source(File::new(config_path.as_str(), FileFormat::Json)); let settings = settings.build(); // If this is a FileParse error, we assume something corrupted the file or @@ -72,10 +72,10 @@ impl TelemetryConfig { let config = match settings { Ok(settings) => settings.try_deserialize::()?, Err(ConfigError::FileParse { .. }) => { - file_path + config_path .remove_file() .map_err(|e| ConfigError::Message(e.to_string()))?; - write_new_config(&file_path)?; + write_new_config(&config_path)?; return Err(settings.unwrap_err()); } // Propagate other errors @@ -83,7 +83,7 @@ impl TelemetryConfig { }; let config = TelemetryConfig { - config_path: file_path.to_string(), + config_path, config, }; From 89d19bd7abbf63fc7534582a44c67eb3e8730f4e Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Thu, 29 Feb 2024 14:55:48 -0800 Subject: [PATCH 4/5] Switch write over to turbopath --- Cargo.lock | 1 + crates/turborepo-telemetry/src/config.rs | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ea034f02c7206..09754efaf283d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11970,6 +11970,7 @@ dependencies = [ "thiserror", "tokio", "tracing", + "turbopath", "turborepo-api-client", "turborepo-dirs", "turborepo-ui", diff --git a/crates/turborepo-telemetry/src/config.rs b/crates/turborepo-telemetry/src/config.rs index 289cc4cbb4476..9c04cd1349ce2 100644 --- a/crates/turborepo-telemetry/src/config.rs +++ b/crates/turborepo-telemetry/src/config.rs @@ -1,4 +1,4 @@ -use std::{env, fs}; +use std::env; use chrono::{DateTime, Utc}; pub use config::{Config, ConfigError, File, FileFormat}; @@ -93,7 +93,8 @@ impl TelemetryConfig { fn write(&self) -> Result<(), ConfigError> { let serialized = serde_json::to_string_pretty(&self.config) .map_err(|e| ConfigError::Message(e.to_string()))?; - fs::write(&self.config_path, serialized) + self.config_path + .create_with_contents(serialized) .map_err(|e| ConfigError::Message(e.to_string()))?; Ok(()) } From b859185207e4a8712e2cf063fb33690b09b77048 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Fri, 1 Mar 2024 09:10:56 -0800 Subject: [PATCH 5/5] Add new constructor --- crates/turborepo-lib/src/commands/telemetry.rs | 2 +- crates/turborepo-telemetry/src/config.rs | 10 +++++++--- crates/turborepo-telemetry/src/lib.rs | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/crates/turborepo-lib/src/commands/telemetry.rs b/crates/turborepo-lib/src/commands/telemetry.rs index 583697fabd7d9..fa9a961bb6e76 100644 --- a/crates/turborepo-lib/src/commands/telemetry.rs +++ b/crates/turborepo-lib/src/commands/telemetry.rs @@ -38,7 +38,7 @@ pub fn configure( base: &mut CommandBase, telemetry: CommandEventBuilder, ) { - let config = TelemetryConfig::new(); + let config = TelemetryConfig::with_default_config_path(); let mut config = match config { Ok(config) => config, Err(e) => { diff --git a/crates/turborepo-telemetry/src/config.rs b/crates/turborepo-telemetry/src/config.rs index 9c04cd1349ce2..a7f09f1d041ab 100644 --- a/crates/turborepo-telemetry/src/config.rs +++ b/crates/turborepo-telemetry/src/config.rs @@ -54,8 +54,12 @@ pub struct TelemetryConfig { } impl TelemetryConfig { - pub fn new() -> Result { + pub fn with_default_config_path() -> Result { let config_path = get_config_path()?; + TelemetryConfig::new(config_path) + } + + pub fn new(config_path: AbsoluteSystemPathBuf) -> Result { debug!("Telemetry config path: {}", config_path); if !config_path.exists() { write_new_config(&config_path)?; @@ -100,7 +104,7 @@ impl TelemetryConfig { } pub fn one_way_hash(input: &str) -> String { - match TelemetryConfig::new() { + match TelemetryConfig::with_default_config_path() { Ok(config) => config.one_way_hash_with_config_salt(input), Err(_) => TelemetryConfig::one_way_hash_with_tmp_salt(input), } @@ -252,7 +256,7 @@ fn write_new_config(file_path: &AbsoluteSystemPath) -> Result<(), ConfigError> { // Create the directory if it doesn't exist file_path .ensure_dir() - .map_err(|_| ConfigError::Message("Failed to create director".to_string()))?; + .map_err(|_| ConfigError::Message("Failed to create directory".to_string()))?; // Write the file file_path diff --git a/crates/turborepo-telemetry/src/lib.rs b/crates/turborepo-telemetry/src/lib.rs index 0c1c1c7d55a15..b5ac50e78bcf2 100644 --- a/crates/turborepo-telemetry/src/lib.rs +++ b/crates/turborepo-telemetry/src/lib.rs @@ -81,7 +81,7 @@ fn init( ) -> Result<(TelemetryHandle, TelemetrySender), Box> { let (tx, rx) = mpsc::unbounded_channel(); let (cancel_tx, cancel_rx) = oneshot::channel(); - let mut config = TelemetryConfig::new()?; + let mut config = TelemetryConfig::with_default_config_path()?; config.show_alert(ui); let session_id = Uuid::new_v4();