@@ -361,6 +361,35 @@ impl<'repo> Reference<'repo> {
361
361
Ok ( Binding :: from_raw ( raw) )
362
362
}
363
363
}
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
+ }
364
393
}
365
394
366
395
impl < ' repo > PartialOrd for Reference < ' repo > {
@@ -512,6 +541,14 @@ mod tests {
512
541
. reference_symbolic ( "refs/tags/tag1" , "refs/heads/main" , false , "test" )
513
542
. unwrap ( ) ;
514
543
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 ( ) ;
515
552
sym1. delete ( ) . unwrap ( ) ;
516
553
517
554
{
0 commit comments