From 53bf76104b7163ab7be7f139b5b047db36deb0b4 Mon Sep 17 00:00:00 2001 From: Jiahao XU Date: Sat, 18 Jun 2022 18:27:08 +1000 Subject: [PATCH] Revert refactor: Put `fetch_crate_cratesio` back to `drivers` Signed-off-by: Jiahao XU --- src/drivers.rs | 71 ++++++++++++++++++++++++++++++++++++++--- src/drivers/cratesio.rs | 71 ----------------------------------------- 2 files changed, 67 insertions(+), 75 deletions(-) delete mode 100644 src/drivers/cratesio.rs diff --git a/src/drivers.rs b/src/drivers.rs index cab8a6d6..b5dff09a 100644 --- a/src/drivers.rs +++ b/src/drivers.rs @@ -1,17 +1,19 @@ use std::collections::BTreeSet; use std::path::{Path, PathBuf}; +use std::time::Duration; +use cargo_toml::Manifest; +use crates_io_api::AsyncClient; use log::debug; use semver::{Version, VersionReq}; +use url::Url; -use crate::BinstallError; - -mod cratesio; -pub use cratesio::*; +use crate::{helpers::*, BinstallError, Meta, TarBasedFmt}; mod vfs; mod visitor; +use visitor::ManifestVisitor; fn find_version<'a, V: Iterator>( requirement: &str, @@ -55,6 +57,67 @@ fn find_version<'a, V: Iterator>( .ok_or(BinstallError::VersionMismatch { req: version_req }) } +/// Fetch a crate Cargo.toml by name and version from crates.io +pub async fn fetch_crate_cratesio( + name: &str, + version_req: &str, +) -> Result, BinstallError> { + // Fetch / update index + debug!("Looking up crate information"); + + // Build crates.io api client + let api_client = AsyncClient::new( + "cargo-binstall (https://github.com/ryankurte/cargo-binstall)", + Duration::from_millis(100), + ) + .expect("bug: invalid user agent"); + + // Fetch online crate information + let base_info = + api_client + .get_crate(name.as_ref()) + .await + .map_err(|err| BinstallError::CratesIoApi { + crate_name: name.into(), + err, + })?; + + // Locate matching version + let version_iter = + base_info + .versions + .iter() + .filter_map(|v| if !v.yanked { Some(&v.num) } else { None }); + let version_name = find_version(version_req, version_iter)?; + + // Fetch information for the filtered version + let version = base_info + .versions + .iter() + .find(|v| v.num == version_name.to_string()) + .ok_or_else(|| BinstallError::VersionUnavailable { + crate_name: name.into(), + v: version_name.clone(), + })?; + + debug!("Found information for crate version: '{}'", version.num); + + // Download crate to temporary dir (crates.io or git?) + let crate_url = format!("https://crates.io/{}", version.dl_path); + + debug!("Fetching crate from: {crate_url} and extracting Cargo.toml from it"); + + let manifest_dir_path: PathBuf = format!("{name}-{version_name}").into(); + + download_tar_based_and_visit( + Url::parse(&crate_url)?, + TarBasedFmt::Tgz, + ManifestVisitor::new(manifest_dir_path), + ) + .await? + .load_manifest() +} + /// Fetch a crate by name and version from github /// TODO: implement this pub async fn fetch_crate_gh_releases( diff --git a/src/drivers/cratesio.rs b/src/drivers/cratesio.rs deleted file mode 100644 index 0bc6027b..00000000 --- a/src/drivers/cratesio.rs +++ /dev/null @@ -1,71 +0,0 @@ -use std::path::PathBuf; -use std::time::Duration; - -use cargo_toml::Manifest; -use crates_io_api::AsyncClient; -use log::debug; -use url::Url; - -use super::{find_version, visitor::ManifestVisitor}; -use crate::{helpers::*, BinstallError, Meta, TarBasedFmt}; - -/// Fetch a crate Cargo.toml by name and version from crates.io -pub async fn fetch_crate_cratesio( - name: &str, - version_req: &str, -) -> Result, BinstallError> { - // Fetch / update index - debug!("Looking up crate information"); - - // Build crates.io api client - let api_client = AsyncClient::new( - "cargo-binstall (https://github.com/ryankurte/cargo-binstall)", - Duration::from_millis(100), - ) - .expect("bug: invalid user agent"); - - // Fetch online crate information - let base_info = - api_client - .get_crate(name.as_ref()) - .await - .map_err(|err| BinstallError::CratesIoApi { - crate_name: name.into(), - err, - })?; - - // Locate matching version - let version_iter = - base_info - .versions - .iter() - .filter_map(|v| if !v.yanked { Some(&v.num) } else { None }); - let version_name = find_version(version_req, version_iter)?; - - // Fetch information for the filtered version - let version = base_info - .versions - .iter() - .find(|v| v.num == version_name.to_string()) - .ok_or_else(|| BinstallError::VersionUnavailable { - crate_name: name.into(), - v: version_name.clone(), - })?; - - debug!("Found information for crate version: '{}'", version.num); - - // Download crate to temporary dir (crates.io or git?) - let crate_url = format!("https://crates.io/{}", version.dl_path); - - debug!("Fetching crate from: {crate_url} and extracting Cargo.toml from it"); - - let manifest_dir_path: PathBuf = format!("{name}-{version_name}").into(); - - download_tar_based_and_visit( - Url::parse(&crate_url)?, - TarBasedFmt::Tgz, - ManifestVisitor::new(manifest_dir_path), - ) - .await? - .load_manifest() -}