@@ -26,6 +26,8 @@ const VERSION: &str = match option_env!("APP_VERSION") {
2626 None => env ! ( "CARGO_PKG_VERSION" ) ,
2727} ;
2828
29+ const TRACKING_ENV_VAR_NAME : & str = "FORGE_TRACKER" ;
30+
2931// Cached system information that doesn't change during application lifetime
3032static CACHED_CORES : LazyLock < usize > = LazyLock :: new ( || System :: physical_core_count ( ) . unwrap_or ( 0 ) ) ;
3133static CACHED_CLIENT_ID : LazyLock < String > = LazyLock :: new ( || {
@@ -112,7 +114,7 @@ impl Tracker {
112114 }
113115
114116 // Create a new event
115- let email = self . email ( ) . await ;
117+ let email = self . system_info ( ) . await ;
116118 let event = Event {
117119 event_name : event_kind. name ( ) ,
118120 event_value : event_kind. value ( ) ,
@@ -142,10 +144,10 @@ impl Tracker {
142144 Ok ( ( ) )
143145 }
144146
145- async fn email ( & self ) -> Vec < String > {
147+ async fn system_info ( & self ) -> Vec < String > {
146148 let mut guard = self . email . lock ( ) . await ;
147149 if guard. is_none ( ) {
148- * guard = Some ( email ( ) . await . into_iter ( ) . collect ( ) ) ;
150+ * guard = Some ( system_info ( ) . await . into_iter ( ) . collect ( ) ) ;
149151 }
150152 guard. clone ( ) . unwrap_or_default ( )
151153 }
@@ -161,8 +163,18 @@ impl Tracker {
161163 }
162164}
163165
166+ fn tracking_enabled ( ) -> bool {
167+ std:: env:: var ( TRACKING_ENV_VAR_NAME )
168+ . map ( |value| !value. eq_ignore_ascii_case ( "false" ) )
169+ . unwrap_or ( true )
170+ }
171+
164172// Get the email address
165- async fn email ( ) -> HashSet < String > {
173+ async fn system_info ( ) -> HashSet < String > {
174+ if !tracking_enabled ( ) {
175+ return HashSet :: new ( ) ;
176+ }
177+
166178 fn parse ( output : Output ) -> Option < String > {
167179 if output. status . success ( ) {
168180 let text = String :: from_utf8_lossy ( & output. stdout ) . trim ( ) . to_string ( ) ;
@@ -264,10 +276,47 @@ fn parse_email(text: String) -> Vec<String> {
264276
265277#[ cfg( test) ]
266278mod tests {
279+ use pretty_assertions:: assert_eq;
280+
267281 use super :: * ;
268282
269283 static TRACKER : LazyLock < Tracker > = LazyLock :: new ( Tracker :: default) ;
270284
285+ #[ test]
286+ fn test_tracking_fixture ( ) {
287+ unsafe {
288+ std:: env:: remove_var ( TRACKING_ENV_VAR_NAME ) ;
289+ }
290+ let actual = tracking_enabled ( ) ;
291+ let expected = true ;
292+ assert_eq ! ( actual, expected) ;
293+
294+ unsafe {
295+ std:: env:: set_var ( TRACKING_ENV_VAR_NAME , "false" ) ;
296+ }
297+ let actual = tracking_enabled ( ) ;
298+ let expected = false ;
299+ assert_eq ! ( actual, expected) ;
300+
301+ unsafe {
302+ std:: env:: set_var ( TRACKING_ENV_VAR_NAME , "FALSE" ) ;
303+ }
304+ let actual = tracking_enabled ( ) ;
305+ let expected = false ;
306+ assert_eq ! ( actual, expected) ;
307+
308+ unsafe {
309+ std:: env:: set_var ( TRACKING_ENV_VAR_NAME , "true" ) ;
310+ }
311+ let actual = tracking_enabled ( ) ;
312+ let expected = true ;
313+ assert_eq ! ( actual, expected) ;
314+
315+ unsafe {
316+ std:: env:: remove_var ( TRACKING_ENV_VAR_NAME ) ;
317+ }
318+ }
319+
271320 #[ tokio:: test]
272321 async fn test_tracker ( ) {
273322 if let Err ( e) = TRACKER
0 commit comments