From 643d25873b352540ca73782e918610af8bbd4324 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Tue, 5 Feb 2019 18:21:43 +0100 Subject: [PATCH] Introduce Source::download_now --- src/cargo/core/source/mod.rs | 13 +++++++++++- .../ops/common_for_install_and_uninstall.rs | 20 ++++++------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/cargo/core/source/mod.rs b/src/cargo/core/source/mod.rs index 50d1c63d869..322ee98d430 100644 --- a/src/cargo/core/source/mod.rs +++ b/src/cargo/core/source/mod.rs @@ -2,7 +2,8 @@ use std::collections::hash_map::HashMap; use std::fmt; use crate::core::{Dependency, Package, PackageId, Summary}; -use crate::util::CargoResult; +use crate::core::package::PackageSet; +use crate::util::{CargoResult, Config}; mod source_id; @@ -51,6 +52,16 @@ pub trait Source { /// version specified. fn download(&mut self, package: PackageId) -> CargoResult; + fn download_now(self: Box, package: PackageId, config: &Config) -> CargoResult + where + Self: std::marker::Sized, + { + let mut sources = SourceMap::new(); + sources.insert(self); + let pkg_set = PackageSet::new(&[package], sources, config)?; + Ok(pkg_set.get_one(package)?.clone()) + } + fn finish_download(&mut self, package: PackageId, contents: Vec) -> CargoResult; /// Generates a unique string which represents the fingerprint of the diff --git a/src/cargo/ops/common_for_install_and_uninstall.rs b/src/cargo/ops/common_for_install_and_uninstall.rs index 5178181504e..6d739658cdc 100644 --- a/src/cargo/ops/common_for_install_and_uninstall.rs +++ b/src/cargo/ops/common_for_install_and_uninstall.rs @@ -7,8 +7,6 @@ use std::path::{Path, PathBuf}; use semver::VersionReq; use serde::{Deserialize, Serialize}; -use crate::core::package::PackageSet; -use crate::core::source::SourceMap; use crate::core::PackageId; use crate::core::{Dependency, Package, Source, SourceId}; use crate::sources::PathSource; @@ -139,8 +137,11 @@ where }; let dep = Dependency::parse_no_deprecated(name, vers_spec, source.source_id())?; let deps = source.query_vec(&dep)?; - let pkgid = match deps.iter().map(|p| p.package_id()).max() { - Some(pkgid) => pkgid, + match deps.iter().map(|p| p.package_id()).max() { + Some(pkgid) => { + let pkg = Box::new(&mut source).download_now(pkgid, config)?; + Ok((pkg, Box::new(source))) + }, None => { let vers_info = vers .map(|v| format!(" with version `{}`", v)) @@ -152,16 +153,7 @@ where vers_info ) } - }; - - let pkg = { - let mut map = SourceMap::new(); - map.insert(Box::new(&mut source)); - PackageSet::new(&[pkgid], map, config)? - .get_one(pkgid)? - .clone() - }; - Ok((pkg, Box::new(source))) + } } None => { let candidates = list_all(&mut source)?;