use std::path::Path;
pub fn migrate_path(old: &Path, new: &Path) {
if new.exists() || !old.exists() {
return;
}
if let Some(parent) = new.parent() {
let _ = std::fs::create_dir_all(parent);
}
let _ = std::fs::rename(old, new);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn migrate_path_renames_directory_with_contents() {
let tmp = tempfile::tempdir().unwrap();
let old = tmp.path().join("signal-tui");
let new = tmp.path().join("siggy");
std::fs::create_dir(&old).unwrap();
std::fs::write(old.join("siggy.db"), b"payload").unwrap();
migrate_path(&old, &new);
assert!(!old.exists(), "old dir should be gone after rename");
assert!(new.exists(), "new dir should exist after rename");
assert_eq!(
std::fs::read(new.join("siggy.db")).unwrap(),
b"payload",
"directory contents should survive the rename"
);
}
#[test]
fn migrate_path_renames_single_file() {
let tmp = tempfile::tempdir().unwrap();
let old = tmp.path().join("signal-tui.db");
let new = tmp.path().join("siggy.db");
std::fs::write(&old, b"sqlite-bytes").unwrap();
migrate_path(&old, &new);
assert!(!old.exists());
assert!(new.exists());
assert_eq!(std::fs::read(&new).unwrap(), b"sqlite-bytes");
}
#[test]
fn migrate_path_noops_when_new_dir_already_exists() {
let tmp = tempfile::tempdir().unwrap();
let old = tmp.path().join("signal-tui");
let new = tmp.path().join("siggy");
std::fs::create_dir(&old).unwrap();
std::fs::write(old.join("marker"), b"old").unwrap();
std::fs::create_dir(&new).unwrap();
std::fs::write(new.join("marker"), b"new").unwrap();
migrate_path(&old, &new);
assert!(old.exists(), "old dir should be left alone");
assert!(new.exists(), "new dir should be left alone");
assert_eq!(std::fs::read(new.join("marker")).unwrap(), b"new");
}
#[test]
fn migrate_path_noops_when_new_file_already_exists() {
let tmp = tempfile::tempdir().unwrap();
let old = tmp.path().join("signal-tui.db");
let new = tmp.path().join("siggy.db");
std::fs::write(&old, b"old").unwrap();
std::fs::write(&new, b"new").unwrap();
migrate_path(&old, &new);
assert_eq!(std::fs::read(&old).unwrap(), b"old");
assert_eq!(std::fs::read(&new).unwrap(), b"new");
}
#[test]
fn migrate_path_noops_when_old_missing() {
let tmp = tempfile::tempdir().unwrap();
let old = tmp.path().join("signal-tui");
let new = tmp.path().join("siggy");
migrate_path(&old, &new);
assert!(!old.exists());
assert!(!new.exists());
}
#[test]
fn migrate_path_creates_missing_parent_directory() {
let tmp = tempfile::tempdir().unwrap();
let old = tmp.path().join("signal-tui");
let new = tmp.path().join("nested").join("subdir").join("siggy");
std::fs::create_dir(&old).unwrap();
migrate_path(&old, &new);
assert!(!old.exists());
assert!(new.exists());
}
}