Showing the changes to git-diff/src (1 of 1 file). Show all
Unified · Split
| @@ -90,43 +90,7 @@ impl<'a> visit::Changes<'a> { · 89 unmodified lines | |||
| 90 | let (lhs, rhs) = (lhs?, rhs?); | 90 | let (lhs, rhs) = (lhs?, rhs?); |
| 91 | match lhs.filename.cmp(rhs.filename) { | 91 | match lhs.filename.cmp(rhs.filename) { |
| 92 | Equal => handle_lhs_and_rhs_with_equal_filenames(lhs, rhs, &mut state.trees, delegate)?, | 92 | Equal => handle_lhs_and_rhs_with_equal_filenames(lhs, rhs, &mut state.trees, delegate)?, |
| 93 | Less => { | 93 | Less => catchup_lhs_with_rhs(&mut lhs_entries, lhs, rhs, &mut state.trees, delegate)?, |
| 94 | delete_entry_schedule_recursion(lhs, &mut state.trees, delegate)?; | ||
| 95 | 'inner_less: loop { | ||
| 96 | match lhs_entries.peek() { | ||
| 97 | Some(Ok(lhs)) => match lhs.filename.cmp(rhs.filename) { | ||
| 98 | Equal => { | ||
| 99 | let lhs = | ||
| 100 | lhs_entries.next().transpose()?.expect("the peeked item tobe present"); | ||
| 101 | handle_lhs_and_rhs_with_equal_filenames( | ||
| 102 | lhs, | ||
| 103 | rhs, | ||
| 104 | &mut state.trees, | ||
| 105 | delegate, | ||
| 106 | )?; | ||
| 107 | break 'inner_less; | ||
| 108 | } | ||
| 109 | Less => { | ||
| 110 | let lhs = | ||
| 111 | lhs_entries.next().transpose()?.expect("the peeked item tobe present"); | ||
| 112 | delegate.pop_path_component(); | ||
| 113 | delete_entry_schedule_recursion(lhs, &mut state.trees, delegate)?; | ||
| 114 | } | ||
| 115 | Greater => { | ||
| 116 | delegate.pop_path_component(); | ||
| 117 | add_entry_schedule_recursion(rhs, &mut state.trees, delegate)?; | ||
| 118 | break 'inner_less; | ||
| 119 | } | ||
| 120 | }, | ||
| 121 | Some(Err(err)) => return Err(Error::EntriesDecode(err.to_owned())), | ||
| 122 | None => { | ||
| 123 | delegate.pop_path_component(); | ||
| 124 | add_entry_schedule_recursion(rhs, &mut state.trees, delegate)?; | ||
| 125 | break 'inner_less; | ||
| 126 | } | ||
| 127 | } | ||
| 128 | } | ||
| 129 | } | ||
| 130 | Greater => { | 94 | Greater => { |
| 131 | add_entry_schedule_recursion(rhs, &mut state.trees, delegate)?; | 95 | add_entry_schedule_recursion(rhs, &mut state.trees, delegate)?; |
| 132 | 'inner_greater: loop { | 96 | 'inner_greater: loop { |
| @@ -237,6 +201,45 @@ fn add_entry_schedule_recursion<R: visit::Record>( · 104 unmodified lines | |||
| 237 | Ok(()) | 201 | Ok(()) |
| 238 | } | 202 | } |
| 239 | 203 | ||
| 204 | fn catchup_lhs_with_rhs<R: visit::Record>( | ||
| 205 | lhs_entries: &mut IteratorType<immutable::TreeIter<'_>>, | ||
| 206 | lhs: immutable::tree::Entry<'_>, | ||
| 207 | rhs: immutable::tree::Entry<'_>, | ||
| 208 | queue: &mut VecDeque<TreeInfoPair<R::PathId>>, | ||
| 209 | delegate: &mut R, | ||
| 210 | ) -> Result<(), Error> { | ||
| 211 | use std::cmp::Ordering::*; | ||
| 212 | delete_entry_schedule_recursion(lhs, queue, delegate)?; | ||
| 213 | loop { | ||
| 214 | match lhs_entries.peek() { | ||
| 215 | Some(Ok(lhs)) => match lhs.filename.cmp(rhs.filename) { | ||
| 216 | Equal => { | ||
| 217 | let lhs = lhs_entries.next().expect("the peeked item to be present")?; | ||
| 218 | handle_lhs_and_rhs_with_equal_filenames(lhs, rhs, queue, delegate)?; | ||
| 219 | break; | ||
| 220 | } | ||
| 221 | Less => { | ||
| 222 | let lhs = lhs_entries.next().expect("the peeked item to be present")?; | ||
| 223 | delegate.pop_path_component(); | ||
| 224 | delete_entry_schedule_recursion(lhs, queue, delegate)?; | ||
| 225 | } | ||
| 226 | Greater => { | ||
| 227 | delegate.pop_path_component(); | ||
| 228 | add_entry_schedule_recursion(rhs, queue, delegate)?; | ||
| 229 | break; | ||
| 230 | } | ||
| 231 | }, | ||
| 232 | Some(Err(err)) => return Err(Error::EntriesDecode(err.to_owned())), | ||
| 233 | None => { | ||
| 234 | delegate.pop_path_component(); | ||
| 235 | add_entry_schedule_recursion(rhs, queue, delegate)?; | ||
| 236 | break; | ||
| 237 | } | ||
| 238 | } | ||
| 239 | } | ||
| 240 | Ok(()) | ||
| 241 | } | ||
| 242 | |||
| 240 | fn handle_lhs_and_rhs_with_equal_filenames<R: visit::Record>( | 243 | fn handle_lhs_and_rhs_with_equal_filenames<R: visit::Record>( |
| 241 | lhs: immutable::tree::Entry<'_>, | 244 | lhs: immutable::tree::Entry<'_>, |
| 242 | rhs: immutable::tree::Entry<'_>, | 245 | rhs: immutable::tree::Entry<'_>, |
| @@ -346,6 +349,8 @@ fn handle_lhs_and_rhs_with_equal_filenames<R: visit::Record>( · 103 unmodified lines | |||
| 346 | Ok(()) | 349 | Ok(()) |
| 347 | } | 350 | } |
| 348 | 351 | ||
| 349 | fn peekable<I: Iterator>(iter: I) -> std::mem::ManuallyDrop<std::iter::Peekable<I>> { | 352 | type IteratorType<I> = std::mem::ManuallyDrop<std::iter::Peekable<I>>; |
| 353 | |||
| 354 | fn peekable<I: Iterator>(iter: I) -> IteratorType<I> { | ||
| 350 | std::mem::ManuallyDrop::new(iter.peekable()) | 355 | std::mem::ManuallyDrop::new(iter.peekable()) |
| 351 | } | 356 | } |