]> git.proxmox.com Git - cargo.git/blame - src/cargo/ops/cargo_fetch.rs
Print environment note for json format, too.
[cargo.git] / src / cargo / ops / cargo_fetch.rs
CommitLineData
3fd28143 1use crate::core::compiler::{BuildConfig, CompileMode, RustcTargetData};
04ddd4d0
DW
2use crate::core::{PackageSet, Resolve, Workspace};
3use crate::ops;
04ddd4d0
DW
4use crate::util::CargoResult;
5use crate::util::Config;
fecb7246 6use std::collections::HashSet;
1956c5d8
BW
7
8pub struct FetchOptions<'a> {
9 pub config: &'a Config,
10 /// The target arch triple to fetch dependencies for
3fd28143 11 pub targets: Vec<String>,
1956c5d8 12}
2dff1ed6 13
c7641c24 14/// Executes `cargo fetch`.
1956c5d8
BW
15pub fn fetch<'a>(
16 ws: &Workspace<'a>,
17 options: &FetchOptions<'a>,
18) -> CargoResult<(Resolve, PackageSet<'a>)> {
22619a29 19 ws.emit_warnings()?;
bdd3b21c 20 let (packages, resolve) = ops::resolve_ws(ws)?;
1956c5d8 21
1956c5d8 22 let jobs = Some(1);
46533783 23 let config = ws.config();
3fd28143
AC
24 let build_config = BuildConfig::new(config, jobs, &options.targets, CompileMode::Build)?;
25 let data = RustcTargetData::new(ws, &build_config.requested_kinds)?;
593a02f2
AC
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();
ce5bbbc7 29
593a02f2
AC
30 while let Some(id) = deps_to_fetch.pop() {
31 if !fetched_packages.insert(id) {
32 continue;
33 }
ce5bbbc7 34
593a02f2
AC
35 to_download.push(id);
36 let deps = resolve
37 .deps(id)
38 .filter(|&(_id, deps)| {
39 deps.iter().any(|d| {
3fd28143
AC
40 // If no target was specified then all dependencies are
41 // fetched.
6694fdb6 42 if options.targets.is_empty() {
3fd28143
AC
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))
1956c5d8 55 })
593a02f2
AC
56 })
57 .map(|(id, _deps)| id);
58 deps_to_fetch.extend(deps);
7b1a0dc5 59 }
593a02f2 60 packages.get_many(to_download)?;
7b1a0dc5 61
ce5bbbc7 62 Ok((resolve, packages))
1956c5d8 63}