pub(super) fn parse_ls_tree_record(record: &[u8]) -> Option<String> {
let tab = record.iter().position(|b| *b == b'\t')?;
let mode = record[..tab].split(|b| *b == b' ').next()?;
if !mode.starts_with(b"100") {
return None;
}
Some(String::from_utf8_lossy(&record[tab + 1..]).into_owned())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ls_tree_record_keeps_regular_file_blobs() {
assert_eq!(
parse_ls_tree_record(
b"100644 blob d00491fd7e5bb6fa28c517a0bb32b8b506539d4d\tsrc/main file.rs"
),
Some("src/main file.rs".to_string()),
);
assert_eq!(
parse_ls_tree_record(
b"100755 blob d00491fd7e5bb6fa28c517a0bb32b8b506539d4d\tscripts/run.sh"
),
Some("scripts/run.sh".to_string()),
);
assert_eq!(
parse_ls_tree_record(
b"100664 blob d00491fd7e5bb6fa28c517a0bb32b8b506539d4d\tlegacy.rs"
),
Some("legacy.rs".to_string()),
);
}
#[test]
fn ls_tree_record_drops_symlinks_gitlinks_and_empty() {
assert_eq!(
parse_ls_tree_record(b"120000 blob d00491fd7e5bb6fa28c517a0bb32b8b506539d4d\tlink.rs"),
None,
);
assert_eq!(
parse_ls_tree_record(
b"160000 commit d00491fd7e5bb6fa28c517a0bb32b8b506539d4d\tvendor/dep"
),
None,
);
assert_eq!(parse_ls_tree_record(b""), None);
}
}