@@ -21,14 +21,14 @@ use crate::config::{str_to_os, ManagerConfig};
21
21
use crate :: downloads:: download_to_tmp_folder;
22
22
use crate :: edge:: { EdgeManager , EDGEDRIVER_NAME , EDGE_NAMES , WEBVIEW2_NAME } ;
23
23
use 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,
27
26
} ;
28
27
use crate :: files:: { parse_version, uncompress, BrowserPath } ;
29
28
use crate :: firefox:: { FirefoxManager , FIREFOX_NAME , GECKODRIVER_NAME } ;
30
29
use crate :: grid:: GRID_NAME ;
31
30
use crate :: iexplorer:: { IExplorerManager , IEDRIVER_NAME , IE_NAMES } ;
31
+ use crate :: lock:: Lock ;
32
32
use crate :: logger:: Logger ;
33
33
use crate :: metadata:: {
34
34
create_browser_metadata, create_stats_metadata, get_browser_version_from_metadata,
@@ -59,6 +59,7 @@ pub mod files;
59
59
pub mod firefox;
60
60
pub mod grid;
61
61
pub mod iexplorer;
62
+ pub mod lock;
62
63
pub mod logger;
63
64
pub mod metadata;
64
65
pub mod mirror;
@@ -184,6 +185,22 @@ pub trait SeleniumManager {
184
185
// ----------------------------------------------------------
185
186
186
187
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
+
187
204
let driver_url = self . get_driver_url ( ) ?;
188
205
self . get_logger ( ) . debug ( format ! (
189
206
"Downloading {} {} from {}" ,
@@ -196,20 +213,20 @@ pub trait SeleniumManager {
196
213
197
214
if self . is_grid ( ) {
198
215
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) ?;
201
217
} 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 (
205
219
& driver_zip_file,
206
220
& driver_path_in_cache,
207
221
self . get_logger ( ) ,
208
222
self . get_os ( ) ,
209
223
Some ( driver_name_with_extension) ,
210
224
None ,
211
- ) ?)
225
+ ) ?;
212
226
}
227
+
228
+ lock. release ( ) ;
229
+ Ok ( ( ) )
213
230
}
214
231
215
232
fn download_browser (
@@ -304,6 +321,17 @@ pub trait SeleniumManager {
304
321
) ) ) ;
305
322
}
306
323
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
+
307
335
let browser_url = self . get_browser_url_for_download ( original_browser_version) ?;
308
336
self . get_logger ( ) . debug ( format ! (
309
337
"Downloading {} {} from {}" ,
@@ -318,12 +346,13 @@ pub trait SeleniumManager {
318
346
self . get_browser_label_for_download ( original_browser_version) ?;
319
347
uncompress (
320
348
& driver_zip_file,
321
- & self . get_browser_path_in_cache ( ) ? ,
322
- self . get_logger ( ) ,
349
+ & browser_path_in_cache ,
350
+ & self . get_logger ( ) ,
323
351
self . get_os ( ) ,
324
352
None ,
325
353
browser_label_for_download,
326
354
) ?;
355
+ lock. release ( ) ;
327
356
}
328
357
if browser_binary_path. exists ( ) {
329
358
self . set_browser_path ( path_to_string ( & browser_binary_path) ) ;
0 commit comments