aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/diffeditor
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2017-11-26 10:24:32 +0200
committerOrgad Shaneh <orgads@gmail.com>2017-11-27 11:40:31 +0000
commit63861c44c1e4f9d4cf6a7a48fe9534b4f73d0ad7 (patch)
treeffec6214cebb2bb8d15632fc03420bbb62d7052f /src/plugins/diffeditor
parent8bc3ac9177e6f8f05c2c64a400d244a5cc82aa0a (diff)
DiffEditor: Fix parsing of mode-only change in patch
If one of the files has mode-only change, the entire patch fails as a git patch, and is parsed as a text patch. Because of that, the prefixes (a/, b/) are not stripped and jumping to a change by double-clicking does not work. Change-Id: Ib54ce4fa7aad02cb956af1f7de73d3c732ac5a89 Reviewed-by: André Hartmann <aha_1980@gmx.de> Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
Diffstat (limited to 'src/plugins/diffeditor')
-rw-r--r--src/plugins/diffeditor/diffeditorplugin.cpp34
-rw-r--r--src/plugins/diffeditor/diffutils.cpp18
-rw-r--r--src/plugins/diffeditor/diffutils.h1
3 files changed, 37 insertions, 16 deletions
diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp
index f906fdb027..6004f93515 100644
--- a/src/plugins/diffeditor/diffeditorplugin.cpp
+++ b/src/plugins/diffeditor/diffeditorplugin.cpp
@@ -1348,6 +1348,22 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data()
<< fileDataList8;
//////////////
+ patch = _("diff --git a/script.sh b/script.sh\n"
+ "old mode 100644\n"
+ "new mode 100755\n"
+ );
+
+ fileData1 = FileData();
+ fileData1.leftFileInfo = DiffFileInfo("script.sh");
+ fileData1.rightFileInfo = DiffFileInfo("script.sh");
+ fileData1.fileOperation = FileData::ChangeMode;
+
+ QList<FileData> fileDataList9;
+ fileDataList9 << fileData1;
+
+ QTest::newRow("Mode change") << patch << fileDataList9;
+
+ //////////////
// Subversion New
patch = _("Index: src/plugins/subversion/subversioneditor.cpp\n"
@@ -1362,10 +1378,10 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data()
chunkData1.leftStartingLineNumber = -1;
chunkData1.rightStartingLineNumber = 124;
fileData1.chunks << chunkData1;
- QList<FileData> fileDataList9;
- fileDataList9 << fileData1;
+ QList<FileData> fileDataList21;
+ fileDataList21 << fileData1;
QTest::newRow("Subversion New") << patch
- << fileDataList9;
+ << fileDataList21;
//////////////
@@ -1382,10 +1398,10 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data()
chunkData1.leftStartingLineNumber = 0;
chunkData1.rightStartingLineNumber = -1;
fileData1.chunks << chunkData1;
- QList<FileData> fileDataList10;
- fileDataList10 << fileData1;
+ QList<FileData> fileDataList22;
+ fileDataList22 << fileData1;
QTest::newRow("Subversion Deleted") << patch
- << fileDataList10;
+ << fileDataList22;
//////////////
@@ -1402,10 +1418,10 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data()
chunkData1.leftStartingLineNumber = 119;
chunkData1.rightStartingLineNumber = 119;
fileData1.chunks << chunkData1;
- QList<FileData> fileDataList11;
- fileDataList11 << fileData1;
+ QList<FileData> fileDataList23;
+ fileDataList23 << fileData1;
QTest::newRow("Subversion Normal") << patch
- << fileDataList11;
+ << fileDataList23;
}
void DiffEditor::Internal::DiffEditorPlugin::testReadPatch()
diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp
index a9d9b11ae2..69ddbb9ba9 100644
--- a/src/plugins/diffeditor/diffutils.cpp
+++ b/src/plugins/diffeditor/diffutils.cpp
@@ -1025,10 +1025,16 @@ static bool detectIndexAndBinary(QStringRef patch,
bool hasNewLine;
*remainingPatch = patch;
- if (remainingPatch->isEmpty() && (fileData->fileOperation == FileData::CopyFile
- || fileData->fileOperation == FileData::RenameFile)) {
- // in case of 100% similarity we don't have more lines in the patch
- return true;
+ if (remainingPatch->isEmpty()) {
+ switch (fileData->fileOperation) {
+ case FileData::CopyFile:
+ case FileData::RenameFile:
+ case FileData::ChangeMode:
+ // in case of 100% similarity we don't have more lines in the patch
+ return true;
+ default:
+ break;
+ }
}
QStringRef afterNextLine;
@@ -1151,8 +1157,6 @@ static bool detectFileData(QStringRef patch,
QStringRef afterSecondLine;
const QStringRef secondLine = readLine(afterDiffGit, &afterSecondLine, &hasNewLine);
- if (!hasNewLine)
- return false; // we need to have at least one more line
if (secondLine.startsWith(QStringLiteral("new file mode "))) {
fileData->fileOperation = FileData::NewFile;
@@ -1165,7 +1169,7 @@ static bool detectFileData(QStringRef patch,
// new mode
readLine(afterSecondLine, &afterThirdLine, &hasNewLine);
if (!hasNewLine)
- return false; // we need to have at least one more line
+ fileData->fileOperation = FileData::ChangeMode;
// TODO: validate new mode line
*remainingPatch = afterThirdLine;
diff --git a/src/plugins/diffeditor/diffutils.h b/src/plugins/diffeditor/diffutils.h
index 46a8bb40b0..ed0130bfbd 100644
--- a/src/plugins/diffeditor/diffutils.h
+++ b/src/plugins/diffeditor/diffutils.h
@@ -104,6 +104,7 @@ class DIFFEDITOR_EXPORT FileData {
public:
enum FileOperation {
ChangeFile,
+ ChangeMode,
NewFile,
DeleteFile,
CopyFile,