mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-26 10:21:52 +00:00
correctly handle self as current dependent
This commit is contained in:
committed by
Aiden McClelland
parent
cf8536da2b
commit
a2528a13df
@@ -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, ¤t_dependencies).await?; // add new
|
||||
current_dependencies.remove(id);
|
||||
*deps = current_dependencies.clone();
|
||||
deps.save(db).await?;
|
||||
update_current_dependents(db, id, ¤t_dependencies).await?;
|
||||
let mut errs = pkg_model
|
||||
.clone()
|
||||
.status()
|
||||
|
||||
@@ -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?;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, ¤t_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, ¤t_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, ¤t_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, ¤t_dependencies).await?;
|
||||
update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?;
|
||||
} else {
|
||||
add_current_dependents(&mut tx, pkg_id, ¤t_dependencies).await?;
|
||||
update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?;
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user