From 4909aa0a29f317bd9a89805c5847fdfd898c3836 Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 20 Feb 2025 01:46:42 +0100 Subject: [PATCH] Don't migrate existing data dir without version number If there is a directory but no version number, we have no idea what's going on. If we continue the migration, we might overwrite or break some other program's data. --- gdn/src/data.rs | 6 ++++-- gdn/src/data/datadir.rs | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/gdn/src/data.rs b/gdn/src/data.rs index 29fcd14..a405bee 100644 --- a/gdn/src/data.rs +++ b/gdn/src/data.rs @@ -15,10 +15,12 @@ pub use self::{ fn migrate(dir: &LockedDataDir) -> anyhow::Result<()> { loop { - match dir.read_version()? { - 0 => v0::migrate(dir)?, + let version = dir.read_version().context("failed to migrate data dir")?; + match version { + 0 => v0::migrate(dir), _ => break Ok(()), } + .with_context(|| format!("failed to migrate data dir from version {version}"))?; } } diff --git a/gdn/src/data/datadir.rs b/gdn/src/data/datadir.rs index 6b23866..c4ee5bf 100644 --- a/gdn/src/data/datadir.rs +++ b/gdn/src/data/datadir.rs @@ -104,6 +104,7 @@ impl UnlockedDataDir { pub(super) fn read_version(&self) -> anyhow::Result { let path = self.version_file(); match self.read_string_optional(&path)? { + None if self.path.exists() => Err(anyhow!("found data dir without version number")), None => Ok(0), Some(string) => Ok(string.trim().parse().with_context(|| { format!("failed to parse {} as version number", path.display())