11use  gix:: bstr:: { BString ,  ByteSlice } ; 
2+ use  gix:: objs:: tree:: EntryMode ; 
3+ use  gix:: prelude:: ObjectIdExt ; 
24
35pub  fn  tree ( 
4-     repo :  gix:: Repository , 
6+     mut   repo :  gix:: Repository , 
57    out :  & mut  dyn  std:: io:: Write , 
68    old_treeish :  BString , 
79    new_treeish :  BString , 
810)  -> anyhow:: Result < ( ) >  { 
11+     repo. object_cache_size_if_unset ( repo. compute_object_cache_size_for_tree_diffs ( & * * repo. index_or_empty ( ) ?) ) ; 
12+ 
913    let  old_tree_id = repo. rev_parse_single ( old_treeish. as_bstr ( ) ) ?; 
1014    let  new_tree_id = repo. rev_parse_single ( new_treeish. as_bstr ( ) ) ?; 
1115
12-     let  old_tree = old_tree_id. object ( ) ?. peel_to_kind ( gix :: object :: Kind :: Tree ) ? . into_tree ( ) ; 
13-     let  new_tree = new_tree_id. object ( ) ?. peel_to_kind ( gix :: object :: Kind :: Tree ) ? . into_tree ( ) ; 
16+     let  old_tree = old_tree_id. object ( ) ?. peel_to_tree ( ) ? ; 
17+     let  new_tree = new_tree_id. object ( ) ?. peel_to_tree ( ) ? ; 
1418
1519    let  changes = repo. diff_tree_to_tree ( & old_tree,  & new_tree,  None ) ?; 
1620
1721    writeln ! ( 
1822        out, 
19-         "Diffing trees `{old_treeish}` ({old_tree_id}) -> `{new_treeish}` ({new_tree_id})" 
23+         "Diffing trees `{old_treeish}` ({old_tree_id}) -> `{new_treeish}` ({new_tree_id})\n " 
2024    ) ?; 
21-     writeln ! ( out) ?; 
22- 
23-     write_changes ( out,  changes) ?; 
25+     write_changes ( & repo,  out,  changes) ?; 
2426
2527    Ok ( ( ) ) 
2628} 
2729
2830fn  write_changes ( 
31+     repo :  & gix:: Repository , 
2932    mut  out :  impl  std:: io:: Write , 
3033    changes :  Vec < gix:: diff:: tree_with_rewrites:: Change > , 
3134)  -> Result < ( ) ,  std:: io:: Error >  { 
@@ -37,8 +40,8 @@ fn write_changes(
3740                entry_mode, 
3841                ..
3942            }  => { 
40-                 writeln ! ( out,  "A: {location}"  ) ?; 
41-                 writeln ! ( out,  "  {id}"  ) ?; 
43+                 writeln ! ( out,  "A: {}"  ,  typed_location ( location ,  entry_mode ) ) ?; 
44+                 writeln ! ( out,  "  {}"  ,  id . attach ( repo ) . shorten_or_id ( ) ) ?; 
4245                writeln ! ( out,  "  -> {:o}" ,  entry_mode. 0 ) ?; 
4346            } 
4447            gix:: diff:: tree_with_rewrites:: Change :: Deletion  { 
@@ -47,8 +50,8 @@ fn write_changes(
4750                entry_mode, 
4851                ..
4952            }  => { 
50-                 writeln ! ( out,  "D: {location}"  ) ?; 
51-                 writeln ! ( out,  "  {id}"  ) ?; 
53+                 writeln ! ( out,  "D: {}"  ,  typed_location ( location ,  entry_mode ) ) ?; 
54+                 writeln ! ( out,  "  {}"  ,  id . attach ( repo ) . shorten_or_id ( ) ) ?; 
5255                writeln ! ( out,  "  {:o} ->" ,  entry_mode. 0 ) ?; 
5356            } 
5457            gix:: diff:: tree_with_rewrites:: Change :: Modification  { 
@@ -58,9 +61,16 @@ fn write_changes(
5861                previous_entry_mode, 
5962                entry_mode, 
6063            }  => { 
61-                 writeln ! ( out,  "M: {location}" ) ?; 
62-                 writeln ! ( out,  "  {previous_id} -> {id}" ) ?; 
63-                 writeln ! ( out,  "  {:o} -> {:o}" ,  previous_entry_mode. 0 ,  entry_mode. 0 ) ?; 
64+                 writeln ! ( out,  "M: {}" ,  typed_location( location,  entry_mode) ) ?; 
65+                 writeln ! ( 
66+                     out, 
67+                     "  {previous_id} -> {id}" , 
68+                     previous_id = previous_id. attach( repo) . shorten_or_id( ) , 
69+                     id = id. attach( repo) . shorten_or_id( ) 
70+                 ) ?; 
71+                 if  previous_entry_mode != entry_mode { 
72+                     writeln ! ( out,  "  {:o} -> {:o}" ,  previous_entry_mode. 0 ,  entry_mode. 0 ) ?; 
73+                 } 
6474            } 
6575            gix:: diff:: tree_with_rewrites:: Change :: Rewrite  { 
6676                source_location, 
@@ -71,12 +81,31 @@ fn write_changes(
7181                entry_mode, 
7282                ..
7383            }  => { 
74-                 writeln ! ( out,  "R: {source_location} -> {location}" ) ?; 
75-                 writeln ! ( out,  "  {source_id} -> {id}" ) ?; 
76-                 writeln ! ( out,  "  {:o} -> {:o}" ,  source_entry_mode. 0 ,  entry_mode. 0 ) ?; 
84+                 writeln ! ( 
85+                     out, 
86+                     "R: {source} -> {dest}" , 
87+                     source = typed_location( source_location,  source_entry_mode) , 
88+                     dest = typed_location( location,  entry_mode) 
89+                 ) ?; 
90+                 writeln ! ( 
91+                     out, 
92+                     "  {source_id} -> {id}" , 
93+                     source_id = source_id. attach( repo) . shorten_or_id( ) , 
94+                     id = id. attach( repo) . shorten_or_id( ) 
95+                 ) ?; 
96+                 if  source_entry_mode != entry_mode { 
97+                     writeln ! ( out,  "  {:o} -> {:o}" ,  source_entry_mode. 0 ,  entry_mode. 0 ) ?; 
98+                 } 
7799            } 
78100        } ; 
79101    } 
80102
81103    Ok ( ( ) ) 
82104} 
105+ 
106+ fn  typed_location ( mut  location :  BString ,  mode :  EntryMode )  -> BString  { 
107+     if  mode. is_tree ( )  { 
108+         location. push ( b'/' ) ; 
109+     } 
110+     location
111+ } 
0 commit comments