From 8c9085083cf99574309d5789c8149efd8993f597 Mon Sep 17 00:00:00 2001 From: Delian Jekov Date: Tue, 9 Jan 2024 11:54:11 +0200 Subject: [PATCH] feat: new/deleted file mode --- CSharpDiff.Tests/PatchTests.cs | 74 +++++++++++++++++----------------- CSharpDiff/Patches/Patch.cs | 24 +++++++++-- 2 files changed, 57 insertions(+), 41 deletions(-) diff --git a/CSharpDiff.Tests/PatchTests.cs b/CSharpDiff.Tests/PatchTests.cs index 501510d..f2761a8 100644 --- a/CSharpDiff.Tests/PatchTests.cs +++ b/CSharpDiff.Tests/PatchTests.cs @@ -86,8 +86,8 @@ public void ShouldHandleLastLine() { var patch = new Patch(); - var expected = "Index: test\n" - + "===================================================================\n" + var expected = "diff --git test test\n" + + "Index: test\n" + "--- test\theader1\n" + "+++ test\theader2\n" + "@@ -1,3 +1,4 @@\n" @@ -98,8 +98,8 @@ public void ShouldHandleLastLine() var res = patch.create("test", "test", "line2\nline3\nline5\n", "line2\nline3\nline4\nline5\n", "header1", "header2"); Assert.Equal(expected, res); - expected = "Index: test\n" - + "===================================================================\n" + expected = "diff --git test test\n" + + "Index: test\n" + "--- test\theader1\n" + "+++ test\theader2\n" + "@@ -1,3 +1,4 @@\n" @@ -111,8 +111,8 @@ public void ShouldHandleLastLine() res = patch.create("test", "test", "line2\nline3\nline4\n", "line2\nline3\nline4\nline5\n", "header1", "header2"); Assert.Equal(expected, res); - expected = "Index: test\n" - + "===================================================================\n" + expected = "diff --git test test\n" + + "Index: test\n" + "--- test\theader1\n" + "+++ test\theader2\n" + "@@ -1,4 +1,5 @@\n" @@ -131,8 +131,8 @@ public void ShouldHandleLastLine() public void ShouldHandleNoNewLineNewEOF() { var patch = new Patch(); - var expected = "Index: test\n" - + "===================================================================\n" + var expected = "diff --git test test\n" + + "Index: test\n" + "--- test\theader1\n" + "+++ test\theader2\n" + "@@ -1,4 +1,4 @@\n" @@ -150,8 +150,8 @@ public void ShouldHandleNoNewLineNewEOF() public void ShouldHandleNoNewLineOldEOF() { var patch = new Patch(); - var expected = "Index: test\n" - + "===================================================================\n" + var expected = "diff --git test test\n" + + "Index: test\n" + "--- test\theader1\n" + "+++ test\theader2\n" + "@@ -1,4 +1,4 @@\n" @@ -169,8 +169,8 @@ public void ShouldHandleNoNewLineOldEOF() public void ShouldHandleNoNewLineContextMissing() { var patch = new Patch(); - var expected = "Index: test\n" - + "===================================================================\n" + var expected = "diff --git test test\n" + + "Index: test\n" + "--- test\theader1\n" + "+++ test\theader2\n" + "@@ -1,4 +1,4 @@\n" @@ -188,8 +188,8 @@ public void ShouldHandleNoNewLineContextMissing() public void ShouldOutPutNoNewLineOnEmpty() { var patch = new Patch(); - var expected = "Index: test\n" - + "===================================================================\n" + var expected = "diff --git test test\n" + + "Index: test\n" + "--- test\theader1\n" + "+++ test\theader2\n" + "@@ -0,0 +1,4 @@\n" @@ -206,8 +206,8 @@ public void ShouldOutPutNoNewLineOnEmpty() public void ShouldNotOutputNoNewLineWhenEofOutsideHunk() { var patch = new Patch(); - var expected = "Index: test\n" - + "===================================================================\n" + var expected = "diff --git test test\n" + + "Index: test\n" + "--- test\theader1\n" + "+++ test\theader2\n" + "@@ -1,5 +1,5 @@\n" @@ -225,8 +225,8 @@ public void ShouldNotOutputNoNewLineWhenEofOutsideHunk() public void ShouldGeneratePatchDefaultContextSize() { var patch = new Patch(); - var expected = "Index: testFileName\n" - + "===================================================================\n" + var expected = "diff --git testFileName testFileName\n" + + "Index: testFileName\n" + "--- testFileName\tOld Header\n" + "+++ testFileName\tNew Header\n" + "@@ -1,5 +1,6 @@\n" @@ -283,8 +283,8 @@ public void ShouldGeneratePatchWithContextSize0() { Context = 0 }); - var expected = "Index: testFileName\n" - + "===================================================================\n" + var expected = "diff --git testFileName testFileName\n" + + "Index: testFileName\n" + "--- testFileName\tOld Header\n" + "+++ testFileName\tNew Header\n" + "@@ -1,1 +1,2 @@\n" @@ -312,8 +312,8 @@ public void ShouldGeneratePatchWithContextSize2() { Context = 2 }); - var expected = "Index: testFileName\n" - + "===================================================================\n" + var expected = "diff --git testFileName testFileName\n" + + "Index: testFileName\n" + "--- testFileName\tOld Header\n" + "+++ testFileName\tNew Header\n" + "@@ -1,3 +1,4 @@\n" @@ -356,8 +356,8 @@ public void ShouldGeneratePatchWithContextSize2() public void ShouldOutputHeadersOnlyForIdentical() { var patch = new Patch(); - var expected = "Index: testFileName\n" - + "===================================================================\n" + var expected = "diff --git testFileName testFileName\n" + + "Index: testFileName\n" + "--- testFileName\tOld Header\n" + "+++ testFileName\tNew Header\n"; var res = patch.create("testFileName", "testFileName", oldFile, oldFile, "Old Header", "New Header"); @@ -368,8 +368,8 @@ public void ShouldOutputHeadersOnlyForIdentical() public void ShouldOmitHeadersIfEmpty() { var patch = new Patch(); - var expected = "Index: testFileName\n" - + "===================================================================\n" + var expected = "diff --git testFileName testFileName\n" + + "Index: testFileName\n" + "--- testFileName\n" + "+++ testFileName\n"; var res = patch.create("testFileName", "testFileName", oldFile, oldFile, null, null); @@ -380,8 +380,8 @@ public void ShouldOmitHeadersIfEmpty() public void ShouldHandleEmpty() { var patch = new Patch(); - var expected = "Index: testFileName\n" - + "===================================================================\n" + var expected = "diff --git testFileName testFileName\n" + + "Index: testFileName\n" + "--- testFileName\n" + "+++ testFileName\n"; var res = patch.create("testFileName", "testFileName", "", "", null, null); @@ -392,7 +392,7 @@ public void ShouldHandleEmpty() public void ShouldOmitIndexDifferentFilenames() { var patch = new Patch(); - var expected = "===================================================================\n" + var expected = "diff --git foo bar\n" + "--- foo\n" + "+++ bar\n"; var res = patch.create("foo", "bar", "", "", null, null); @@ -406,8 +406,8 @@ public void ShouldNotIgnoreWhiteSpace() { IgnoreWhiteSpace = false }); - var expected = "Index: testFileName\n" - + "===================================================================\n" + var expected = "diff --git testFileName testFileName\n" + + "Index: testFileName\n" + "--- testFileName\n" + "+++ testFileName\n" + "@@ -1,2 +1,2 @@\n" @@ -428,8 +428,8 @@ public void ShouldIgnoreWhiteSpace() { IgnoreWhiteSpace = true }); - var expected = "Index: testFileName\n" - + "===================================================================\n" + var expected = "diff --git testFileName testFileName\n" + + "Index: testFileName\n" + "--- testFileName\n" + "+++ testFileName\n"; var res = patch.create("testFileName", "testFileName", "line \n line", "line\nline", null, null); @@ -443,8 +443,8 @@ public void ShouldNotConsiderNewLineToken() { NewlineIsToken = false }); - var expected = "Index: testFileName\n" - + "===================================================================\n" + var expected = "diff --git testFileName testFileName\n" + + "Index: testFileName\n" + "--- testFileName\n" + "+++ testFileName\n" + "@@ -1,2 +1,2 @@\n" @@ -466,8 +466,8 @@ public void ShouldConsiderNewLineToken() { NewlineIsToken = true }); - var expected = "Index: testFileName\n" - + "===================================================================\n" + var expected = "diff --git testFileName testFileName\n" + + "Index: testFileName\n" + "--- testFileName\n" + "+++ testFileName\n" + "@@ -1,3 +1,3 @@\n" diff --git a/CSharpDiff/Patches/Patch.cs b/CSharpDiff/Patches/Patch.cs index 5a2c8a8..6399af2 100644 --- a/CSharpDiff/Patches/Patch.cs +++ b/CSharpDiff/Patches/Patch.cs @@ -1,7 +1,7 @@ -using System.Text.RegularExpressions; using CSharpDiff.Diffs; using CSharpDiff.Diffs.Models; using CSharpDiff.Patches.Models; +using System.Text.RegularExpressions; namespace CSharpDiff.Patches { @@ -185,13 +185,29 @@ public PatchResult createPatchResult(string oldFileName, string newFileName, str public string formatPatch(PatchResult diff) { var ret = new List(); + var oldFileName = (String.IsNullOrEmpty(diff.OldFileName) ? "/dev/null" : diff.OldFileName); + var newFileName = (String.IsNullOrEmpty(diff.NewFileName) ? "/dev/null" : diff.NewFileName); + + ret.Add($"diff --git {oldFileName} {newFileName}"); + if (diff.OldFileName == diff.NewFileName) { ret.Add("Index: " + diff.OldFileName); } - ret.Add("==================================================================="); - ret.Add("--- " + diff.OldFileName + (String.IsNullOrEmpty(diff.OldHeader) ? "" : '\t' + diff.OldHeader)); - ret.Add("+++ " + diff.NewFileName + (String.IsNullOrEmpty(diff.NewHeader) ? "" : '\t' + diff.NewHeader)); + else if (diff.OldFileName is null && diff.NewFileName is not null) + { + ret.Add("new file mode 100644"); + } + else if (diff.NewFileName is null && diff.OldFileName is not null) + { + ret.Add("deleted file mode 100644"); + } + + + ret.Add("--- " + oldFileName + (String.IsNullOrEmpty(diff.OldHeader) ? "" : '\t' + diff.OldHeader)); + ret.Add("+++ " + newFileName + (String.IsNullOrEmpty(diff.NewHeader) ? "" : '\t' + diff.NewHeader)); + + for (var i = 0; i < diff.Hunks.Count(); i++) {