@@ -748,6 +748,106 @@ public void CanMergeIntoOrphanedBranch()
748748 }
749749 }
750750
751+
752+ [ Fact ]
753+ public void CanMergeTreeIntoSameTree ( )
754+ {
755+ string path = SandboxMergeTestRepo ( ) ;
756+ using ( var repo = new Repository ( path ) )
757+ {
758+ var master = repo . Branches [ "master" ] . Tip ;
759+
760+ var result = repo . ObjectDatabase . MergeCommits ( master , master , null ) ;
761+ Assert . Equal ( MergeTreeStatus . Succeeded , result . Status ) ;
762+ Assert . Equal ( 0 , result . Conflicts . Count ( ) ) ;
763+ }
764+ }
765+
766+ [ Fact ]
767+ public void CanMergeTreeIntoTreeFromUnbornBranch ( )
768+ {
769+ string path = SandboxMergeTestRepo ( ) ;
770+ using ( var repo = new Repository ( path ) )
771+ {
772+ repo . Refs . UpdateTarget ( "HEAD" , "refs/heads/unborn" ) ;
773+
774+ Touch ( repo . Info . WorkingDirectory , "README" , "Yeah!\n " ) ;
775+ repo . Index . Clear ( ) ;
776+ repo . Stage ( "README" ) ;
777+
778+ repo . Commit ( "A new world, free of the burden of the history" , Constants . Signature , Constants . Signature ) ;
779+
780+ var master = repo . Branches [ "master" ] . Tip ;
781+ var branch = repo . Branches [ "unborn" ] . Tip ;
782+
783+ var result = repo . ObjectDatabase . MergeCommits ( master , branch , null ) ;
784+ Assert . Equal ( MergeTreeStatus . Succeeded , result . Status ) ;
785+ Assert . NotNull ( result . Tree ) ;
786+ Assert . Equal ( 0 , result . Conflicts . Count ( ) ) ;
787+ }
788+ }
789+
790+ [ Fact ]
791+ public void CanMergeCommitsAndDetectConflicts ( )
792+ {
793+ string path = SandboxMergeTestRepo ( ) ;
794+ using ( var repo = new Repository ( path ) )
795+ {
796+ repo . Refs . UpdateTarget ( "HEAD" , "refs/heads/unborn" ) ;
797+
798+ repo . Index . Replace ( repo . Lookup < Commit > ( "conflicts" ) ) ;
799+
800+ repo . Commit ( "A conflicting world, free of the burden of the history" , Constants . Signature , Constants . Signature ) ;
801+
802+ var master = repo . Branches [ "master" ] . Tip ;
803+ var branch = repo . Branches [ "unborn" ] . Tip ;
804+
805+ var result = repo . ObjectDatabase . MergeCommits ( master , branch , null ) ;
806+ Assert . Equal ( MergeTreeStatus . Conflicts , result . Status ) ;
807+ Assert . Null ( result . Tree ) ;
808+ Assert . NotEqual ( 0 , result . Conflicts . Count ( ) ) ;
809+ }
810+ }
811+
812+ [ Fact ]
813+ public void CanMergeFastForwardTreeWithoutConflicts ( )
814+ {
815+ string path = SandboxMergeTestRepo ( ) ;
816+ using ( var repo = new Repository ( path ) )
817+ {
818+ var master = repo . Lookup < Commit > ( "master" ) ;
819+ var branch = repo . Lookup < Commit > ( "fast_forward" ) ;
820+
821+ var result = repo . ObjectDatabase . MergeCommits ( master , branch , null ) ;
822+ Assert . Equal ( MergeTreeStatus . Succeeded , result . Status ) ;
823+ Assert . NotNull ( result . Tree ) ;
824+ Assert . Equal ( 0 , result . Conflicts . Count ( ) ) ;
825+ }
826+ }
827+
828+ [ Fact ]
829+ public void CanIdentifyConflictsInMergeCommits ( )
830+ {
831+ string path = SandboxMergeTestRepo ( ) ;
832+ using ( var repo = new Repository ( path ) )
833+ {
834+ var master = repo . Lookup < Commit > ( "master" ) ;
835+ var branch = repo . Lookup < Commit > ( "conflicts" ) ;
836+
837+ var result = repo . ObjectDatabase . MergeCommits ( master , branch , null ) ;
838+
839+ Assert . Equal ( MergeTreeStatus . Conflicts , result . Status ) ;
840+
841+ Assert . Null ( result . Tree ) ;
842+ Assert . Equal ( 1 , result . Conflicts . Count ( ) ) ;
843+
844+ var conflict = result . Conflicts . First ( ) ;
845+ Assert . Equal ( new ObjectId ( "8e9daea300fbfef6c0da9744c6214f546d55b279" ) , conflict . Ancestor . Id ) ;
846+ Assert . Equal ( new ObjectId ( "610b16886ca829cebd2767d9196f3c4378fe60b5" ) , conflict . Ours . Id ) ;
847+ Assert . Equal ( new ObjectId ( "3dd9738af654bbf1c363f6c3bbc323bacdefa179" ) , conflict . Theirs . Id ) ;
848+ }
849+ }
850+
751851 private Commit AddFileCommitToRepo ( IRepository repository , string filename , string content = null )
752852 {
753853 Touch ( repository . Info . WorkingDirectory , filename , content ) ;
0 commit comments