From be1f89c93c00121c071b1ad01a7e1c9971c2f7b5 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 6 Feb 2022 08:11:09 +0200 Subject: [PATCH] DiffEditor: Fix git diff parsing for rename + mode change Sample output: diff --git a/projects/cosign/build.sh b/projects/argo/build.sh old mode 100755 new mode 100644 similarity index 88% rename from projects/cosign/build.sh rename to projects/argo/build.sh index 87d865d2..14b8885c --- a/projects/cosign/build.sh +++ b/projects/argo/build.sh @@ -13,7 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # ################################################################################ +$SRC/cncf-fuzzing/projects/argo/build.sh + -compile_go_fuzzer github.com/sigstore/cosign/test FuzzGetPassword fuzz_getPassword gofuzz Change-Id: Ifa66dfdb80b309d72f524f15c681823ab7e133ba Reviewed-by: Jarek Kobus --- src/plugins/diffeditor/diffeditorplugin.cpp | 20 +++++++++++++++ src/plugins/diffeditor/diffutils.cpp | 28 +++++++++++++++------ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index 90cdb054220..fc607535af5 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -1341,6 +1341,26 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data() QTest::newRow("Mode change") << patch << fileDataList9; + ////////////// + patch = R"(diff --git a/old.sh b/new.sh +old mode 100644 +new mode 100755 +similarity index 100% +rename from old.sh +rename to new.sh +)" + ; + + fileData1 = FileData(); + fileData1.leftFileInfo = DiffFileInfo("old.sh"); + fileData1.rightFileInfo = DiffFileInfo("new.sh"); + fileData1.fileOperation = FileData::RenameFile; + + QList fileDataList10; + fileDataList10 << fileData1; + + QTest::newRow("Mode change + rename") << patch << fileDataList10; + ////////////// // Subversion New diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp index 9db8a09bc4c..27ee1d3b484 100644 --- a/src/plugins/diffeditor/diffutils.cpp +++ b/src/plugins/diffeditor/diffutils.cpp @@ -997,12 +997,15 @@ static QList readDiffPatch(StringView patch, bool *ok, QFutureInterfac // The git diff patch format (CopyFile, RenameFile) // 0. [some text lines to skip, e.g. show description]\n // 1. diff --git a/[leftFileName] b/[rightFileName]\n -// 2. [dis]similarity index [0-100]%\n +// 2a. old mode [oldFileModeNumber]\n +// new mode [newFileModeNumber]\n +// 2b. +// 3. [dis]similarity index [0-100]%\n // [copy / rename] from [leftFileName]\n // [copy / rename] to [rightFileName] -// 3a. -// 3b. index [leftIndexSha]..[rightIndexSha] -// 4. --- [leftFileNameOrDevNull]\n +// 4a. +// 4b. index [leftIndexSha]..[rightIndexSha] +// 5. --- [leftFileNameOrDevNull]\n // +++ [rightFileNameOrDevNull]\n // @@ -1164,10 +1167,21 @@ static bool detectFileData(StringView patch, FileData *fileData, StringView *rem } else { // copy / rename - + StringView afterModeOrSimilarity; StringView afterSimilarity; - // (dis)similarity index [0-100]% - readLine(afterDiffGit, &afterSimilarity, &hasNewLine); + const StringView secondLine = readLine(afterDiffGit, &afterModeOrSimilarity, &hasNewLine); + if (secondLine.startsWith(QLatin1String("old mode "))) { + if (!hasNewLine) + return false; + readLine(afterModeOrSimilarity, &afterModeOrSimilarity, &hasNewLine); // new mode + if (!hasNewLine) + return false; + // (dis)similarity index [0-100]% + readLine(afterModeOrSimilarity, &afterSimilarity, &hasNewLine); + } else { + afterSimilarity = afterModeOrSimilarity; + } + if (!hasNewLine) return false; // we need to have at least one more line