Skip to content

Commit 68484b1

Browse files
committed
trying to get only needed dependencies
1 parent 1d0cbf9 commit 68484b1

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

src/dfx/src/commands/deps/pull.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ async fn resolve_all_dependencies(
8282
) -> DfxResult<Vec<Principal>> {
8383
let mut canisters_to_resolve: VecDeque<Principal> =
8484
pull_canisters_in_config.values().cloned().collect();
85+
println!("canisters_to_resolve: {:?}", canisters_to_resolve); // FIXME: Remove.
8586
let mut checked = BTreeSet::new();
8687
while let Some(canister_id) = canisters_to_resolve.pop_front() {
8788
if !checked.contains(&canister_id) {

src/dfx/src/lib/builders/motoko.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ fn get_imports(cache: &dyn Cache, info: &MotokoCanisterInfo) -> DfxResult<BTreeS
7979
Ok(())
8080
}
8181

82+
// FIXME: Remove.
83+
println!("Getting imports for canister {}.", info.get_main_path().display());
84+
// println!("Custom backtrace: {}", std::backtrace::Backtrace::force_capture());
85+
8286
let mut result = BTreeSet::new();
8387
get_imports_recursive(cache, info.get_main_path(), &mut result)?;
8488

@@ -93,6 +97,7 @@ impl CanisterBuilder for MotokoBuilder {
9397
info: &CanisterInfo,
9498
) -> DfxResult<Vec<CanisterId>> {
9599
let motoko_info = info.as_info::<MotokoCanisterInfo>()?;
100+
println!("get_dependencies: {}", info.get_name()); // FIXME: Remove.
96101
let imports = get_imports(self.cache.as_ref(), &motoko_info)?; // TODO: slow operation
97102

98103
Ok(imports

src/dfx/src/lib/models/canister.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use petgraph::graph::{DiGraph, NodeIndex};
2424
use rand::{thread_rng, RngCore};
2525
use slog::{error, info, trace, warn, Logger};
2626
use std::cell::RefCell;
27-
use std::collections::{BTreeMap, HashSet};
27+
use std::collections::{BTreeMap, HashMap, HashSet};
2828
use std::convert::TryFrom;
2929
use std::ffi::OsStr;
3030
use std::io::Read;
@@ -528,18 +528,29 @@ impl CanisterPool {
528528
}
529529

530530
#[context("Failed to build dependencies graph for canister pool.")]
531-
fn build_dependencies_graph(&self) -> DfxResult<DiGraph<CanisterId, ()>> {
531+
fn build_dependencies_graph(&self, canisters_to_build: Option<Vec<String>>) -> DfxResult<DiGraph<CanisterId, ()>> {
532+
println!("build_dependencies_graph"); // FIXME: Remove.
532533
let mut graph: DiGraph<CanisterId, ()> = DiGraph::new();
533534
let mut id_set: BTreeMap<CanisterId, NodeIndex<u32>> = BTreeMap::new();
534535

536+
// TODO: Can be done faster by not using `collect` and/or `clone`?
537+
let real_canisters_to_build = if let Some(canisters_to_build) = canisters_to_build {
538+
let canisters_to_build_map: HashMap<&str, ()> = canisters_to_build.iter().map(|e| (e.as_str(), ())).collect();
539+
self.canisters.iter()
540+
.filter(|c| canisters_to_build_map.contains_key(c.get_name()))
541+
.map(|c| c.clone()).collect::<Vec<_>>()
542+
} else {
543+
self.canisters.iter().map(|c| c.clone()).collect::<Vec<_>>()
544+
};
545+
535546
// Add all the canisters as nodes.
536547
for canister in &self.canisters {
537548
let canister_id = canister.info.get_canister_id()?;
538549
id_set.insert(canister_id, graph.add_node(canister_id));
539550
}
540551

541552
// Add all the edges.
542-
for canister in &self.canisters {
553+
for canister in &real_canisters_to_build {
543554
let canister_id = canister.canister_id();
544555
let canister_info = &canister.info;
545556
let deps = canister.builder.get_dependencies(self, canister_info)?;
@@ -692,7 +703,7 @@ impl CanisterPool {
692703
.map_err(|e| DfxError::new(BuildError::PreBuildAllStepFailed(Box::new(e))))?;
693704

694705
trace!(log, "Building dependencies graph.");
695-
let graph = self.build_dependencies_graph()?;
706+
let graph = self.build_dependencies_graph(build_config.canisters_to_build.clone())?; // TODO: Can `clone` be eliminated?
696707
let nodes = petgraph::algo::toposort(&graph, None).map_err(|cycle| {
697708
let message = match graph.node_weight(cycle.node_id()) {
698709
Some(canister_id) => match self.get_canister_info(canister_id) {

0 commit comments

Comments
 (0)