From c94d964cc4ce5d17e05e67cca5bc9af8b1e00399 Mon Sep 17 00:00:00 2001 From: psteinroe Date: Fri, 4 Apr 2025 09:43:41 +0200 Subject: [PATCH 1/2] fix: support non timestamp but numeric migrations --- .../src/workspace/server/migration.rs | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/crates/pgt_workspace/src/workspace/server/migration.rs b/crates/pgt_workspace/src/workspace/server/migration.rs index ef4bdd25..0a115950 100644 --- a/crates/pgt_workspace/src/workspace/server/migration.rs +++ b/crates/pgt_workspace/src/workspace/server/migration.rs @@ -33,12 +33,7 @@ pub(crate) fn get_migration(path: &Path, migrations_dir: &Path) -> Option Option Option { + let mut parts = name.splitn(2, '_'); + // remove leading zeros to support numeric + let timestamp: u64 = parts.next()?.trim_start_matches('0').parse().ok()?; + let full_name = parts.next()?; + let name = full_name + .strip_suffix(".sql") + .unwrap_or(full_name) + .to_string(); + Some(Migration { timestamp, name }) } #[cfg(test)] @@ -80,7 +82,7 @@ mod tests { assert!(migration.is_some()); let migration = migration.unwrap(); assert_eq!(migration.timestamp, 1234567890); - assert_eq!(migration.name, "create_users.sql"); + assert_eq!(migration.name, "create_users"); } #[test] @@ -100,6 +102,21 @@ mod tests { assert_eq!(migration.name, "create_users"); } + #[test] + fn test_get_migration_prefix_number() { + let temp_dir = setup(); + let migrations_dir = temp_dir.path().to_path_buf(); + let path = migrations_dir.join("000201_a_migration.sql"); + fs::write(&path, "").unwrap(); + + let migration = get_migration(&path, &migrations_dir); + + assert!(migration.is_some()); + let migration = migration.unwrap(); + assert_eq!(migration.timestamp, 201); + assert_eq!(migration.name, "a_migration"); + } + #[test] fn test_get_migration_not_timestamp_in_filename() { let migrations_dir = PathBuf::from("/tmp/migrations"); From 9872ce1dfe9e6a82bf8afc96487a45bfea53a367 Mon Sep 17 00:00:00 2001 From: psteinroe Date: Fri, 4 Apr 2025 11:21:12 +0200 Subject: [PATCH 2/2] rename to sequence_number --- crates/pgt_workspace/src/workspace/server.rs | 2 +- .../src/workspace/server/migration.rs | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/crates/pgt_workspace/src/workspace/server.rs b/crates/pgt_workspace/src/workspace/server.rs index 032b92c6..8dcbfb1d 100644 --- a/crates/pgt_workspace/src/workspace/server.rs +++ b/crates/pgt_workspace/src/workspace/server.rs @@ -108,7 +108,7 @@ impl WorkspaceServer { let migrations_dir = migration_settings.path.as_ref()?; let migration = migration::get_migration(path, migrations_dir)?; - Some(&migration.timestamp <= ignore_before) + Some(&migration.sequence_number <= ignore_before) }) .unwrap_or(false) } diff --git a/crates/pgt_workspace/src/workspace/server/migration.rs b/crates/pgt_workspace/src/workspace/server/migration.rs index 0a115950..d8853727 100644 --- a/crates/pgt_workspace/src/workspace/server/migration.rs +++ b/crates/pgt_workspace/src/workspace/server/migration.rs @@ -2,7 +2,7 @@ use std::path::Path; #[derive(Debug)] pub(crate) struct Migration { - pub(crate) timestamp: u64, + pub(crate) sequence_number: u64, #[allow(unused)] pub(crate) name: String, } @@ -50,13 +50,16 @@ pub(crate) fn get_migration(path: &Path, migrations_dir: &Path) -> Option Option { let mut parts = name.splitn(2, '_'); // remove leading zeros to support numeric - let timestamp: u64 = parts.next()?.trim_start_matches('0').parse().ok()?; + let sequence_number: u64 = parts.next()?.trim_start_matches('0').parse().ok()?; let full_name = parts.next()?; let name = full_name .strip_suffix(".sql") .unwrap_or(full_name) .to_string(); - Some(Migration { timestamp, name }) + Some(Migration { + sequence_number, + name, + }) } #[cfg(test)] @@ -81,7 +84,7 @@ mod tests { assert!(migration.is_some()); let migration = migration.unwrap(); - assert_eq!(migration.timestamp, 1234567890); + assert_eq!(migration.sequence_number, 1234567890); assert_eq!(migration.name, "create_users"); } @@ -98,7 +101,7 @@ mod tests { assert!(migration.is_some()); let migration = migration.unwrap(); - assert_eq!(migration.timestamp, 1234567890); + assert_eq!(migration.sequence_number, 1234567890); assert_eq!(migration.name, "create_users"); } @@ -113,7 +116,7 @@ mod tests { assert!(migration.is_some()); let migration = migration.unwrap(); - assert_eq!(migration.timestamp, 201); + assert_eq!(migration.sequence_number, 201); assert_eq!(migration.name, "a_migration"); }