]>
Commit | Line | Data |
---|---|---|
3fd28143 | 1 | use crate::core::compiler::{BuildConfig, CompileMode, RustcTargetData}; |
04ddd4d0 DW |
2 | use crate::core::{PackageSet, Resolve, Workspace}; |
3 | use crate::ops; | |
04ddd4d0 DW |
4 | use crate::util::CargoResult; |
5 | use crate::util::Config; | |
fecb7246 | 6 | use std::collections::HashSet; |
1956c5d8 BW |
7 | |
8 | pub 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 |
15 | pub 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 | } |