forked from qt-creator/qt-creator
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>
This commit is contained in:
committed by
Orgad Shaneh
parent
8bc3ac9177
commit
63861c44c1
@@ -1347,6 +1347,22 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data()
|
|||||||
QTest::newRow("Binary files") << patch
|
QTest::newRow("Binary files") << patch
|
||||||
<< fileDataList8;
|
<< 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
|
// Subversion New
|
||||||
@@ -1362,10 +1378,10 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data()
|
|||||||
chunkData1.leftStartingLineNumber = -1;
|
chunkData1.leftStartingLineNumber = -1;
|
||||||
chunkData1.rightStartingLineNumber = 124;
|
chunkData1.rightStartingLineNumber = 124;
|
||||||
fileData1.chunks << chunkData1;
|
fileData1.chunks << chunkData1;
|
||||||
QList<FileData> fileDataList9;
|
QList<FileData> fileDataList21;
|
||||||
fileDataList9 << fileData1;
|
fileDataList21 << fileData1;
|
||||||
QTest::newRow("Subversion New") << patch
|
QTest::newRow("Subversion New") << patch
|
||||||
<< fileDataList9;
|
<< fileDataList21;
|
||||||
|
|
||||||
//////////////
|
//////////////
|
||||||
|
|
||||||
@@ -1382,10 +1398,10 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data()
|
|||||||
chunkData1.leftStartingLineNumber = 0;
|
chunkData1.leftStartingLineNumber = 0;
|
||||||
chunkData1.rightStartingLineNumber = -1;
|
chunkData1.rightStartingLineNumber = -1;
|
||||||
fileData1.chunks << chunkData1;
|
fileData1.chunks << chunkData1;
|
||||||
QList<FileData> fileDataList10;
|
QList<FileData> fileDataList22;
|
||||||
fileDataList10 << fileData1;
|
fileDataList22 << fileData1;
|
||||||
QTest::newRow("Subversion Deleted") << patch
|
QTest::newRow("Subversion Deleted") << patch
|
||||||
<< fileDataList10;
|
<< fileDataList22;
|
||||||
|
|
||||||
//////////////
|
//////////////
|
||||||
|
|
||||||
@@ -1402,10 +1418,10 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data()
|
|||||||
chunkData1.leftStartingLineNumber = 119;
|
chunkData1.leftStartingLineNumber = 119;
|
||||||
chunkData1.rightStartingLineNumber = 119;
|
chunkData1.rightStartingLineNumber = 119;
|
||||||
fileData1.chunks << chunkData1;
|
fileData1.chunks << chunkData1;
|
||||||
QList<FileData> fileDataList11;
|
QList<FileData> fileDataList23;
|
||||||
fileDataList11 << fileData1;
|
fileDataList23 << fileData1;
|
||||||
QTest::newRow("Subversion Normal") << patch
|
QTest::newRow("Subversion Normal") << patch
|
||||||
<< fileDataList11;
|
<< fileDataList23;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiffEditor::Internal::DiffEditorPlugin::testReadPatch()
|
void DiffEditor::Internal::DiffEditorPlugin::testReadPatch()
|
||||||
|
@@ -1025,10 +1025,16 @@ static bool detectIndexAndBinary(QStringRef patch,
|
|||||||
bool hasNewLine;
|
bool hasNewLine;
|
||||||
*remainingPatch = patch;
|
*remainingPatch = patch;
|
||||||
|
|
||||||
if (remainingPatch->isEmpty() && (fileData->fileOperation == FileData::CopyFile
|
if (remainingPatch->isEmpty()) {
|
||||||
|| fileData->fileOperation == FileData::RenameFile)) {
|
switch (fileData->fileOperation) {
|
||||||
// in case of 100% similarity we don't have more lines in the patch
|
case FileData::CopyFile:
|
||||||
return true;
|
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;
|
QStringRef afterNextLine;
|
||||||
@@ -1151,8 +1157,6 @@ static bool detectFileData(QStringRef patch,
|
|||||||
|
|
||||||
QStringRef afterSecondLine;
|
QStringRef afterSecondLine;
|
||||||
const QStringRef secondLine = readLine(afterDiffGit, &afterSecondLine, &hasNewLine);
|
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 "))) {
|
if (secondLine.startsWith(QStringLiteral("new file mode "))) {
|
||||||
fileData->fileOperation = FileData::NewFile;
|
fileData->fileOperation = FileData::NewFile;
|
||||||
@@ -1165,7 +1169,7 @@ static bool detectFileData(QStringRef patch,
|
|||||||
// new mode
|
// new mode
|
||||||
readLine(afterSecondLine, &afterThirdLine, &hasNewLine);
|
readLine(afterSecondLine, &afterThirdLine, &hasNewLine);
|
||||||
if (!hasNewLine)
|
if (!hasNewLine)
|
||||||
return false; // we need to have at least one more line
|
fileData->fileOperation = FileData::ChangeMode;
|
||||||
|
|
||||||
// TODO: validate new mode line
|
// TODO: validate new mode line
|
||||||
*remainingPatch = afterThirdLine;
|
*remainingPatch = afterThirdLine;
|
||||||
|
@@ -104,6 +104,7 @@ class DIFFEDITOR_EXPORT FileData {
|
|||||||
public:
|
public:
|
||||||
enum FileOperation {
|
enum FileOperation {
|
||||||
ChangeFile,
|
ChangeFile,
|
||||||
|
ChangeMode,
|
||||||
NewFile,
|
NewFile,
|
||||||
DeleteFile,
|
DeleteFile,
|
||||||
CopyFile,
|
CopyFile,
|
||||||
|
Reference in New Issue
Block a user