@@ -1963,6 +1963,20 @@ impl Repository {
1963
1963
}
1964
1964
}
1965
1965
1966
+ /// Lookup a tag object by prefix hash from the repository.
1967
+ pub fn find_tag_by_prefix ( & self , prefix_hash : & str ) -> Result < Tag < ' _ > , Error > {
1968
+ let mut raw = ptr:: null_mut ( ) ;
1969
+ unsafe {
1970
+ try_call ! ( raw:: git_tag_lookup_prefix(
1971
+ & mut raw,
1972
+ self . raw,
1973
+ Oid :: from_str( prefix_hash) ?. raw( ) ,
1974
+ prefix_hash. len( )
1975
+ ) ) ;
1976
+ Ok ( Binding :: from_raw ( raw) )
1977
+ }
1978
+ }
1979
+
1966
1980
/// Delete an existing tag reference.
1967
1981
///
1968
1982
/// The tag name will be checked for validity, see `tag` for some rules
@@ -4237,4 +4251,26 @@ Committer Name <committer.proper@email> <committer@email>"#,
4237
4251
assert_eq ! ( mm_resolve_author. email( ) , mailmapped_author. email( ) ) ;
4238
4252
assert_eq ! ( mm_resolve_committer. email( ) , mailmapped_committer. email( ) ) ;
4239
4253
}
4254
+
4255
+ #[ test]
4256
+ fn smoke_find_tag_by_prefix ( ) {
4257
+ let ( _td, repo) = crate :: test:: repo_init ( ) ;
4258
+ let head = repo. head ( ) . unwrap ( ) ;
4259
+ let tag_oid = repo
4260
+ . tag (
4261
+ "tag" ,
4262
+ & repo
4263
+ . find_object ( head. peel_to_commit ( ) . unwrap ( ) . id ( ) , None )
4264
+ . unwrap ( ) ,
4265
+ & repo. signature ( ) . unwrap ( ) ,
4266
+ "message" ,
4267
+ false ,
4268
+ )
4269
+ . unwrap ( ) ;
4270
+ let tag = repo. find_tag ( tag_oid) . unwrap ( ) ;
4271
+ let found_tag = repo
4272
+ . find_tag_by_prefix ( & tag. id ( ) . to_string ( ) [ 0 ..7 ] )
4273
+ . unwrap ( ) ;
4274
+ assert_eq ! ( tag. id( ) , found_tag. id( ) ) ;
4275
+ }
4240
4276
}
0 commit comments