]> git.proxmox.com Git - cargo.git/blob - src/cargo/ops/cargo_fetch.rs
Auto merge of #9467 - ehuss:install-metadata, r=alexcrichton
[cargo.git] / src / cargo / ops / cargo_fetch.rs
1 use crate::core::compiler::{BuildConfig, CompileMode, RustcTargetData};
2 use crate::core::{PackageSet, Resolve, Workspace};
3 use crate::ops;
4 use crate::util::CargoResult;
5 use crate::util::Config;
6 use std::collections::HashSet;
7
8 pub struct FetchOptions<'a> {
9 pub config: &'a Config,
10 /// The target arch triple to fetch dependencies for
11 pub targets: Vec<String>,
12 }
13
14 /// Executes `cargo fetch`.
15 pub fn fetch<'a>(
16 ws: &Workspace<'a>,
17 options: &FetchOptions<'a>,
18 ) -> CargoResult<(Resolve, PackageSet<'a>)> {
19 ws.emit_warnings()?;
20 let (packages, resolve) = ops::resolve_ws(ws)?;
21
22 let jobs = Some(1);
23 let config = ws.config();
24 let build_config = BuildConfig::new(config, jobs, &options.targets, CompileMode::Build)?;
25 let data = RustcTargetData::new(ws, &build_config.requested_kinds)?;
26 let mut fetched_packages = HashSet::new();
27 let mut deps_to_fetch = ws.members().map(|p| p.package_id()).collect::<Vec<_>>();
28 let mut to_download = Vec::new();
29
30 while let Some(id) = deps_to_fetch.pop() {
31 if !fetched_packages.insert(id) {
32 continue;
33 }
34
35 to_download.push(id);
36 let deps = resolve
37 .deps(id)
38 .filter(|&(_id, deps)| {
39 deps.iter().any(|d| {
40 // If no target was specified then all dependencies are
41 // fetched.
42 if options.targets.is_empty() {
43 return true;
44 }
45
46 // Otherwise we only download this dependency if any of the
47 // requested platforms would match this dependency. Note
48 // that this is a bit lossy because not all dependencies are
49 // always compiled for all platforms, but it should be
50 // "close enough" for now.
51 build_config
52 .requested_kinds
53 .iter()
54 .any(|kind| data.dep_platform_activated(d, *kind))
55 })
56 })
57 .map(|(id, _deps)| id);
58 deps_to_fetch.extend(deps);
59 }
60 packages.get_many(to_download)?;
61
62 Ok((resolve, packages))
63 }