fix issues with legacy packages (#2841)

* fix issues with legacy packages

* include non-prerelease versions within compat range

* lock sdk to corresponding os prerelease

* bump sdk version

* fixes from PR review
This commit is contained in:
Aiden McClelland
2025-03-03 10:30:36 -07:00
committed by GitHub
parent 737beb11f6
commit 63bc71da13
15 changed files with 868 additions and 464 deletions

683
core/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -514,11 +514,17 @@ pub async fn cli_install(
#[command(rename_all = "kebab-case")]
pub struct UninstallParams {
id: PackageId,
#[arg(long, help = "Do not delete the service data")]
#[serde(default)]
soft: bool,
#[arg(long, help = "Ignore errors in service uninit script")]
#[serde(default)]
force: bool,
}
pub async fn uninstall(
ctx: RpcContext,
UninstallParams { id }: UninstallParams,
UninstallParams { id, soft, force }: UninstallParams,
) -> Result<PackageId, Error> {
ctx.db
.mutate(|db| {
@@ -540,7 +546,7 @@ pub async fn uninstall(
let return_id = id.clone();
tokio::spawn(async move {
if let Err(e) = ctx.services.uninstall(&ctx, &id).await {
if let Err(e) = ctx.services.uninstall(&ctx, &id, soft, force).await {
tracing::error!("Error uninstalling service {id}: {e}");
tracing::debug!("{e:?}");
}

View File

@@ -117,8 +117,11 @@ impl ServiceRef {
pub async fn uninstall(
self,
target_version: Option<models::VersionString>,
soft: bool,
force: bool,
) -> Result<(), Error> {
self.seed
let uninit_res = self
.seed
.persistent_container
.execute::<NoOutput>(
Guid::new(),
@@ -126,7 +129,12 @@ impl ServiceRef {
to_value(&target_version)?,
None,
) // TODO timeout
.await?;
.await;
if force {
uninit_res.log_err();
} else {
uninit_res?;
}
let id = self.seed.persistent_container.s9pk.as_manifest().id.clone();
let ctx = self.seed.ctx.clone();
self.shutdown().await?;
@@ -166,24 +174,26 @@ impl ServiceRef {
.await?
{
let state = pde.state_info.expect_removing()?;
for volume_id in &state.manifest.volumes {
let path = data_dir(DATA_DIR, &state.manifest.id, volume_id);
if tokio::fs::metadata(&path).await.is_ok() {
tokio::fs::remove_dir_all(&path).await?;
if !soft {
for volume_id in &state.manifest.volumes {
let path = data_dir(DATA_DIR, &state.manifest.id, volume_id);
if tokio::fs::metadata(&path).await.is_ok() {
tokio::fs::remove_dir_all(&path).await?;
}
}
let logs_dir = Path::new(PACKAGE_DATA)
.join("logs")
.join(&state.manifest.id);
if tokio::fs::metadata(&logs_dir).await.is_ok() {
tokio::fs::remove_dir_all(&logs_dir).await?;
}
let archive_path = Path::new(PACKAGE_DATA)
.join("archive")
.join("installed")
.join(&state.manifest.id);
if tokio::fs::metadata(&archive_path).await.is_ok() {
tokio::fs::remove_file(&archive_path).await?;
}
}
let logs_dir = Path::new(PACKAGE_DATA)
.join("logs")
.join(&state.manifest.id);
if tokio::fs::metadata(&logs_dir).await.is_ok() {
tokio::fs::remove_dir_all(&logs_dir).await?;
}
let archive_path = Path::new(PACKAGE_DATA)
.join("archive")
.join("installed")
.join(&state.manifest.id);
if tokio::fs::metadata(&archive_path).await.is_ok() {
tokio::fs::remove_file(&archive_path).await?;
}
}
}
@@ -397,7 +407,7 @@ impl Service {
tracing::debug!("{e:?}")
})
{
match service.uninstall(None).await {
match service.uninstall(None, false, false).await {
Err(e) => {
tracing::error!("Error uninstalling service: {e}");
tracing::debug!("{e:?}")

View File

@@ -286,7 +286,7 @@ impl ServiceMap {
.version
.clone();
service
.uninstall(Some(s9pk.as_manifest().version.clone()))
.uninstall(Some(s9pk.as_manifest().version.clone()), false, false)
.await?;
progress.complete();
Some(version)
@@ -321,12 +321,18 @@ impl ServiceMap {
/// This is ran during the cleanup, so when we are uninstalling the service
#[instrument(skip_all)]
pub async fn uninstall(&self, ctx: &RpcContext, id: &PackageId) -> Result<(), Error> {
pub async fn uninstall(
&self,
ctx: &RpcContext,
id: &PackageId,
soft: bool,
force: bool,
) -> Result<(), Error> {
let mut guard = self.get_mut(id).await;
if let Some(service) = guard.take() {
ServiceRefReloadGuard::new(ctx.clone(), id.clone(), "Uninstall")
.handle_last(async move {
let res = service.uninstall(None).await;
let res = service.uninstall(None, soft, force).await;
drop(guard);
res
})