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 <jaroslaw.kobus@qt.io>
This commit is contained in:
Orgad Shaneh
2022-02-06 08:11:09 +02:00
committed by Orgad Shaneh
parent 9f7c822197
commit be1f89c93c
2 changed files with 41 additions and 7 deletions

View File

@@ -1341,6 +1341,26 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data()
QTest::newRow("Mode change") << patch << fileDataList9; 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<FileData> fileDataList10;
fileDataList10 << fileData1;
QTest::newRow("Mode change + rename") << patch << fileDataList10;
////////////// //////////////
// Subversion New // Subversion New

View File

@@ -997,12 +997,15 @@ static QList<FileData> readDiffPatch(StringView patch, bool *ok, QFutureInterfac
// The git diff patch format (CopyFile, RenameFile) // The git diff patch format (CopyFile, RenameFile)
// 0. [some text lines to skip, e.g. show description]\n // 0. [some text lines to skip, e.g. show description]\n
// 1. diff --git a/[leftFileName] b/[rightFileName]\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. <Nothing, only in case when no ChangeMode>
// 3. [dis]similarity index [0-100]%\n
// [copy / rename] from [leftFileName]\n // [copy / rename] from [leftFileName]\n
// [copy / rename] to [rightFileName] // [copy / rename] to [rightFileName]
// 3a. <Nothing more, only when similarity index was 100%> // 4a. <Nothing more, only when similarity index was 100%>
// 3b. index [leftIndexSha]..[rightIndexSha] <optionally: octalNumber> // 4b. index [leftIndexSha]..[rightIndexSha] <optionally: octalNumber>
// 4. --- [leftFileNameOrDevNull]\n // 5. --- [leftFileNameOrDevNull]\n
// +++ [rightFileNameOrDevNull]\n // +++ [rightFileNameOrDevNull]\n
// <Chunks> // <Chunks>
@@ -1164,10 +1167,21 @@ static bool detectFileData(StringView patch, FileData *fileData, StringView *rem
} else { } else {
// copy / rename // copy / rename
StringView afterModeOrSimilarity;
StringView afterSimilarity; StringView afterSimilarity;
// (dis)similarity index [0-100]% const StringView secondLine = readLine(afterDiffGit, &afterModeOrSimilarity, &hasNewLine);
readLine(afterDiffGit, &afterSimilarity, &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) if (!hasNewLine)
return false; // we need to have at least one more line return false; // we need to have at least one more line