@@ -52,26 +52,38 @@ impl<'a> visit::Changes<'a> {
5252 use std:: cmp:: Ordering :: * ;
5353 match lhs. filename . cmp ( rhs. filename ) {
5454 Equal => {
55+ use tree:: EntryMode :: * ;
5556 if lhs. oid != rhs. oid || lhs. mode != rhs. mode {
5657 delegate. update_path_component (
5758 PathComponent :: new ( lhs. filename , & mut path_id) ,
5859 PathComponentUpdateMode :: Replace ,
5960 ) ;
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 {
6271 previous_entry_mode : lhs. mode ,
6372 previous_oid : lhs. oid . to_owned ( ) ,
6473 entry_mode : rhs. mode ,
6574 oid : rhs. oid . to_owned ( ) ,
6675 path_id,
6776 } )
68- . cancelled ( )
69- {
77+ } ;
78+ if record_result . cancelled ( ) {
7079 break Err ( Error :: Cancelled ) ;
7180 }
7281 }
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 => { }
7587 }
7688 }
7789 Less => todo ! ( "entry compares less - catch up" ) ,
@@ -85,8 +97,8 @@ impl<'a> visit::Changes<'a> {
8597 ) ;
8698 if delegate
8799 . 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 ( ) ,
90102 path_id,
91103 } )
92104 . cancelled ( )
0 commit comments