@@ -394,12 +394,10 @@ impl Updater {
394
394
std:: env:: set_var ( "SSL_CERT_DIR" , "/etc/ssl/certs" ) ;
395
395
}
396
396
}
397
- let ( target, json_target ) = if let Some ( target) = & self . target {
398
- ( target. clone ( ) , target . clone ( ) )
397
+ let target = if let Some ( target) = & self . target {
398
+ target
399
399
} else {
400
- let os = updater_os ( ) . ok_or ( Error :: UnsupportedOs ) ?;
401
- let json_target = format ! ( "{os}-{}" , self . arch) ;
402
- ( os. to_owned ( ) , json_target)
400
+ updater_os ( ) . ok_or ( Error :: UnsupportedOs ) ?
403
401
} ;
404
402
405
403
let mut remote_release: Option < RemoteRelease > = None ;
@@ -508,33 +506,8 @@ impl Updater {
508
506
None => release. version > self . current_version ,
509
507
} ;
510
508
511
- let mut download_url = release. download_url ( & json_target) ;
512
- let mut signature = release. signature ( & json_target) ;
513
-
514
509
let installer = self . get_updater_installer ( ) ;
515
-
516
- if let Some ( installer) = installer {
517
- let target = & format ! ( "{}-{}" , & json_target, installer. suffix( ) ) ;
518
- log:: debug!(
519
- "Bundle type is {}. Checking for platform {target} in response" ,
520
- installer. suffix( )
521
- ) ;
522
- let bundle_url = release. download_url ( target) ;
523
- let bundle_signature = release. signature ( target) ;
524
- if bundle_url. is_err ( ) || bundle_signature. is_err ( ) {
525
- if download_url. is_err ( ) || signature. is_err ( ) {
526
- return Err ( Error :: TargetsNotFound ( json_target. clone ( ) , target. clone ( ) ) ) ;
527
- }
528
- log:: debug!( "Platform {target} not found in response. Using fallback URL" ) ;
529
- } else {
530
- log:: debug!( "Platform {target} found in response" ) ;
531
- download_url = bundle_url;
532
- signature = bundle_signature;
533
- }
534
- } else if download_url. is_err ( ) || signature. is_err ( ) {
535
- log:: debug!( "Bundle type is not known and fallback platform {json_target} was not found in response" ) ;
536
- return Err ( Error :: TargetNotFound ( json_target. clone ( ) ) ) ;
537
- }
510
+ let ( download_url, signature) = self . get_urls ( & release, & installer) ?;
538
511
539
512
let update = if should_update {
540
513
Some ( Update {
@@ -546,9 +519,9 @@ impl Updater {
546
519
extract_path : self . extract_path . clone ( ) ,
547
520
version : release. version . to_string ( ) ,
548
521
date : release. pub_date ,
549
- download_url : download_url? . to_owned ( ) ,
522
+ download_url : download_url. clone ( ) ,
550
523
body : release. notes . clone ( ) ,
551
- signature : signature? . to_owned ( ) ,
524
+ signature : signature. to_owned ( ) ,
552
525
installer,
553
526
raw_json : raw_json. unwrap ( ) ,
554
527
timeout : None ,
@@ -564,6 +537,38 @@ impl Updater {
564
537
565
538
Ok ( update)
566
539
}
540
+
541
+ fn get_urls < ' a > (
542
+ & self ,
543
+ release : & ' a RemoteRelease ,
544
+ installer : & Option < Installer > ,
545
+ ) -> Result < ( & ' a Url , & ' a String ) > {
546
+ // Use the user provided target
547
+ if let Some ( target) = & self . target {
548
+ return Ok ( ( release. download_url ( target) ?, release. signature ( target) ?) ) ;
549
+ }
550
+
551
+ // Or else we search for [`{os}-{arch}-{installer}`, `{os}-{arch}`] in order
552
+ let os = updater_os ( ) . ok_or ( Error :: UnsupportedOs ) ?;
553
+ let arch = self . arch ;
554
+ let mut targets = Vec :: new ( ) ;
555
+ if let Some ( installer) = installer {
556
+ let installer = installer. suffix ( ) ;
557
+ targets. push ( format ! ( "{os}-{arch}-{installer}" ) ) ;
558
+ }
559
+ targets. push ( format ! ( "{os}-{arch}" ) ) ;
560
+
561
+ for target in & targets {
562
+ log:: debug!( "Searching for updater target '{target}' in release data" ) ;
563
+ if let ( Ok ( download_url) , Ok ( signature) ) =
564
+ ( release. download_url ( target) , release. signature ( target) )
565
+ {
566
+ return Ok ( ( download_url, signature) ) ;
567
+ } ;
568
+ }
569
+
570
+ Err ( Error :: TargetsNotFound ( targets) )
571
+ }
567
572
}
568
573
569
574
#[ derive( Clone ) ]
0 commit comments