@@ -361,6 +361,35 @@ impl<'repo> Reference<'repo> {
361361 Ok ( Binding :: from_raw ( raw) )
362362 }
363363 }
364+
365+ /// Create a new reference with the same name as the given reference but a
366+ /// different symbolic target. The reference must be a symbolic reference,
367+ /// otherwise this will fail.
368+ ///
369+ /// The new reference will be written to disk, overwriting the given
370+ /// reference.
371+ ///
372+ /// The target name will be checked for validity. See
373+ /// [`Repository::reference_symbolic`] for rules about valid names.
374+ ///
375+ /// The message for the reflog will be ignored if the reference does not
376+ /// belong in the standard set (HEAD, branches and remote-tracking
377+ /// branches) and it does not have a reflog.
378+ pub fn symbolic_set_target (
379+ & mut self ,
380+ target : & str ,
381+ reflog_msg : & str ,
382+ ) -> Result < Reference < ' repo > , Error > {
383+ let mut raw = ptr:: null_mut ( ) ;
384+ let target = CString :: new ( target) ?;
385+ let msg = CString :: new ( reflog_msg) ?;
386+ unsafe {
387+ try_call ! ( raw:: git_reference_symbolic_set_target(
388+ & mut raw, self . raw, target, msg
389+ ) ) ;
390+ Ok ( Binding :: from_raw ( raw) )
391+ }
392+ }
364393}
365394
366395impl < ' repo > PartialOrd for Reference < ' repo > {
@@ -512,6 +541,14 @@ mod tests {
512541 . reference_symbolic ( "refs/tags/tag1" , "refs/heads/main" , false , "test" )
513542 . unwrap ( ) ;
514543 assert_eq ! ( sym1. kind( ) . unwrap( ) , ReferenceType :: Symbolic ) ;
544+ let mut sym2 = repo
545+ . reference_symbolic ( "refs/tags/tag2" , "refs/heads/main" , false , "test" )
546+ . unwrap ( )
547+ . symbolic_set_target ( "refs/tags/tag1" , "test" )
548+ . unwrap ( ) ;
549+ assert_eq ! ( sym2. kind( ) . unwrap( ) , ReferenceType :: Symbolic ) ;
550+ assert_eq ! ( sym2. symbolic_target( ) . unwrap( ) , "refs/tags/tag1" ) ;
551+ sym2. delete ( ) . unwrap ( ) ;
515552 sym1. delete ( ) . unwrap ( ) ;
516553
517554 {
0 commit comments