@@ -52,8 +52,8 @@ impl<'a> visit::Changes<'a> {
52
52
R : visit:: Record ,
53
53
{
54
54
state. clear ( ) ;
55
- let mut lhs_entries = self . 0 . take ( ) . unwrap_or_default ( ) ;
56
- let mut rhs_entries = other;
55
+ let mut lhs_entries = peekable ( self . 0 . take ( ) . unwrap_or_default ( ) ) ;
56
+ let mut rhs_entries = peekable ( other) ;
57
57
let mut avoid_popping_path: Option < ( ) > = None ;
58
58
59
59
loop {
@@ -65,16 +65,20 @@ impl<'a> visit::Changes<'a> {
65
65
match state. trees . pop_front ( ) {
66
66
Some ( ( None , Some ( rhs) ) ) => {
67
67
delegate. set_current_path ( rhs. parent_path_id . clone ( ) ) ;
68
- rhs_entries = locate ( & rhs. tree_id , & mut state. buf2 ) . ok_or ( Error :: NotFound ( rhs. tree_id ) ) ?;
68
+ rhs_entries =
69
+ peekable ( locate ( & rhs. tree_id , & mut state. buf2 ) . ok_or ( Error :: NotFound ( rhs. tree_id ) ) ?) ;
69
70
}
70
71
Some ( ( Some ( lhs) , Some ( rhs) ) ) => {
71
72
delegate. set_current_path ( lhs. parent_path_id . clone ( ) ) ;
72
- lhs_entries = locate ( & lhs. tree_id , & mut state. buf1 ) . ok_or ( Error :: NotFound ( lhs. tree_id ) ) ?;
73
- rhs_entries = locate ( & rhs. tree_id , & mut state. buf2 ) . ok_or ( Error :: NotFound ( rhs. tree_id ) ) ?;
73
+ lhs_entries =
74
+ peekable ( locate ( & lhs. tree_id , & mut state. buf1 ) . ok_or ( Error :: NotFound ( lhs. tree_id ) ) ?) ;
75
+ rhs_entries =
76
+ peekable ( locate ( & rhs. tree_id , & mut state. buf2 ) . ok_or ( Error :: NotFound ( rhs. tree_id ) ) ?) ;
74
77
}
75
78
Some ( ( Some ( lhs) , None ) ) => {
76
79
delegate. set_current_path ( lhs. parent_path_id . clone ( ) ) ;
77
- lhs_entries = locate ( & lhs. tree_id , & mut state. buf1 ) . ok_or ( Error :: NotFound ( lhs. tree_id ) ) ?;
80
+ lhs_entries =
81
+ peekable ( locate ( & lhs. tree_id , & mut state. buf1 ) . ok_or ( Error :: NotFound ( lhs. tree_id ) ) ?) ;
78
82
}
79
83
Some ( ( None , None ) ) => unreachable ! ( "BUG: it makes no sense to fill the stack with empties" ) ,
80
84
None => return Ok ( ( ) ) ,
@@ -89,9 +93,11 @@ impl<'a> visit::Changes<'a> {
89
93
Less => {
90
94
delete_entry_schedule_recursion ( lhs, & mut state. trees , delegate) ?;
91
95
' inner_less: loop {
92
- match lhs_entries. next ( ) . transpose ( ) ? {
93
- Some ( lhs) => match lhs. filename . cmp ( rhs. filename ) {
96
+ match lhs_entries. peek ( ) {
97
+ Some ( Ok ( lhs) ) => match lhs. filename . cmp ( rhs. filename ) {
94
98
Equal => {
99
+ let lhs =
100
+ lhs_entries. next ( ) . transpose ( ) ?. expect ( "the peeked item tobe present" ) ;
95
101
handle_lhs_and_rhs_with_equal_filenames (
96
102
lhs,
97
103
rhs,
@@ -101,15 +107,21 @@ impl<'a> visit::Changes<'a> {
101
107
break ' inner_less;
102
108
}
103
109
Less => {
110
+ let lhs =
111
+ lhs_entries. next ( ) . transpose ( ) ?. expect ( "the peeked item tobe present" ) ;
104
112
delegate. pop_path_component ( ) ;
105
113
delete_entry_schedule_recursion ( lhs, & mut state. trees , delegate) ?;
106
114
}
107
115
Greater => {
108
- todo ! ( "LESS -> GREATER - we overshot" )
116
+ delegate. pop_path_component ( ) ;
117
+ add_entry_schedule_recursion ( rhs, & mut state. trees , delegate) ?;
118
+ break ' inner_less;
109
119
}
110
120
} ,
121
+ Some ( Err ( err) ) => return Err ( Error :: EntriesDecode ( err. to_owned ( ) ) ) ,
111
122
None => {
112
- break ' inner_less;
123
+ todo ! ( "LESS: depleted lhs" ) ;
124
+ // break 'inner_less;
113
125
}
114
126
}
115
127
}
@@ -320,3 +332,7 @@ fn handle_lhs_and_rhs_with_equal_filenames<R: visit::Record>(
320
332
} ;
321
333
Ok ( ( ) )
322
334
}
335
+
336
+ fn peekable < I : Iterator > ( iter : I ) -> std:: mem:: ManuallyDrop < std:: iter:: Peekable < I > > {
337
+ std:: mem:: ManuallyDrop :: new ( iter. peekable ( ) )
338
+ }
0 commit comments