From 917d17a7386ed70686c5289b2f8b591eb2eea769 Mon Sep 17 00:00:00 2001 From: astrid Date: Wed, 25 Feb 2026 21:09:45 +0100 Subject: [PATCH] fix: simplify meta stem to instance name + slugify + init-prefix Drop the strip_suffix(extension) approach for computing adjacent meta file names. Instead, use the instance name directly (slugified if it has invalid filesystem chars, prefixed with '_' if it's "init"). This is the same logic as the original code plus init-prefix handling, and correctly preserves dots in instance names like "Name.new". Co-Authored-By: Claude Opus 4.6 --- src/snapshot_middleware/csv.rs | 32 +++++++++++--------------------- src/snapshot_middleware/lua.rs | 32 +++++++++++--------------------- src/snapshot_middleware/txt.rs | 32 +++++++++++--------------------- 3 files changed, 33 insertions(+), 63 deletions(-) diff --git a/src/snapshot_middleware/csv.rs b/src/snapshot_middleware/csv.rs index b014b6ba..48288a5b 100644 --- a/src/snapshot_middleware/csv.rs +++ b/src/snapshot_middleware/csv.rs @@ -109,27 +109,17 @@ pub fn syncback_csv<'sync>( if !meta.is_empty() { let parent = snapshot.path.parent_err()?; - let meta_stem = snapshot.middleware - .and_then(|mw| { - let ext = format!(".{}", crate::syncback::extension_for_middleware(mw)); - snapshot.path.file_name() - .and_then(|n| n.to_str()) - .and_then(|s| s.strip_suffix(ext.as_str())) - .map(str::to_owned) - }) - .unwrap_or_else(|| { - let name = &new_inst.name; - let base = if crate::syncback::validate_file_name(name).is_err() { - crate::syncback::slugify_name(name) - } else { - name.clone() - }; - if base.to_lowercase() == "init" { - format!("_{base}") - } else { - base - } - }); + let instance_name = &new_inst.name; + let base = if crate::syncback::validate_file_name(instance_name).is_err() { + crate::syncback::slugify_name(instance_name) + } else { + instance_name.clone() + }; + let meta_stem = if base.to_lowercase() == "init" { + format!("_{base}") + } else { + base + }; fs_snapshot.add_file( parent.join(format!("{meta_stem}.meta.json")), serde_json::to_vec_pretty(&meta).context("cannot serialize metadata")?, diff --git a/src/snapshot_middleware/lua.rs b/src/snapshot_middleware/lua.rs index 06c6855f..560523b4 100644 --- a/src/snapshot_middleware/lua.rs +++ b/src/snapshot_middleware/lua.rs @@ -158,27 +158,17 @@ pub fn syncback_lua<'sync>( if !meta.is_empty() { let parent_location = snapshot.path.parent_err()?; - let meta_stem = snapshot.middleware - .and_then(|mw| { - let ext = format!(".{}", crate::syncback::extension_for_middleware(mw)); - snapshot.path.file_name() - .and_then(|n| n.to_str()) - .and_then(|s| s.strip_suffix(ext.as_str())) - .map(str::to_owned) - }) - .unwrap_or_else(|| { - let name = &snapshot.new_inst().name; - let base = if crate::syncback::validate_file_name(name).is_err() { - crate::syncback::slugify_name(name) - } else { - name.clone() - }; - if base.to_lowercase() == "init" { - format!("_{base}") - } else { - base - } - }); + let instance_name = &snapshot.new_inst().name; + let base = if crate::syncback::validate_file_name(instance_name).is_err() { + crate::syncback::slugify_name(instance_name) + } else { + instance_name.clone() + }; + let meta_stem = if base.to_lowercase() == "init" { + format!("_{base}") + } else { + base + }; fs_snapshot.add_file( parent_location.join(format!("{meta_stem}.meta.json")), serde_json::to_vec_pretty(&meta).context("cannot serialize metadata")?, diff --git a/src/snapshot_middleware/txt.rs b/src/snapshot_middleware/txt.rs index 9bb5dafa..5b024a14 100644 --- a/src/snapshot_middleware/txt.rs +++ b/src/snapshot_middleware/txt.rs @@ -58,27 +58,17 @@ pub fn syncback_txt<'sync>( if !meta.is_empty() { let parent = snapshot.path.parent_err()?; - let meta_stem = snapshot.middleware - .and_then(|mw| { - let ext = format!(".{}", crate::syncback::extension_for_middleware(mw)); - snapshot.path.file_name() - .and_then(|n| n.to_str()) - .and_then(|s| s.strip_suffix(ext.as_str())) - .map(str::to_owned) - }) - .unwrap_or_else(|| { - let name = &new_inst.name; - let base = if crate::syncback::validate_file_name(name).is_err() { - crate::syncback::slugify_name(name) - } else { - name.clone() - }; - if base.to_lowercase() == "init" { - format!("_{base}") - } else { - base - } - }); + let instance_name = &new_inst.name; + let base = if crate::syncback::validate_file_name(instance_name).is_err() { + crate::syncback::slugify_name(instance_name) + } else { + instance_name.clone() + }; + let meta_stem = if base.to_lowercase() == "init" { + format!("_{base}") + } else { + base + }; fs_snapshot.add_file( parent.join(format!("{meta_stem}.meta.json")), serde_json::to_vec_pretty(&meta).context("could not serialize metadata")?,