correctly handle self as current dependent

This commit is contained in:
Aiden McClelland
2021-12-09 19:58:44 -07:00
committed by Aiden McClelland
parent cf8536da2b
commit a2528a13df
5 changed files with 21 additions and 13 deletions

View File

@@ -18,7 +18,7 @@ use crate::context::RpcContext;
use crate::db::model::CurrentDependencyInfo;
use crate::db::util::WithRevision;
use crate::dependencies::{
break_transitive, heal_all_dependents_transitive, update_current_dependents, BreakageRes,
add_current_dependents, break_transitive, heal_all_dependents_transitive, BreakageRes,
DependencyError, DependencyErrors, TaggedDependencyError,
};
use crate::install::cleanup::remove_current_dependents;
@@ -435,10 +435,11 @@ pub fn configure_rec<'a, Db: DbHandle>(
// update dependencies
let mut deps = pkg_model.clone().current_dependencies().get_mut(db).await?;
remove_current_dependents(db, id, deps.keys()).await?;
remove_current_dependents(db, id, deps.keys()).await?; // remove previous
add_current_dependents(db, id, &current_dependencies).await?; // add new
current_dependencies.remove(id);
*deps = current_dependencies.clone();
deps.save(db).await?;
update_current_dependents(db, id, &current_dependencies).await?;
let mut errs = pkg_model
.clone()
.status()

View File

@@ -649,7 +649,7 @@ pub async fn configure_logic(
}
#[instrument(skip(db, current_dependencies))]
pub async fn update_current_dependents<
pub async fn add_current_dependents<
'a,
Db: DbHandle,
I: IntoIterator<Item = (&'a PackageId, &'a CurrentDependencyInfo)>,
@@ -658,10 +658,7 @@ pub async fn update_current_dependents<
dependent_id: &PackageId,
current_dependencies: I,
) -> Result<(), Error> {
for (dependency, dep_info) in current_dependencies
.into_iter()
.filter(|(dependency, _)| dependency != &dependent_id)
{
for (dependency, dep_info) in current_dependencies {
if let Some(dependency_model) = crate::db::DatabaseModel::new()
.package_data()
.idx_model(&dependency)
@@ -745,6 +742,8 @@ pub async fn break_all_dependents_transitive<'a, Db: DbHandle>(
.current_dependents()
.keys(db, true)
.await?
.into_iter()
.filter(|dependent| id != dependent)
{
break_transitive(db, &dependent, id, error.clone(), breakages).await?;
}
@@ -821,6 +820,8 @@ pub async fn heal_all_dependents_transitive<'a, Db: DbHandle>(
.current_dependents()
.keys(db, true)
.await?
.into_iter()
.filter(|dependent| id != dependent)
{
heal_transitive(ctx, db, &dependent, id).await?;
}

View File

@@ -197,10 +197,10 @@ pub async fn cleanup_failed<Db: DbHandle>(
#[instrument(skip(db, current_dependencies))]
pub async fn remove_current_dependents<'a, Db: DbHandle, I: IntoIterator<Item = &'a PackageId>>(
db: &mut Db,
id: &PackageId,
id: &'a PackageId,
current_dependencies: I,
) -> Result<(), Error> {
for dep in current_dependencies {
for dep in current_dependencies.into_iter().chain(std::iter::once(id)) {
if let Some(current_dependents) = crate::db::DatabaseModel::new()
.package_data()
.idx_model(dep)

View File

@@ -23,7 +23,7 @@ use tokio::process::Command;
use tokio_stream::wrappers::ReadDirStream;
use tracing::instrument;
use self::cleanup::cleanup_failed;
use self::cleanup::{cleanup_failed, remove_current_dependents};
use crate::context::{CliContext, RpcContext};
use crate::core::rpc_continuations::{RequestGuid, RpcContinuation};
use crate::db::model::{
@@ -32,7 +32,7 @@ use crate::db::model::{
};
use crate::db::util::WithRevision;
use crate::dependencies::{
break_all_dependents_transitive, update_current_dependents, BreakageRes, DependencyError,
add_current_dependents, break_all_dependents_transitive, BreakageRes, DependencyError,
DependencyErrors,
};
use crate::install::cleanup::{cleanup, update_dependents};
@@ -853,7 +853,6 @@ pub async fn install_s9pk<R: AsyncRead + AsyncSeek + Unpin>(
}
})
.collect();
update_current_dependents(&mut tx, pkg_id, &current_dependencies).await?;
let current_dependents = {
// search required dependencies
let mut deps = BTreeMap::new();
@@ -997,6 +996,8 @@ pub async fn install_s9pk<R: AsyncRead + AsyncSeek + Unpin>(
*main_status = prev.status.main;
main_status.save(&mut tx).await?;
}
remove_current_dependents(&mut tx, pkg_id, prev.current_dependencies.keys()).await?; // remove previous
add_current_dependents(&mut tx, pkg_id, &current_dependencies).await?; // add new
update_dependents(
ctx,
&mut tx,
@@ -1023,6 +1024,7 @@ pub async fn install_s9pk<R: AsyncRead + AsyncSeek + Unpin>(
&manifest.volumes,
)
.await?;
add_current_dependents(&mut tx, pkg_id, &current_dependencies).await?;
update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?;
} else if let Some(recovered) = crate::db::DatabaseModel::new()
.recovered_packages()
@@ -1032,8 +1034,10 @@ pub async fn install_s9pk<R: AsyncRead + AsyncSeek + Unpin>(
.into_owned()
{
handle_recovered_package(recovered, manifest, ctx, pkg_id, version, &mut tx).await?;
add_current_dependents(&mut tx, pkg_id, &current_dependencies).await?;
update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?;
} else {
add_current_dependents(&mut tx, pkg_id, &current_dependencies).await?;
update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?;
}

View File

@@ -37,6 +37,8 @@ pub async fn dry(
.current_dependents()
.keys(&mut tx, true)
.await?
.into_iter()
.filter(|dependent| &id != dependent)
{
let version_req = crate::db::DatabaseModel::new()
.package_data()