@@ -489,6 +489,146 @@ url = \"git://example.org/repo3\"
489489 assert_eq ! ( vec![ "repo1" , "repo2" ] , affected) ;
490490}
491491
492+ #[ test]
493+ fn rename_tag ( ) {
494+ let starting_state = "[[repos]]
495+ path = \" repo1\"
496+ tags = [\" old_tag\" ]
497+
498+ [repos.remotes.origin]
499+ name = \" origin\"
500+ url = \" git://example.org/repo1\"
501+
502+ [[repos]]
503+ path = \" repo2\"
504+ tags = [\" old_tag\" , \" other\" ]
505+
506+ [repos.remotes.origin]
507+ name = \" origin\"
508+ url = \" git://example.org/repo2\"
509+
510+ [[repos]]
511+ path = \" repo3\"
512+ tags = [\" other\" ]
513+
514+ [repos.remotes.origin]
515+ name = \" origin\"
516+ url = \" git://example.org/repo3\" \
517+ ";
518+
519+ let expected_toml = "[[repos]]
520+ path = \" repo1\"
521+ tags = [\" new_tag\" ]
522+
523+ [repos.remotes.origin]
524+ name = \" origin\"
525+ url = \" git://example.org/repo1\"
526+
527+ [[repos]]
528+ path = \" repo2\"
529+ tags = [\" new_tag\" , \" other\" ]
530+
531+ [repos.remotes.origin]
532+ name = \" origin\"
533+ url = \" git://example.org/repo2\"
534+
535+ [[repos]]
536+ path = \" repo3\"
537+ tags = [\" other\" ]
538+
539+ [repos.remotes.origin]
540+ name = \" origin\"
541+ url = \" git://example.org/repo3\"
542+ " ;
543+
544+ let storage = FakeStorage :: new ( )
545+ . with_contents ( starting_state. to_string ( ) )
546+ . with_file_saved_callback ( |state| assert_eq ! ( expected_toml. to_owned( ) , state) )
547+ . boxed ( ) ;
548+
549+ let git = FakeGit :: new ( ) . boxed ( ) ;
550+ let mut gitopolis = Gitopolis :: new ( storage, git) ;
551+
552+ let affected = gitopolis
553+ . rename_tag ( "old_tag" , "new_tag" , false )
554+ . expect ( "Failed to rename tag" ) ;
555+
556+ assert_eq ! ( vec![ "repo1" , "repo2" ] , affected) ;
557+ }
558+
559+ #[ test]
560+ fn rename_tag_merge ( ) {
561+ let starting_state = "[[repos]]
562+ path = \" repo1\"
563+ tags = [\" old_tag\" ]
564+
565+ [repos.remotes.origin]
566+ name = \" origin\"
567+ url = \" git://example.org/repo1\"
568+
569+ [[repos]]
570+ path = \" repo2\"
571+ tags = [\" new_tag\" , \" old_tag\" ]
572+
573+ [repos.remotes.origin]
574+ name = \" origin\"
575+ url = \" git://example.org/repo2\" \
576+ ";
577+
578+ let expected_toml = "[[repos]]
579+ path = \" repo1\"
580+ tags = [\" new_tag\" ]
581+
582+ [repos.remotes.origin]
583+ name = \" origin\"
584+ url = \" git://example.org/repo1\"
585+
586+ [[repos]]
587+ path = \" repo2\"
588+ tags = [\" new_tag\" ]
589+
590+ [repos.remotes.origin]
591+ name = \" origin\"
592+ url = \" git://example.org/repo2\"
593+ " ;
594+
595+ let storage = FakeStorage :: new ( )
596+ . with_contents ( starting_state. to_string ( ) )
597+ . with_file_saved_callback ( |state| assert_eq ! ( expected_toml. to_owned( ) , state) )
598+ . boxed ( ) ;
599+
600+ let git = FakeGit :: new ( ) . boxed ( ) ;
601+ let mut gitopolis = Gitopolis :: new ( storage, git) ;
602+
603+ let affected = gitopolis
604+ . rename_tag ( "old_tag" , "new_tag" , true )
605+ . expect ( "Failed to rename tag with merge" ) ;
606+
607+ assert_eq ! ( vec![ "repo1" , "repo2" ] , affected) ;
608+ }
609+
610+ #[ test]
611+ fn rename_tag_conflict_without_merge ( ) {
612+ let starting_state = "[[repos]]
613+ path = \" repo1\"
614+ tags = [\" new_tag\" , \" old_tag\" ]
615+
616+ [repos.remotes.origin]
617+ name = \" origin\"
618+ url = \" git://example.org/repo1\" \
619+ ";
620+
621+ let storage = FakeStorage :: new ( )
622+ . with_contents ( starting_state. to_string ( ) )
623+ . boxed ( ) ;
624+
625+ let git = FakeGit :: new ( ) . boxed ( ) ;
626+ let mut gitopolis = Gitopolis :: new ( storage, git) ;
627+
628+ let result = gitopolis. rename_tag ( "old_tag" , "new_tag" , false ) ;
629+ assert ! ( result. is_err( ) ) ;
630+ }
631+
492632struct FakeStorage {
493633 exists : bool ,
494634 contents : String ,
0 commit comments