@@ -189,7 +189,7 @@ impl RevertManager {
189189
190190 if let Some ( ref p) = point {
191191 // Save everything after this point to redo stack
192- for i in ( pos + 1 ) ..self . history . len ( ) {
192+ for i in ( ( pos + 1 ) ..self . history . len ( ) ) . rev ( ) {
193193 if let Some ( rp) = self . history . get ( i) . cloned ( ) {
194194 self . redo_stack . push ( rp) ;
195195 }
@@ -322,4 +322,56 @@ mod tests {
322322 // Verify can undo
323323 assert ! ( revert_manager. can_undo( ) ) ;
324324 }
325+
326+ #[ tokio:: test]
327+ async fn test_redo_after_revert_to_replays_checkpoints_in_order ( ) {
328+ let temp_dir = TempDir :: new ( ) . unwrap ( ) ;
329+ let data_dir = TempDir :: new ( ) . unwrap ( ) ;
330+
331+ let snapshot_manager = SnapshotManager :: new ( temp_dir. path ( ) , data_dir. path ( ) ) ;
332+ let mut revert_manager = RevertManager :: new ( snapshot_manager) ;
333+ let test_file = temp_dir. path ( ) . join ( "test.txt" ) ;
334+
335+ tokio:: fs:: write ( & test_file, "Version 1" ) . await . unwrap ( ) ;
336+ let cp1 = revert_manager. checkpoint ( Some ( "Version 1" ) ) . await . unwrap ( ) ;
337+
338+ tokio:: fs:: write ( & test_file, "Version 2" ) . await . unwrap ( ) ;
339+ let cp2 = revert_manager. checkpoint ( Some ( "Version 2" ) ) . await . unwrap ( ) ;
340+
341+ tokio:: fs:: write ( & test_file, "Version 3" ) . await . unwrap ( ) ;
342+ let cp3 = revert_manager. checkpoint ( Some ( "Version 3" ) ) . await . unwrap ( ) ;
343+
344+ tokio:: fs:: write ( & test_file, "Version 4" ) . await . unwrap ( ) ;
345+ let cp4 = revert_manager. checkpoint ( Some ( "Version 4" ) ) . await . unwrap ( ) ;
346+
347+ let reverted = revert_manager. revert_to ( & cp1. snapshot . id ) . await . unwrap ( ) ;
348+ assert_eq ! ( reverted. unwrap( ) . snapshot. id, cp1. snapshot. id) ;
349+ assert_eq ! (
350+ tokio:: fs:: read_to_string( & test_file) . await . unwrap( ) ,
351+ "Version 1"
352+ ) ;
353+
354+ let redone = revert_manager. redo ( ) . await . unwrap ( ) ;
355+ assert_eq ! ( redone. unwrap( ) . snapshot. id, cp2. snapshot. id) ;
356+ assert_eq ! (
357+ tokio:: fs:: read_to_string( & test_file) . await . unwrap( ) ,
358+ "Version 2"
359+ ) ;
360+
361+ let redone = revert_manager. redo ( ) . await . unwrap ( ) ;
362+ assert_eq ! ( redone. unwrap( ) . snapshot. id, cp3. snapshot. id) ;
363+ assert_eq ! (
364+ tokio:: fs:: read_to_string( & test_file) . await . unwrap( ) ,
365+ "Version 3"
366+ ) ;
367+
368+ let redone = revert_manager. redo ( ) . await . unwrap ( ) ;
369+ assert_eq ! ( redone. unwrap( ) . snapshot. id, cp4. snapshot. id) ;
370+ assert_eq ! (
371+ tokio:: fs:: read_to_string( & test_file) . await . unwrap( ) ,
372+ "Version 4"
373+ ) ;
374+
375+ assert ! ( revert_manager. redo( ) . await . unwrap( ) . is_none( ) ) ;
376+ }
325377}
0 commit comments