From 5e883e5b4d3491c3f30e5f91261b14fa137a675e Mon Sep 17 00:00:00 2001
From: Orgad Shaneh <orgad.shaneh@audiocodes.com>
Date: Sun, 8 Jun 2014 23:31:46 +0300
Subject: [PATCH] DiffEditor: Support patch with new/deleted file

Change-Id: I669564355e27dc06464fc8d8641b2f4255c8965e
Reviewed-by: Jarek Kobus <jaroslaw.kobus@digia.com>
---
 src/plugins/diffeditor/diffeditorplugin.cpp | 46 +++++++++++++++++++--
 src/plugins/diffeditor/diffutils.cpp        |  4 +-
 2 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp
index b7661f511e..a8c2c46b64 100644
--- a/src/plugins/diffeditor/diffeditorplugin.cpp
+++ b/src/plugins/diffeditor/diffeditorplugin.cpp
@@ -453,7 +453,22 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data()
                                 "+}\n"
                                 "+\n"
                                 " } // namespace Internal\n"
-                                " } // namespace DiffEditor\n");
+                                " } // namespace DiffEditor\n"
+                                "diff --git a/new b/new\n"
+                                "new file mode 100644\n"
+                                "index 0000000..257cc56\n"
+                                "--- /dev/null\n"
+                                "+++ b/new\n"
+                                "@@ -0,0 +1 @@\n"
+                                "+foo\n"
+                                "diff --git a/deleted b/deleted\n"
+                                "deleted file mode 100644\n"
+                                "index 257cc56..0000000\n"
+                                "--- a/deleted\n"
+                                "+++ /dev/null\n"
+                                "@@ -1 +0,0 @@\n"
+                                "-foo\n"
+                                  );
 
     FileData fileData1;
     fileData1.leftFileInfo = DiffFileInfo(QLatin1String("src/plugins/diffeditor/diffeditor.cpp"),
@@ -510,9 +525,34 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data()
     chunkData2.rows = rows2;
     fileData2.chunks.append(chunkData2);
 
+    FileData fileData3;
+    fileData3.leftFileInfo = DiffFileInfo(QLatin1String("new"), QLatin1String("0000000"));
+    fileData3.rightFileInfo = DiffFileInfo(QLatin1String("new"), QLatin1String("257cc56"));
+    ChunkData chunkData3;
+    chunkData3.leftStartingLineNumber = -1;
+    chunkData3.rightStartingLineNumber = 0;
+    QList<RowData> rows3;
+    rows3.append(RowData(TextLineData::Separator, TextLineData(QLatin1String("foo"))));
+    TextLineData textLineData3(TextLineData::TextLine);
+    rows3.append(RowData(TextLineData::Separator, textLineData3));
+    chunkData3.rows = rows3;
+    fileData3.chunks.append(chunkData3);
+
+    FileData fileData4;
+    fileData4.leftFileInfo = DiffFileInfo(QLatin1String("deleted"), QLatin1String("257cc56"));
+    fileData4.rightFileInfo = DiffFileInfo(QLatin1String("deleted"), QLatin1String("0000000"));
+    ChunkData chunkData4;
+    chunkData4.leftStartingLineNumber = 0;
+    chunkData4.rightStartingLineNumber = -1;
+    QList<RowData> rows4;
+    rows4.append(RowData(TextLineData(QLatin1String("foo")), TextLineData::Separator));
+    TextLineData textLineData4(TextLineData::TextLine);
+    rows4.append(RowData(textLineData4, TextLineData::Separator));
+    chunkData4.rows = rows4;
+    fileData4.chunks.append(chunkData4);
+
     QList<FileData> fileDataList;
-    fileDataList.append(fileData1);
-    fileDataList.append(fileData2);
+    fileDataList << fileData1 << fileData2 << fileData3 << fileData4;
 
     QTest::newRow("Git patch") << patch
                                << fileDataList;
diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp
index 728c844cd9..06e3c2c578 100644
--- a/src/plugins/diffeditor/diffutils.cpp
+++ b/src/plugins/diffeditor/diffutils.cpp
@@ -613,8 +613,8 @@ static QList<ChunkData> readChunks(const QString &patch,
     const QRegExp chunkRegExp(QLatin1String(
                                   // beginning of the line
                               "((?:\\n|^)"
-                                  // @@ -leftPos,leftCount +rightPos,rightCount @@
-                              "@@ -(\\d+),\\d+ \\+(\\d+),\\d+ @@"
+                                  // @@ -leftPos[,leftCount] +rightPos[,rightCount] @@
+                              "@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@"
                                   // optional hint (e.g. function name)
                               "(?:\\ +[^\\n]*)?"
                                   // end of line (need to be followed by text line)
-- 
GitLab