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 ef4bdd25..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, } @@ -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 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 { + sequence_number, + name, + }) } #[cfg(test)] @@ -79,8 +84,8 @@ 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.sequence_number, 1234567890); + assert_eq!(migration.name, "create_users"); } #[test] @@ -96,10 +101,25 @@ 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"); } + #[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.sequence_number, 201); + assert_eq!(migration.name, "a_migration"); + } + #[test] fn test_get_migration_not_timestamp_in_filename() { let migrations_dir = PathBuf::from("/tmp/migrations");