mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-30 04:01:58 +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::model::CurrentDependencyInfo;
|
||||||
use crate::db::util::WithRevision;
|
use crate::db::util::WithRevision;
|
||||||
use crate::dependencies::{
|
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,
|
DependencyError, DependencyErrors, TaggedDependencyError,
|
||||||
};
|
};
|
||||||
use crate::install::cleanup::remove_current_dependents;
|
use crate::install::cleanup::remove_current_dependents;
|
||||||
@@ -435,10 +435,11 @@ pub fn configure_rec<'a, Db: DbHandle>(
|
|||||||
|
|
||||||
// update dependencies
|
// update dependencies
|
||||||
let mut deps = pkg_model.clone().current_dependencies().get_mut(db).await?;
|
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 = current_dependencies.clone();
|
||||||
deps.save(db).await?;
|
deps.save(db).await?;
|
||||||
update_current_dependents(db, id, ¤t_dependencies).await?;
|
|
||||||
let mut errs = pkg_model
|
let mut errs = pkg_model
|
||||||
.clone()
|
.clone()
|
||||||
.status()
|
.status()
|
||||||
|
|||||||
@@ -649,7 +649,7 @@ pub async fn configure_logic(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(skip(db, current_dependencies))]
|
#[instrument(skip(db, current_dependencies))]
|
||||||
pub async fn update_current_dependents<
|
pub async fn add_current_dependents<
|
||||||
'a,
|
'a,
|
||||||
Db: DbHandle,
|
Db: DbHandle,
|
||||||
I: IntoIterator<Item = (&'a PackageId, &'a CurrentDependencyInfo)>,
|
I: IntoIterator<Item = (&'a PackageId, &'a CurrentDependencyInfo)>,
|
||||||
@@ -658,10 +658,7 @@ pub async fn update_current_dependents<
|
|||||||
dependent_id: &PackageId,
|
dependent_id: &PackageId,
|
||||||
current_dependencies: I,
|
current_dependencies: I,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
for (dependency, dep_info) in current_dependencies
|
for (dependency, dep_info) in current_dependencies {
|
||||||
.into_iter()
|
|
||||||
.filter(|(dependency, _)| dependency != &dependent_id)
|
|
||||||
{
|
|
||||||
if let Some(dependency_model) = crate::db::DatabaseModel::new()
|
if let Some(dependency_model) = crate::db::DatabaseModel::new()
|
||||||
.package_data()
|
.package_data()
|
||||||
.idx_model(&dependency)
|
.idx_model(&dependency)
|
||||||
@@ -745,6 +742,8 @@ pub async fn break_all_dependents_transitive<'a, Db: DbHandle>(
|
|||||||
.current_dependents()
|
.current_dependents()
|
||||||
.keys(db, true)
|
.keys(db, true)
|
||||||
.await?
|
.await?
|
||||||
|
.into_iter()
|
||||||
|
.filter(|dependent| id != dependent)
|
||||||
{
|
{
|
||||||
break_transitive(db, &dependent, id, error.clone(), breakages).await?;
|
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()
|
.current_dependents()
|
||||||
.keys(db, true)
|
.keys(db, true)
|
||||||
.await?
|
.await?
|
||||||
|
.into_iter()
|
||||||
|
.filter(|dependent| id != dependent)
|
||||||
{
|
{
|
||||||
heal_transitive(ctx, db, &dependent, id).await?;
|
heal_transitive(ctx, db, &dependent, id).await?;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -197,10 +197,10 @@ pub async fn cleanup_failed<Db: DbHandle>(
|
|||||||
#[instrument(skip(db, current_dependencies))]
|
#[instrument(skip(db, current_dependencies))]
|
||||||
pub async fn remove_current_dependents<'a, Db: DbHandle, I: IntoIterator<Item = &'a PackageId>>(
|
pub async fn remove_current_dependents<'a, Db: DbHandle, I: IntoIterator<Item = &'a PackageId>>(
|
||||||
db: &mut Db,
|
db: &mut Db,
|
||||||
id: &PackageId,
|
id: &'a PackageId,
|
||||||
current_dependencies: I,
|
current_dependencies: I,
|
||||||
) -> Result<(), Error> {
|
) -> 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()
|
if let Some(current_dependents) = crate::db::DatabaseModel::new()
|
||||||
.package_data()
|
.package_data()
|
||||||
.idx_model(dep)
|
.idx_model(dep)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ use tokio::process::Command;
|
|||||||
use tokio_stream::wrappers::ReadDirStream;
|
use tokio_stream::wrappers::ReadDirStream;
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
use self::cleanup::cleanup_failed;
|
use self::cleanup::{cleanup_failed, remove_current_dependents};
|
||||||
use crate::context::{CliContext, RpcContext};
|
use crate::context::{CliContext, RpcContext};
|
||||||
use crate::core::rpc_continuations::{RequestGuid, RpcContinuation};
|
use crate::core::rpc_continuations::{RequestGuid, RpcContinuation};
|
||||||
use crate::db::model::{
|
use crate::db::model::{
|
||||||
@@ -32,7 +32,7 @@ use crate::db::model::{
|
|||||||
};
|
};
|
||||||
use crate::db::util::WithRevision;
|
use crate::db::util::WithRevision;
|
||||||
use crate::dependencies::{
|
use crate::dependencies::{
|
||||||
break_all_dependents_transitive, update_current_dependents, BreakageRes, DependencyError,
|
add_current_dependents, break_all_dependents_transitive, BreakageRes, DependencyError,
|
||||||
DependencyErrors,
|
DependencyErrors,
|
||||||
};
|
};
|
||||||
use crate::install::cleanup::{cleanup, update_dependents};
|
use crate::install::cleanup::{cleanup, update_dependents};
|
||||||
@@ -853,7 +853,6 @@ pub async fn install_s9pk<R: AsyncRead + AsyncSeek + Unpin>(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
update_current_dependents(&mut tx, pkg_id, ¤t_dependencies).await?;
|
|
||||||
let current_dependents = {
|
let current_dependents = {
|
||||||
// search required dependencies
|
// search required dependencies
|
||||||
let mut deps = BTreeMap::new();
|
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 = prev.status.main;
|
||||||
main_status.save(&mut tx).await?;
|
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(
|
update_dependents(
|
||||||
ctx,
|
ctx,
|
||||||
&mut tx,
|
&mut tx,
|
||||||
@@ -1023,6 +1024,7 @@ pub async fn install_s9pk<R: AsyncRead + AsyncSeek + Unpin>(
|
|||||||
&manifest.volumes,
|
&manifest.volumes,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
add_current_dependents(&mut tx, pkg_id, ¤t_dependencies).await?;
|
||||||
update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?;
|
update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?;
|
||||||
} else if let Some(recovered) = crate::db::DatabaseModel::new()
|
} else if let Some(recovered) = crate::db::DatabaseModel::new()
|
||||||
.recovered_packages()
|
.recovered_packages()
|
||||||
@@ -1032,8 +1034,10 @@ pub async fn install_s9pk<R: AsyncRead + AsyncSeek + Unpin>(
|
|||||||
.into_owned()
|
.into_owned()
|
||||||
{
|
{
|
||||||
handle_recovered_package(recovered, manifest, ctx, pkg_id, version, &mut tx).await?;
|
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?;
|
update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?;
|
||||||
} else {
|
} else {
|
||||||
|
add_current_dependents(&mut tx, pkg_id, ¤t_dependencies).await?;
|
||||||
update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?;
|
update_dependents(ctx, &mut tx, pkg_id, current_dependents.keys()).await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ pub async fn dry(
|
|||||||
.current_dependents()
|
.current_dependents()
|
||||||
.keys(&mut tx, true)
|
.keys(&mut tx, true)
|
||||||
.await?
|
.await?
|
||||||
|
.into_iter()
|
||||||
|
.filter(|dependent| &id != dependent)
|
||||||
{
|
{
|
||||||
let version_req = crate::db::DatabaseModel::new()
|
let version_req = crate::db::DatabaseModel::new()
|
||||||
.package_data()
|
.package_data()
|
||||||
|
|||||||
Reference in New Issue
Block a user