From cc0e525dc5f1521d9ac32ac80ab0b27c5ac7d49d Mon Sep 17 00:00:00 2001 From: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com> Date: Thu, 13 Jul 2023 14:36:48 -0600 Subject: [PATCH] fix incoherent when removing (#2332) * fix incoherent when removing * include all packages for current dependents --- backend/src/context/rpc.rs | 64 +++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/backend/src/context/rpc.rs b/backend/src/context/rpc.rs index 16c5297dc..f3c1e9cf2 100644 --- a/backend/src/context/rpc.rs +++ b/backend/src/context/rpc.rs @@ -265,6 +265,45 @@ impl RpcContext { pub async fn cleanup(&self) -> Result<(), Error> { let mut db = self.db.handle(); let receipts = RpcCleanReceipts::new(&mut db).await?; + let packages = receipts.packages.get(&mut db).await?.0; + let mut current_dependents = packages + .keys() + .map(|k| (k.clone(), BTreeMap::new())) + .collect::>(); + for (package_id, package) in packages { + for (k, v) in package + .into_installed() + .into_iter() + .flat_map(|i| i.current_dependencies.0) + { + let mut entry: BTreeMap<_, _> = current_dependents.remove(&k).unwrap_or_default(); + entry.insert(package_id.clone(), v); + current_dependents.insert(k, entry); + } + } + for (package_id, current_dependents) in current_dependents { + if let Some(deps) = crate::db::DatabaseModel::new() + .package_data() + .idx_model(&package_id) + .and_then(|pde| pde.installed()) + .map::<_, CurrentDependents>(|i| i.current_dependents()) + .check(&mut db) + .await? + { + deps.put(&mut db, &CurrentDependents(current_dependents)) + .await?; + } else if let Some(deps) = crate::db::DatabaseModel::new() + .package_data() + .idx_model(&package_id) + .and_then(|pde| pde.removing()) + .map::<_, CurrentDependents>(|i| i.current_dependents()) + .check(&mut db) + .await? + { + deps.put(&mut db, &CurrentDependents(current_dependents)) + .await?; + } + } for (package_id, package) in receipts.packages.get(&mut db).await?.0 { if let Err(e) = async { match package { @@ -336,31 +375,6 @@ impl RpcContext { tracing::debug!("{:?}", e); } } - let mut current_dependents = BTreeMap::new(); - for (package_id, package) in receipts.packages.get(&mut db).await?.0 { - for (k, v) in package - .into_installed() - .into_iter() - .flat_map(|i| i.current_dependencies.0) - { - let mut entry: BTreeMap<_, _> = current_dependents.remove(&k).unwrap_or_default(); - entry.insert(package_id.clone(), v); - current_dependents.insert(k, entry); - } - } - for (package_id, current_dependents) in current_dependents { - if let Some(deps) = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&package_id) - .and_then(|pde| pde.installed()) - .map::<_, CurrentDependents>(|i| i.current_dependents()) - .check(&mut db) - .await? - { - deps.put(&mut db, &CurrentDependents(current_dependents)) - .await?; - } - } Ok(()) }