mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-04-04 06:19:44 +00:00
feat: improve service version migration and data version handling
Extract get_data_version into a shared function used by both effects and service_map. Use the actual data version (instead of the previous package version) when computing migration targets, and skip migrations when the target range is unsatisfiable. Also detect install vs update based on the presence of a data version file rather than load disposition alone.
This commit is contained in:
@@ -46,12 +46,14 @@ use crate::service::uninstall::cleanup;
|
||||
use crate::util::Never;
|
||||
use crate::util::actor::concurrent::ConcurrentActor;
|
||||
use crate::util::future::NonDetachingJoinHandle;
|
||||
use crate::util::io::{AsyncReadStream, AtomicFile, TermSize, delete_file};
|
||||
use crate::util::io::{
|
||||
AsyncReadStream, AtomicFile, TermSize, delete_file, maybe_read_file_to_string,
|
||||
};
|
||||
use crate::util::net::WebSocket;
|
||||
use crate::util::serde::Pem;
|
||||
use crate::util::sync::SyncMutex;
|
||||
use crate::util::tui::choose;
|
||||
use crate::volume::data_dir;
|
||||
use crate::volume::{PKG_VOLUME_DIR, data_dir};
|
||||
use crate::{ActionId, CAP_1_KiB, DATA_DIR, ImageId, PackageId};
|
||||
|
||||
pub mod action;
|
||||
@@ -81,6 +83,17 @@ pub enum LoadDisposition {
|
||||
Undo,
|
||||
}
|
||||
|
||||
/// Read the data version file for a service from disk.
|
||||
/// Returns `Ok(None)` if the file does not exist (fresh install).
|
||||
pub async fn get_data_version(id: &PackageId) -> Result<Option<String>, Error> {
|
||||
let path = Path::new(DATA_DIR)
|
||||
.join(PKG_VOLUME_DIR)
|
||||
.join(id)
|
||||
.join("data")
|
||||
.join(".version");
|
||||
maybe_read_file_to_string(&path).await
|
||||
}
|
||||
|
||||
struct RootCommand(pub String);
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize, Default, TS)]
|
||||
@@ -390,12 +403,17 @@ impl Service {
|
||||
tracing::error!("Error opening s9pk for install: {e}");
|
||||
tracing::debug!("{e:?}")
|
||||
}) {
|
||||
let init_kind = if get_data_version(id).await.ok().flatten().is_some() {
|
||||
InitKind::Update
|
||||
} else {
|
||||
InitKind::Install
|
||||
};
|
||||
if let Ok(service) = Self::install(
|
||||
ctx.clone(),
|
||||
s9pk,
|
||||
&s9pk_path,
|
||||
&None,
|
||||
InitKind::Install,
|
||||
init_kind,
|
||||
None::<Never>,
|
||||
None,
|
||||
)
|
||||
@@ -424,12 +442,17 @@ impl Service {
|
||||
tracing::error!("Error opening s9pk for update: {e}");
|
||||
tracing::debug!("{e:?}")
|
||||
}) {
|
||||
let init_kind = if get_data_version(id).await.ok().flatten().is_some() {
|
||||
InitKind::Update
|
||||
} else {
|
||||
InitKind::Install
|
||||
};
|
||||
if let Ok(service) = Self::install(
|
||||
ctx.clone(),
|
||||
s9pk,
|
||||
&s9pk_path,
|
||||
&None,
|
||||
InitKind::Update,
|
||||
init_kind,
|
||||
None::<Never>,
|
||||
None,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user