diff --git a/gix-object/src/tree/ref_iter.rs b/gix-object/src/tree/ref_iter.rs index c18a0d5f532..510ae34b997 100644 --- a/gix-object/src/tree/ref_iter.rs +++ b/gix-object/src/tree/ref_iter.rs @@ -101,12 +101,15 @@ impl TryFrom for tree::EntryMode { fn try_from(mode: u32) -> Result { Ok(match mode { 0o40000 => tree::EntryMode::Tree, - 0o100644 => tree::EntryMode::Blob, - 0o100755 => tree::EntryMode::BlobExecutable, 0o120000 => tree::EntryMode::Link, 0o160000 => tree::EntryMode::Commit, - 0o100664 => tree::EntryMode::Blob, // rare and found in the linux kernel - 0o100640 => tree::EntryMode::Blob, // rare and found in the Rust repo + blob_mode if blob_mode & 0o100000 == 0o100000 => { + if blob_mode & 0o000100 == 0o000100 { + tree::EntryMode::BlobExecutable + } else { + tree::EntryMode::Blob + } + } _ => return Err(mode), }) } diff --git a/gix-object/tests/fixtures/tree/special-5.tree b/gix-object/tests/fixtures/tree/special-5.tree new file mode 100644 index 00000000000..67843b90078 Binary files /dev/null and b/gix-object/tests/fixtures/tree/special-5.tree differ diff --git a/gix-object/tests/tree/mod.rs b/gix-object/tests/tree/mod.rs index 27a6352a36a..e06984d77ea 100644 --- a/gix-object/tests/tree/mod.rs +++ b/gix-object/tests/tree/mod.rs @@ -135,6 +135,7 @@ mod from_bytes { ("special-2", 18), ("special-3", 5), ("special-4", 18), + ("special-5", 17), ] { let fixture = fixture_name("tree", &format!("{name}.tree")); assert_eq!(