@@ -289,6 +289,8 @@ pub fn visualize_tree(tree_id: gix::Id<'_>) -> termtree::Tree<String> {
289289 visualize_tree ( tree_id. object ( ) . unwrap ( ) . peel_to_tree ( ) . unwrap ( ) . id ( ) , None ) . unwrap ( )
290290}
291291
292+ const FILETYPE_MASK : u32 = 0o170000 ;
293+
292294/// Visualize a tree on disk with mode information.
293295/// For convenience, skip `.git` and don't display the root.
294296///
@@ -304,20 +306,22 @@ pub fn visualize_tree(tree_id: gix::Id<'_>) -> termtree::Tree<String> {
304306pub fn visualize_disk_tree_skip_dot_git ( root : & Path ) -> anyhow:: Result < termtree:: Tree < String > > {
305307 use std:: os:: unix:: fs:: MetadataExt ;
306308 fn normalize_mode ( mode : u32 ) -> u32 {
307- match mode {
308- 0o40777 => 0o40755 ,
309- 0o40775 => 0o40755 ,
310- 0o10664 => 0o10644 ,
311- 0o10666 => 0o10644 ,
312- 0o100664 => 0o100644 ,
313- 0o100666 => 0o100644 ,
314- 0o100775 => 0o100755 ,
315- 0o100777 => 0o100755 ,
316- 0o120775 => 0o120755 ,
317- 0o120777 => 0o120755 ,
318- other => other,
309+ let normalize_permission_bits = |mode : u32 | if mode & 0o100 == 0 { 0o644 } else { 0o755 } ;
310+
311+ match mode & FILETYPE_MASK {
312+ // File types Git cares about
313+ directory @ 0o40000 => directory | normalize_permission_bits ( mode) ,
314+ symlink @ 0o120000 => symlink | normalize_permission_bits ( mode) ,
315+ regular_file @ 0o100000 => regular_file | normalize_permission_bits ( mode) ,
316+
317+ // File types Git does not care about. These may still appear in the worktree.
318+ // Note: Add more file types here if needed (e.g. socket, block device, etc)
319+ fifo @ 0o10000 => fifo | normalize_permission_bits ( mode) ,
320+
321+ _ => panic ! ( "Unhandled file mode {mode}" ) ,
319322 }
320323 }
324+
321325 fn label ( p : & Path , md : & std:: fs:: Metadata ) -> String {
322326 format ! (
323327 "{name}:{mode:o}" ,
0 commit comments