@@ -33,12 +33,7 @@ pub(crate) fn get_migration(path: &Path, migrations_dir: &Path) -> Option<Migrat
33
33
let root_migration = path
34
34
. file_name ( )
35
35
. 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) ;
42
37
43
38
if root_migration. is_some ( ) {
44
39
return root_migration;
@@ -49,12 +44,19 @@ pub(crate) fn get_migration(path: &Path, migrations_dir: &Path) -> Option<Migrat
49
44
path. parent ( )
50
45
. and_then ( |parent| parent. file_name ( ) )
51
46
. 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 } )
58
60
}
59
61
60
62
#[ cfg( test) ]
@@ -80,7 +82,7 @@ mod tests {
80
82
assert ! ( migration. is_some( ) ) ;
81
83
let migration = migration. unwrap ( ) ;
82
84
assert_eq ! ( migration. timestamp, 1234567890 ) ;
83
- assert_eq ! ( migration. name, "create_users.sql " ) ;
85
+ assert_eq ! ( migration. name, "create_users" ) ;
84
86
}
85
87
86
88
#[ test]
@@ -100,6 +102,21 @@ mod tests {
100
102
assert_eq ! ( migration. name, "create_users" ) ;
101
103
}
102
104
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
+
103
120
#[ test]
104
121
fn test_get_migration_not_timestamp_in_filename ( ) {
105
122
let migrations_dir = PathBuf :: from ( "/tmp/migrations" ) ;
0 commit comments