From 23a5340a2221fc0e4364dae285750f8b11509932 Mon Sep 17 00:00:00 2001 From: Josh Triplett Date: Tue, 10 May 2022 01:14:26 -0700 Subject: [PATCH 1/2] Add `Tree::get_name_bytes` to handle non-UTF-8 entry names --- src/tree.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/tree.rs b/src/tree.rs index 68af61e335..cac66198d1 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -176,6 +176,21 @@ impl<'repo> Tree<'repo> { } } + /// Lookup a tree entry by its filename, specified as bytes. + /// + /// This allows for non-UTF-8 filenames. + pub fn get_name_bytes(&self, filename: &[u8]) -> Option> { + let filename = CString::new(filename).unwrap(); + unsafe { + let ptr = call!(raw::git_tree_entry_byname(&*self.raw(), filename)); + if ptr.is_null() { + None + } else { + Some(entry_from_raw_const(ptr)) + } + } + } + /// Retrieve a tree entry contained in a tree or in any of its subtrees, /// given its relative path. pub fn get_path(&self, path: &Path) -> Result, Error> { @@ -510,6 +525,7 @@ mod tests { let e1 = tree.get(0).unwrap(); assert!(e1 == tree.get_id(e1.id()).unwrap()); assert!(e1 == tree.get_name("foo").unwrap()); + assert!(e1 == tree.get_name_bytes(b"foo").unwrap()); assert!(e1 == tree.get_path(Path::new("foo")).unwrap()); assert_eq!(e1.name(), Some("foo")); e1.to_object(&repo).unwrap(); From 6316180ebf57e517e62b389eba9706f887ff0284 Mon Sep 17 00:00:00 2001 From: Josh Triplett Date: Tue, 10 May 2022 09:15:56 -0700 Subject: [PATCH 2/2] Implement `Tree::get_name` using `Tree::get_name_bytes` to avoid duplication --- src/tree.rs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/tree.rs b/src/tree.rs index cac66198d1..3d6b290c52 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -165,15 +165,7 @@ impl<'repo> Tree<'repo> { /// Lookup a tree entry by its filename pub fn get_name(&self, filename: &str) -> Option> { - let filename = CString::new(filename).unwrap(); - unsafe { - let ptr = call!(raw::git_tree_entry_byname(&*self.raw(), filename)); - if ptr.is_null() { - None - } else { - Some(entry_from_raw_const(ptr)) - } - } + self.get_name_bytes(filename.as_bytes()) } /// Lookup a tree entry by its filename, specified as bytes.