@@ -1459,6 +1459,25 @@ impl Repository {
1459
1459
}
1460
1460
}
1461
1461
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
+
1462
1481
/// Create a new direct reference.
1463
1482
///
1464
1483
/// This function will return an error if a reference already exists with
@@ -3692,6 +3711,17 @@ mod tests {
3692
3711
assert_eq ! ( repo. head( ) . unwrap( ) . target( ) . unwrap( ) , main_oid) ;
3693
3712
}
3694
3713
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
+
3695
3725
/// create the following:
3696
3726
/// /---o4
3697
3727
/// /---o3
0 commit comments