Skip to content

Commit ad8d711

Browse files
committed
Refactor the target fallback to a function
1 parent f563b02 commit ad8d711

File tree

2 files changed

+40
-35
lines changed

2 files changed

+40
-35
lines changed

plugins/updater/src/error.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ pub enum Error {
4343
#[error("the platform `{0}` was not found in the response `platforms` object")]
4444
TargetNotFound(String),
4545
/// Neither the platform not the fallback platform was not found in the updater JSON response.
46-
#[error("neither platform `{0}` nor`{1}` were found in the response `platforms` object")]
47-
TargetsNotFound(String, String),
46+
#[error("None of the fallback platforms `{0:?}` were found in the response `platforms` object")]
47+
TargetsNotFound(Vec<String>),
4848
/// Download failed
4949
#[error("`{0}`")]
5050
Network(String),

plugins/updater/src/updater.rs

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -394,12 +394,10 @@ impl Updater {
394394
std::env::set_var("SSL_CERT_DIR", "/etc/ssl/certs");
395395
}
396396
}
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
399399
} 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)?
403401
};
404402

405403
let mut remote_release: Option<RemoteRelease> = None;
@@ -508,33 +506,8 @@ impl Updater {
508506
None => release.version > self.current_version,
509507
};
510508

511-
let mut download_url = release.download_url(&json_target);
512-
let mut signature = release.signature(&json_target);
513-
514509
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)?;
538511

539512
let update = if should_update {
540513
Some(Update {
@@ -546,9 +519,9 @@ impl Updater {
546519
extract_path: self.extract_path.clone(),
547520
version: release.version.to_string(),
548521
date: release.pub_date,
549-
download_url: download_url?.to_owned(),
522+
download_url: download_url.clone(),
550523
body: release.notes.clone(),
551-
signature: signature?.to_owned(),
524+
signature: signature.to_owned(),
552525
installer,
553526
raw_json: raw_json.unwrap(),
554527
timeout: None,
@@ -564,6 +537,38 @@ impl Updater {
564537

565538
Ok(update)
566539
}
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+
}
567572
}
568573

569574
#[derive(Clone)]

0 commit comments

Comments
 (0)