refactor: avoid manually recreating graph

This commit is contained in:
daimond113 2025-04-25 21:18:43 +02:00
parent c05bfa5a76
commit c835998621
No known key found for this signature in database
GPG key ID: 640DC95EC1190354

View file

@ -66,26 +66,23 @@ impl DownloadAndLinkHooks for () {
} }
/// Options for which dependencies to install. /// Options for which dependencies to install.
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy)]
pub enum InstallDependenciesMode { pub enum InstallDependenciesMode {
/// Install all dependencies. /// Install all dependencies
All, All,
/// Install only dependencies, not dev_dependencies. /// Install all dependencies, then remove [DependencyType::Dev] dependencies
Prod, Prod,
/// Install only dev_dependencies. /// Only install dependencies which are [DependencyType::Dev]
Dev, Dev,
} }
impl InstallDependenciesMode { impl InstallDependenciesMode {
fn fits(self, dep_ty: DependencyType) -> bool { fn fits(self, dep_ty: DependencyType) -> bool {
match (self, dep_ty) { match (self, dep_ty) {
(InstallDependenciesMode::All, _) => true,
(InstallDependenciesMode::Prod, DependencyType::Standard) => true,
(InstallDependenciesMode::Prod, DependencyType::Peer) => true,
(InstallDependenciesMode::Prod, DependencyType::Dev) => false, (InstallDependenciesMode::Prod, DependencyType::Dev) => false,
(InstallDependenciesMode::Dev, DependencyType::Standard) => false, (InstallDependenciesMode::Dev, dep_ty) => dep_ty == DependencyType::Dev,
(InstallDependenciesMode::Dev, DependencyType::Peer) => false,
(InstallDependenciesMode::Dev, DependencyType::Dev) => true, _ => true,
} }
} }
} }
@ -247,25 +244,32 @@ impl Project {
download_graph_options = download_graph_options.reporter(reporter); download_graph_options = download_graph_options.reporter(reporter);
} }
let mut queue = graph let correct_deps = if matches!(install_dependencies_mode, InstallDependenciesMode::All)
.iter() {
.filter(|(_, node)| { graph.clone()
node.direct.is_some() && install_dependencies_mode.fits(node.resolved_ty) } else {
}) let mut queue = graph
.collect::<VecDeque<_>>(); .iter()
.filter(|(_, node)| {
node.direct.is_some() && install_dependencies_mode.fits(node.resolved_ty)
})
.collect::<VecDeque<_>>();
let mut correct_deps = DependencyGraph::new(); let mut correct_deps = DependencyGraph::new();
while let Some((id, node)) = queue.pop_front() { while let Some((id, node)) = queue.pop_front() {
if correct_deps.insert(id.clone(), node.clone()).is_some() { if correct_deps.insert(id.clone(), node.clone()).is_some() {
// prevent an infinite loop with recursive dependencies // prevent an infinite loop with recursive dependencies
continue; continue;
}
node.dependencies
.keys()
.filter_map(|id| graph.get(id).map(|node| (id, node)))
.for_each(|x| queue.push_back(x));
} }
node.dependencies correct_deps
.keys() };
.filter_map(|id| graph.get(id).map(|node| (id, node)))
.for_each(|x| queue.push_back(x));
}
let mut downloaded_graph = DependencyGraph::new(); let mut downloaded_graph = DependencyGraph::new();
@ -464,7 +468,7 @@ impl Project {
.map_err(errors::DownloadAndLinkError::Hook)?; .map_err(errors::DownloadAndLinkError::Hook)?;
} }
if install_dependencies_mode != InstallDependenciesMode::All || !force { if matches!(install_dependencies_mode, InstallDependenciesMode::Prod) || !force {
self.remove_unused(&graph).await?; self.remove_unused(&graph).await?;
} }