@@ -1459,6 +1459,25 @@ impl Repository {
14591459 }
14601460 }
14611461
1462+ /// Lookup a reference to one of the objects by id prefix in a repository.
1463+ pub fn find_object_by_prefix (
1464+ & self ,
1465+ prefix_hash : & str ,
1466+ kind : Option < ObjectType > ,
1467+ ) -> Result < Object < ' _ > , Error > {
1468+ let mut raw = ptr:: null_mut ( ) ;
1469+ unsafe {
1470+ try_call ! ( raw:: git_object_lookup_prefix(
1471+ & mut raw,
1472+ self . raw( ) ,
1473+ Oid :: from_str( prefix_hash) ?. raw( ) ,
1474+ prefix_hash. len( ) ,
1475+ kind
1476+ ) ) ;
1477+ Ok ( Binding :: from_raw ( raw) )
1478+ }
1479+ }
1480+
14621481 /// Create a new direct reference.
14631482 ///
14641483 /// This function will return an error if a reference already exists with
@@ -3692,6 +3711,17 @@ mod tests {
36923711 assert_eq ! ( repo. head( ) . unwrap( ) . target( ) . unwrap( ) , main_oid) ;
36933712 }
36943713
3714+ #[ test]
3715+ fn smoke_find_object_by_prefix ( ) {
3716+ let ( _td, repo) = crate :: test:: repo_init ( ) ;
3717+ let head = repo. head ( ) . unwrap ( ) . target ( ) . unwrap ( ) ;
3718+ let head = repo. find_commit ( head) . unwrap ( ) ;
3719+ let head_id = head. id ( ) ;
3720+ let head_prefix = & head_id. to_string ( ) [ ..7 ] ;
3721+ let obj = repo. find_object_by_prefix ( head_prefix, None ) . unwrap ( ) ;
3722+ assert_eq ! ( obj. id( ) , head_id) ;
3723+ }
3724+
36953725 /// create the following:
36963726 /// /---o4
36973727 /// /---o3
0 commit comments