| @@ -52,26 +52,38 @@ impl<'a> visit::Changes<'a> { · 51 unmodified lines |
| 52 | 52 | use std::cmp::Ordering::*; |
| 53 | 53 | match lhs.filename.cmp(rhs.filename) { |
| 54 | 54 | Equal => { |
| 55 | + use tree::EntryMode::*; |
| 55 | 56 | if lhs.oid != rhs.oid || lhs.mode != rhs.mode { |
| 56 | 57 | delegate.update_path_component( |
| 57 | 58 | PathComponent::new(lhs.filename, &mut path_id), |
| 58 | 59 | PathComponentUpdateMode::Replace, |
| 59 | 60 | ); |
| 60 | | − if delegate |
| 61 | | − .record(Change::Modification { |
| 61 | + let record_result = if (lhs.mode.is_no_tree() && rhs.mode.is_tree()) |
| 62 | + || (rhs.mode.is_tree() && rhs.mode.is_no_tree()) |
| 63 | + { |
| 64 | + delegate.record(Change::Deletion { |
| 65 | + entry_mode: lhs.mode, |
| 66 | + oid: lhs.oid.to_owned(), |
| 67 | + path_id, |
| 68 | + }) |
| 69 | + } else { |
| 70 | + delegate.record(Change::Modification { |
| 62 | 71 | previous_entry_mode: lhs.mode, |
| 63 | 72 | previous_oid: lhs.oid.to_owned(), |
| 64 | 73 | entry_mode: rhs.mode, |
| 65 | 74 | oid: rhs.oid.to_owned(), |
| 66 | 75 | path_id, |
| 67 | 76 | }) |
| 68 | | − .cancelled() |
| 69 | | − { |
| 77 | + }; |
| 78 | + if record_result.cancelled() { |
| 70 | 79 | break Err(Error::Cancelled); |
| 71 | 80 | } |
| 72 | 81 | } |
| 73 | | − if lhs.mode == tree::EntryMode::Tree || rhs.mode == tree::EntryMode::Tree { |
| 74 | | − todo!("handle recursion") |
| 82 | + match (lhs.mode, rhs.mode) { |
| 83 | + (Tree, Tree) => todo!("recurse tree|tree"), |
| 84 | + (lhs, Tree) if !lhs.is_tree() => todo!("recurse non-tree|tree"), |
| 85 | + (Tree, rhs) if !rhs.is_tree() => todo!("recurse tree|non-tree"), |
| 86 | + _both_are_not_trees => {} |
| 75 | 87 | } |
| 76 | 88 | } |
| 77 | 89 | Less => todo!("entry compares less - catch up"), |
| @@ -85,8 +97,8 @@ impl<'a> visit::Changes<'a> { · 7 unmodified lines |
| 85 | 97 | ); |
| 86 | 98 | if delegate |
| 87 | 99 | .record(Change::Deletion { |
| 88 | | − previous_entry_mode: lhs.mode, |
| 89 | | − previous_oid: lhs.oid.to_owned(), |
| 100 | + entry_mode: lhs.mode, |
| 101 | + oid: lhs.oid.to_owned(), |
| 90 | 102 | path_id, |
| 91 | 103 | }) |
| 92 | 104 | .cancelled() |