@@ -21,14 +21,14 @@ use crate::config::{str_to_os, ManagerConfig};
2121use  crate :: downloads:: download_to_tmp_folder; 
2222use  crate :: edge:: { EdgeManager ,  EDGEDRIVER_NAME ,  EDGE_NAMES ,  WEBVIEW2_NAME } ; 
2323use  crate :: files:: { 
24-     capitalize,  collect_files_from_cache,  create_parent_path_if_not_exists, 
25-     create_path_if_not_exists,  default_cache_folder,  find_latest_from_cache,  get_binary_extension, 
26-     path_to_string, 
24+     capitalize,  collect_files_from_cache,  create_path_if_not_exists,  default_cache_folder, 
25+     find_latest_from_cache,  get_binary_extension,  path_to_string, 
2726} ; 
2827use  crate :: files:: { parse_version,  uncompress,  BrowserPath } ; 
2928use  crate :: firefox:: { FirefoxManager ,  FIREFOX_NAME ,  GECKODRIVER_NAME } ; 
3029use  crate :: grid:: GRID_NAME ; 
3130use  crate :: iexplorer:: { IExplorerManager ,  IEDRIVER_NAME ,  IE_NAMES } ; 
31+ use  crate :: lock:: Lock ; 
3232use  crate :: logger:: Logger ; 
3333use  crate :: metadata:: { 
3434    create_browser_metadata,  create_stats_metadata,  get_browser_version_from_metadata, 
@@ -59,6 +59,7 @@ pub mod files;
5959pub  mod  firefox; 
6060pub  mod  grid; 
6161pub  mod  iexplorer; 
62+ pub  mod  lock; 
6263pub  mod  logger; 
6364pub  mod  metadata; 
6465pub  mod  mirror; 
@@ -184,6 +185,22 @@ pub trait SeleniumManager {
184185    // ---------------------------------------------------------- 
185186
186187    fn  download_driver ( & mut  self )  -> Result < ( ) ,  Error >  { 
188+         let  driver_path_in_cache = self . get_driver_path_in_cache ( ) ?; 
189+         let  driver_name_with_extension = self . get_driver_name_with_extension ( ) ; 
190+ 
191+         let  mut  lock = Lock :: acquire ( 
192+             & self . get_logger ( ) , 
193+             & driver_path_in_cache, 
194+             Some ( driver_name_with_extension. clone ( ) ) , 
195+         ) ?; 
196+         if  !lock. exists ( )  && driver_path_in_cache. exists ( )  { 
197+             self . get_logger ( ) . debug ( format ! ( 
198+                 "Driver already in cache: {}" , 
199+                 driver_path_in_cache. display( ) 
200+             ) ) ; 
201+             return  Ok ( ( ) ) ; 
202+         } 
203+ 
187204        let  driver_url = self . get_driver_url ( ) ?; 
188205        self . get_logger ( ) . debug ( format ! ( 
189206            "Downloading {} {} from {}" , 
@@ -196,20 +213,20 @@ pub trait SeleniumManager {
196213
197214        if  self . is_grid ( )  { 
198215            let  driver_path_in_cache = self . get_driver_path_in_cache ( ) ?; 
199-             create_parent_path_if_not_exists ( & driver_path_in_cache) ?; 
200-             Ok ( fs:: rename ( driver_zip_file,  driver_path_in_cache) ?) 
216+             fs:: rename ( driver_zip_file,  driver_path_in_cache) ?; 
201217        }  else  { 
202-             let  driver_path_in_cache = self . get_driver_path_in_cache ( ) ?; 
203-             let  driver_name_with_extension = self . get_driver_name_with_extension ( ) ; 
204-             Ok ( uncompress ( 
218+             uncompress ( 
205219                & driver_zip_file, 
206220                & driver_path_in_cache, 
207221                self . get_logger ( ) , 
208222                self . get_os ( ) , 
209223                Some ( driver_name_with_extension) , 
210224                None , 
211-             ) ?) 
225+             ) ?; 
212226        } 
227+ 
228+         lock. release ( ) ; 
229+         Ok ( ( ) ) 
213230    } 
214231
215232    fn  download_browser ( 
@@ -304,6 +321,17 @@ pub trait SeleniumManager {
304321                ) ) ) ; 
305322            } 
306323
324+             let  browser_path_in_cache = self . get_browser_path_in_cache ( ) ?; 
325+             let  mut  lock = Lock :: acquire ( & self . get_logger ( ) ,  & browser_path_in_cache,  None ) ?; 
326+             if  !lock. exists ( )  && browser_binary_path. exists ( )  { 
327+                 self . get_logger ( ) . debug ( format ! ( 
328+                     "Browser already in cache: {}" , 
329+                     browser_binary_path. display( ) 
330+                 ) ) ; 
331+                 self . set_browser_path ( path_to_string ( & browser_binary_path) ) ; 
332+                 return  Ok ( Some ( browser_binary_path. clone ( ) ) ) ; 
333+             } 
334+ 
307335            let  browser_url = self . get_browser_url_for_download ( original_browser_version) ?; 
308336            self . get_logger ( ) . debug ( format ! ( 
309337                "Downloading {} {} from {}" , 
@@ -318,12 +346,13 @@ pub trait SeleniumManager {
318346                self . get_browser_label_for_download ( original_browser_version) ?; 
319347            uncompress ( 
320348                & driver_zip_file, 
321-                 & self . get_browser_path_in_cache ( ) ? , 
322-                 self . get_logger ( ) , 
349+                 & browser_path_in_cache , 
350+                 & self . get_logger ( ) , 
323351                self . get_os ( ) , 
324352                None , 
325353                browser_label_for_download, 
326354            ) ?; 
355+             lock. release ( ) ; 
327356        } 
328357        if  browser_binary_path. exists ( )  { 
329358            self . set_browser_path ( path_to_string ( & browser_binary_path) ) ; 
0 commit comments