From 603955b84833ea20236f57c38755e68468da2002 Mon Sep 17 00:00:00 2001 From: Jiahao XU <Jiahao_XU@outlook.com> Date: Tue, 7 Jun 2022 15:11:04 +1000 Subject: [PATCH 1/3] Support for checking multi-targets Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> --- src/main.rs | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index a9479a2d..8cdf4e72 100644 --- a/src/main.rs +++ b/src/main.rs @@ -217,18 +217,24 @@ async fn entry() -> Result<()> { .join(format!("pkg-{}.{}", opts.name, meta.pkg_fmt)); debug!("Using temporary download path: {}", pkg_path.display()); - let fetcher_data = Data { - name: package.name.clone(), - target: opts.target.clone(), - version: package.version.clone(), - repo: package.repository.clone(), - meta: meta.clone(), - }; + let fetcher_data: Vec<_> = detect_targets() + .await + .into_iter() + .map(|target| Data { + name: package.name.clone(), + target: target.into(), + version: package.version.clone(), + repo: package.repository.clone(), + meta: meta.clone(), + }) + .collect(); // Try github releases, then quickinstall let mut fetchers = MultiFetcher::default(); - fetchers.add(GhCrateMeta::new(&fetcher_data).await); - fetchers.add(QuickInstall::new(&fetcher_data).await); + for data in &fetcher_data { + fetchers.add(GhCrateMeta::new(data).await); + fetchers.add(QuickInstall::new(data).await); + } match fetchers.first_available().await { Some(fetcher) => { From 3f2e03893a5159057764087ad15881113c98b519 Mon Sep 17 00:00:00 2001 From: Jiahao XU <Jiahao_XU@outlook.com> Date: Tue, 7 Jun 2022 16:35:47 +1000 Subject: [PATCH 2/3] Add `Fetcher::target` to trait `Fetcher` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> --- src/fetchers.rs | 3 +++ src/fetchers/gh_crate_meta.rs | 4 ++++ src/fetchers/quickinstall.rs | 8 +++++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/fetchers.rs b/src/fetchers.rs index b7b25795..9b6df316 100644 --- a/src/fetchers.rs +++ b/src/fetchers.rs @@ -30,6 +30,9 @@ pub trait Fetcher { /// Should return true if the remote is from a third-party source fn is_third_party(&self) -> bool; + + /// Return the target for this fetcher + fn target(&self) -> &str; } /// Data required to fetch a package diff --git a/src/fetchers/gh_crate_meta.rs b/src/fetchers/gh_crate_meta.rs index f048bb87..1c096189 100644 --- a/src/fetchers/gh_crate_meta.rs +++ b/src/fetchers/gh_crate_meta.rs @@ -66,6 +66,10 @@ impl super::Fetcher for GhCrateMeta { fn is_third_party(&self) -> bool { false } + + fn target(&self) -> &str { + &self.data.target + } } /// Template for constructing download paths diff --git a/src/fetchers/quickinstall.rs b/src/fetchers/quickinstall.rs index 61871e5c..1d500647 100644 --- a/src/fetchers/quickinstall.rs +++ b/src/fetchers/quickinstall.rs @@ -13,6 +13,7 @@ const USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VE pub struct QuickInstall { package: String, + target: String, } #[async_trait::async_trait] @@ -20,9 +21,10 @@ impl super::Fetcher for QuickInstall { async fn new(data: &Data) -> Box<Self> { let crate_name = &data.name; let version = &data.version; - let target = &data.target; + let target = data.target.clone(); Box::new(Self { package: format!("{crate_name}-{version}-{target}"), + target, }) } @@ -50,6 +52,10 @@ impl super::Fetcher for QuickInstall { fn is_third_party(&self) -> bool { true } + + fn target(&self) -> &str { + &self.target + } } impl QuickInstall { From ad3e707aa36f4d8f9e05af199f299d400ebd5242 Mon Sep 17 00:00:00 2001 From: Jiahao XU <Jiahao_XU@outlook.com> Date: Tue, 7 Jun 2022 16:37:04 +1000 Subject: [PATCH 3/3] Fix `install_from_package`: Rm use of `opts.target` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 8cdf4e72..e282004a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -341,7 +341,7 @@ async fn install_from_package( // based on those found via Cargo.toml let bin_data = bins::Data { name: package.name.clone(), - target: opts.target.clone(), + target: fetcher.target().to_string(), version: package.version.clone(), repo: package.repository.clone(), meta,