@@ -55,7 +55,7 @@ public void CanCompareACommitTreeAgainstItsParent()
5555 Assert . Equal ( 1 , changes . Count ( ) ) ;
5656 Assert . Equal ( 1 , changes . Added . Count ( ) ) ;
5757
58- TreeEntryChanges treeEntryChanges = changes [ "1.txt" ] ;
58+ TreeEntryChanges treeEntryChanges = changes [ "1.txt" ] . Single ( ) ;
5959 Assert . False ( treeEntryChanges . IsBinaryComparison ) ;
6060
6161 Assert . Equal ( "1.txt" , treeEntryChanges . Path ) ;
@@ -128,7 +128,7 @@ public void CanCompareACommitTreeAgainstATreeWithNoCommonAncestor()
128128
129129 Assert . Equal ( 9 , changes . LinesAdded ) ;
130130 Assert . Equal ( 2 , changes . LinesDeleted ) ;
131- Assert . Equal ( 2 , changes [ "readme.txt" ] . LinesDeleted ) ;
131+ Assert . Equal ( 2 , changes [ "readme.txt" ] . Single ( ) . LinesDeleted ) ;
132132 }
133133 }
134134
@@ -161,8 +161,8 @@ public void CanDetectTheRenamingOfAModifiedFile()
161161 TreeChanges changes = repo . Diff . Compare ( rootCommitTree , commitTreeWithRenamedFile ) ;
162162
163163 Assert . Equal ( 1 , changes . Count ( ) ) ;
164- Assert . Equal ( "super-file.txt" , changes [ "super-file.txt" ] . Path ) ;
165- Assert . Equal ( "my-name-does-not-feel-right.txt" , changes [ "super-file.txt" ] . OldPath ) ;
164+ Assert . Equal ( "super-file.txt" , changes [ "super-file.txt" ] . Single ( ) . Path ) ;
165+ Assert . Equal ( "my-name-does-not-feel-right.txt" , changes [ "super-file.txt" ] . Single ( ) . OldPath ) ;
166166 //Assert.Equal(1, changes.FilesRenamed.Count());
167167 }
168168 }
@@ -275,12 +275,12 @@ public void CanCompareTwoVersionsOfAFileWithADiffOfTwoHunks()
275275 Assert . Equal ( 1 , changes . Deleted . Count ( ) ) ;
276276 Assert . Equal ( 1 , changes . Added . Count ( ) ) ;
277277
278- TreeEntryChanges treeEntryChanges = changes [ "numbers.txt" ] ;
278+ TreeEntryChanges treeEntryChanges = changes [ "numbers.txt" ] . Single ( ) ;
279279
280280 Assert . Equal ( 3 , treeEntryChanges . LinesAdded ) ;
281281 Assert . Equal ( 1 , treeEntryChanges . LinesDeleted ) ;
282282
283- Assert . Equal ( Mode . Nonexistent , changes [ "my-name-does-not-feel-right.txt" ] . Mode ) ;
283+ Assert . Equal ( Mode . Nonexistent , changes [ "my-name-does-not-feel-right.txt" ] . Single ( ) . Mode ) ;
284284
285285 var expected = new StringBuilder ( )
286286 . Append ( "diff --git a/numbers.txt b/numbers.txt\n " )
@@ -354,5 +354,68 @@ public void CanCompareTwoVersionsOfAFileWithADiffOfTwoHunks()
354354 Assert . Equal ( expected . ToString ( ) , changes . Patch ) ;
355355 }
356356 }
357+
358+ [ Fact ]
359+ public void CanHandleTwoTreeEntryChangesWithTheSamePath ( )
360+ {
361+ SelfCleaningDirectory scd = BuildSelfCleaningDirectory ( ) ;
362+
363+ using ( Repository repo = Repository . Init ( scd . DirectoryPath ) )
364+ {
365+ Blob mainContent = CreateBlob ( repo , "awesome content\n " ) ;
366+ Blob linkContent = CreateBlob ( repo , "../../objc/Nu.h" ) ;
367+
368+ const string path = "include/Nu/Nu.h" ;
369+
370+ var tdOld = new TreeDefinition ( )
371+ . Add ( path , linkContent , Mode . SymbolicLink )
372+ . Add ( "objc/Nu.h" , mainContent , Mode . NonExecutableFile ) ;
373+
374+ Tree treeOld = repo . ObjectDatabase . CreateTree ( tdOld ) ;
375+
376+ var tdNew = new TreeDefinition ( )
377+ . Add ( path , mainContent , Mode . NonExecutableFile ) ;
378+
379+ Tree treeNew = repo . ObjectDatabase . CreateTree ( tdNew ) ;
380+
381+ TreeChanges changes = repo . Diff . Compare ( treeOld , treeNew ) ;
382+
383+ if ( IsRunningOnLinux ( ) )
384+ {
385+ TreeEntryChanges [ ] tecs = changes [ path ] . ToArray ( ) ;
386+ Assert . Equal ( 2 , tecs . Length ) ;
387+
388+ TreeEntryChanges change1 = tecs [ 0 ] ;
389+ Assert . Equal ( Mode . SymbolicLink , change1 . OldMode ) ;
390+ Assert . Equal ( Mode . Nonexistent , change1 . Mode ) ;
391+ Assert . Equal ( ChangeKind . Deleted , change1 . Status ) ;
392+ Assert . Equal ( "include/Nu/Nu.h" , change1 . Path ) ;
393+
394+ TreeEntryChanges change2 = tecs [ 1 ] ;
395+ Assert . Equal ( Mode . Nonexistent , change2 . OldMode ) ;
396+ Assert . Equal ( Mode . NonExecutableFile , change2 . Mode ) ;
397+ Assert . Equal ( ChangeKind . Added , change2 . Status ) ;
398+ Assert . Equal ( "include/Nu/Nu.h" , change1 . Path ) ;
399+
400+ return ;
401+ }
402+
403+ Assert . Equal ( 1 , changes [ path ] . Count ( ) ) ;
404+ TreeEntryChanges change = changes [ path ] . Single ( ) ;
405+
406+ Assert . Equal ( Mode . SymbolicLink , change . Mode ) ;
407+ Assert . Equal ( change . OldMode , change . Mode ) ;
408+ Assert . Equal ( ChangeKind . Modified , change . Status ) ;
409+ }
410+ }
411+
412+ private static Blob CreateBlob ( Repository repo , string content )
413+ {
414+ using ( var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( content ) ) )
415+ using ( var binReader = new BinaryReader ( stream ) )
416+ {
417+ return repo . ObjectDatabase . CreateBlob ( binReader ) ;
418+ }
419+ }
357420 }
358421}
0 commit comments