Skip to content

Commit c94d964

Browse files
committed
fix: support non timestamp but numeric migrations
1 parent e869302 commit c94d964

File tree

1 file changed

+30
-13
lines changed

1 file changed

+30
-13
lines changed

crates/pgt_workspace/src/workspace/server/migration.rs

+30-13
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,7 @@ pub(crate) fn get_migration(path: &Path, migrations_dir: &Path) -> Option<Migrat
3333
let root_migration = path
3434
.file_name()
3535
.and_then(|os_str| os_str.to_str())
36-
.and_then(|file_name| {
37-
let mut parts = file_name.splitn(2, '_');
38-
let timestamp = parts.next()?.parse().ok()?;
39-
let name = parts.next()?.to_string();
40-
Some(Migration { timestamp, name })
41-
});
36+
.and_then(parse_migration_name);
4237

4338
if root_migration.is_some() {
4439
return root_migration;
@@ -49,12 +44,19 @@ pub(crate) fn get_migration(path: &Path, migrations_dir: &Path) -> Option<Migrat
4944
path.parent()
5045
.and_then(|parent| parent.file_name())
5146
.and_then(|os_str| os_str.to_str())
52-
.and_then(|dir_name| {
53-
let mut parts = dir_name.splitn(2, '_');
54-
let timestamp = parts.next()?.parse().ok()?;
55-
let name = parts.next()?.to_string();
56-
Some(Migration { timestamp, name })
57-
})
47+
.and_then(parse_migration_name)
48+
}
49+
50+
fn parse_migration_name(name: &str) -> Option<Migration> {
51+
let mut parts = name.splitn(2, '_');
52+
// remove leading zeros to support numeric
53+
let timestamp: u64 = parts.next()?.trim_start_matches('0').parse().ok()?;
54+
let full_name = parts.next()?;
55+
let name = full_name
56+
.strip_suffix(".sql")
57+
.unwrap_or(full_name)
58+
.to_string();
59+
Some(Migration { timestamp, name })
5860
}
5961

6062
#[cfg(test)]
@@ -80,7 +82,7 @@ mod tests {
8082
assert!(migration.is_some());
8183
let migration = migration.unwrap();
8284
assert_eq!(migration.timestamp, 1234567890);
83-
assert_eq!(migration.name, "create_users.sql");
85+
assert_eq!(migration.name, "create_users");
8486
}
8587

8688
#[test]
@@ -100,6 +102,21 @@ mod tests {
100102
assert_eq!(migration.name, "create_users");
101103
}
102104

105+
#[test]
106+
fn test_get_migration_prefix_number() {
107+
let temp_dir = setup();
108+
let migrations_dir = temp_dir.path().to_path_buf();
109+
let path = migrations_dir.join("000201_a_migration.sql");
110+
fs::write(&path, "").unwrap();
111+
112+
let migration = get_migration(&path, &migrations_dir);
113+
114+
assert!(migration.is_some());
115+
let migration = migration.unwrap();
116+
assert_eq!(migration.timestamp, 201);
117+
assert_eq!(migration.name, "a_migration");
118+
}
119+
103120
#[test]
104121
fn test_get_migration_not_timestamp_in_filename() {
105122
let migrations_dir = PathBuf::from("/tmp/migrations");

0 commit comments

Comments
 (0)