diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2018-05-14 14:22:39 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2018-06-07 06:57:31 +0000 |
commit | d892eaadae7c3b09f1c69c39c5b69768212e06a8 (patch) | |
tree | ad5856b64b066e6ebd5df5182a3aa4c6b6f99f48 /src/plugins/diffeditor/diffeditorplugin.cpp | |
parent | b816992a39b77373f09945a64f83cd016fb9c374 (diff) | |
download | qt-creator-d892eaadae7c3b09f1c69c39c5b69768212e06a8.tar.gz |
DiffEditor: detect binary files
Task-number: QTCREATORBUG-15767
Change-Id: Ic9f513ecaeb15b56c90933b1d5e4cf70e045b481
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Diffstat (limited to 'src/plugins/diffeditor/diffeditorplugin.cpp')
-rw-r--r-- | src/plugins/diffeditor/diffeditorplugin.cpp | 121 |
1 files changed, 59 insertions, 62 deletions
diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index e3a9ec31f9..4411c84c67 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -65,6 +65,7 @@ public: DiffFileInfo leftFileInfo; DiffFileInfo rightFileInfo; FileData::FileOperation fileOperation = FileData::ChangeFile; + bool binaryFiles = false; }; class DiffFile @@ -78,34 +79,42 @@ public: void operator()(QFutureInterface<FileData> &futureInterface, const ReloadInput &reloadInfo) const { + if (reloadInfo.leftText == reloadInfo.rightText) + return; // We show "No difference" in this case, regardless if it's binary or not + Differ differ(&futureInterface); - const QList<Diff> diffList = differ.cleanupSemantics( - differ.diff(reloadInfo.leftText, reloadInfo.rightText)); - - QList<Diff> leftDiffList; - QList<Diff> rightDiffList; - Differ::splitDiffList(diffList, &leftDiffList, &rightDiffList); - QList<Diff> outputLeftDiffList; - QList<Diff> outputRightDiffList; - - if (m_ignoreWhitespace) { - const QList<Diff> leftIntermediate - = Differ::moveWhitespaceIntoEqualities(leftDiffList); - const QList<Diff> rightIntermediate - = Differ::moveWhitespaceIntoEqualities(rightDiffList); - Differ::ignoreWhitespaceBetweenEqualities(leftIntermediate, rightIntermediate, - &outputLeftDiffList, &outputRightDiffList); - } else { - outputLeftDiffList = leftDiffList; - outputRightDiffList = rightDiffList; - } - const ChunkData chunkData = DiffUtils::calculateOriginalData( - outputLeftDiffList, outputRightDiffList); - FileData fileData = DiffUtils::calculateContextData(chunkData, m_contextLineCount, 0); + FileData fileData; + if (!reloadInfo.binaryFiles) { + const QList<Diff> diffList = differ.cleanupSemantics( + differ.diff(reloadInfo.leftText, reloadInfo.rightText)); + + QList<Diff> leftDiffList; + QList<Diff> rightDiffList; + Differ::splitDiffList(diffList, &leftDiffList, &rightDiffList); + QList<Diff> outputLeftDiffList; + QList<Diff> outputRightDiffList; + + if (m_ignoreWhitespace) { + const QList<Diff> leftIntermediate + = Differ::moveWhitespaceIntoEqualities(leftDiffList); + const QList<Diff> rightIntermediate + = Differ::moveWhitespaceIntoEqualities(rightDiffList); + Differ::ignoreWhitespaceBetweenEqualities(leftIntermediate, rightIntermediate, + &outputLeftDiffList, &outputRightDiffList); + } else { + outputLeftDiffList = leftDiffList; + outputRightDiffList = rightDiffList; + } + + const ChunkData chunkData = DiffUtils::calculateOriginalData( + outputLeftDiffList, outputRightDiffList); + fileData = DiffUtils::calculateContextData(chunkData, m_contextLineCount, 0); + } fileData.leftFileInfo = reloadInfo.leftFileInfo; fileData.rightFileInfo = reloadInfo.rightFileInfo; fileData.fileOperation = reloadInfo.fileOperation; + fileData.binaryFiles = reloadInfo.binaryFiles; futureInterface.reportResult(fileData); } @@ -201,13 +210,9 @@ QList<ReloadInput> DiffCurrentFileController::reloadInputList() const Utils::TextFileFormat format = textDocument->format(); QString leftText; - bool leftFileExists = true; - if (Utils::TextFileFormat::readFile(m_fileName, - format.codec, - &leftText, &format, &errorString) - != Utils::TextFileFormat::ReadSuccess) { - leftFileExists = false; - } + const Utils::TextFileFormat::ReadResult leftResult + = Utils::TextFileFormat::readFile(m_fileName, format.codec, + &leftText, &format, &errorString); const QString rightText = textDocument->plainText(); @@ -219,8 +224,9 @@ QList<ReloadInput> DiffCurrentFileController::reloadInputList() const reloadInput.leftFileInfo.typeInfo = tr("Saved"); reloadInput.rightFileInfo.typeInfo = tr("Modified"); reloadInput.rightFileInfo.patchBehaviour = DiffFileInfo::PatchEditor; + reloadInput.binaryFiles = (leftResult == Utils::TextFileFormat::ReadEncodingError); - if (!leftFileExists) + if (leftResult == Utils::TextFileFormat::ReadIOError) reloadInput.fileOperation = FileData::NewFile; result << reloadInput; @@ -259,14 +265,10 @@ QList<ReloadInput> DiffOpenFilesController::reloadInputList() const Utils::TextFileFormat format = textDocument->format(); QString leftText; - bool leftFileExists = true; const QString fileName = textDocument->filePath().toString(); - if (Utils::TextFileFormat::readFile(fileName, - format.codec, - &leftText, &format, &errorString) - != Utils::TextFileFormat::ReadSuccess) { - leftFileExists = false; - } + const Utils::TextFileFormat::ReadResult leftResult + = Utils::TextFileFormat::readFile(fileName, format.codec, + &leftText, &format, &errorString); const QString rightText = textDocument->plainText(); @@ -278,8 +280,9 @@ QList<ReloadInput> DiffOpenFilesController::reloadInputList() const reloadInput.leftFileInfo.typeInfo = tr("Saved"); reloadInput.rightFileInfo.typeInfo = tr("Modified"); reloadInput.rightFileInfo.patchBehaviour = DiffFileInfo::PatchEditor; + reloadInput.binaryFiles = (leftResult == Utils::TextFileFormat::ReadEncodingError); - if (!leftFileExists) + if (leftResult == Utils::TextFileFormat::ReadIOError) reloadInput.fileOperation = FileData::NewFile; result << reloadInput; @@ -321,14 +324,10 @@ QList<ReloadInput> DiffModifiedFilesController::reloadInputList() const Utils::TextFileFormat format = textDocument->format(); QString leftText; - bool leftFileExists = true; const QString fileName = textDocument->filePath().toString(); - if (Utils::TextFileFormat::readFile(fileName, - format.codec, - &leftText, &format, &errorString) - != Utils::TextFileFormat::ReadSuccess) { - leftFileExists = false; - } + const Utils::TextFileFormat::ReadResult leftResult + = Utils::TextFileFormat::readFile(fileName, format.codec, + &leftText, &format, &errorString); const QString rightText = textDocument->plainText(); @@ -340,8 +339,9 @@ QList<ReloadInput> DiffModifiedFilesController::reloadInputList() const reloadInput.leftFileInfo.typeInfo = tr("Saved"); reloadInput.rightFileInfo.typeInfo = tr("Modified"); reloadInput.rightFileInfo.patchBehaviour = DiffFileInfo::PatchEditor; + reloadInput.binaryFiles = (leftResult == Utils::TextFileFormat::ReadEncodingError); - if (!leftFileExists) + if (leftResult == Utils::TextFileFormat::ReadIOError) reloadInput.fileOperation = FileData::NewFile; result << reloadInput; @@ -380,28 +380,25 @@ QList<ReloadInput> DiffExternalFilesController::reloadInputList() const format.codec = EditorManager::defaultTextCodec(); QString leftText; - bool leftFileExists = true; - if (Utils::TextFileFormat::readFile(m_leftFileName, - format.codec, - &leftText, &format, &errorString) - != Utils::TextFileFormat::ReadSuccess) { - leftFileExists = false; - } - QString rightText; - bool rightFileExists = true; - if (Utils::TextFileFormat::readFile(m_rightFileName, - format.codec, - &rightText, &format, &errorString) - != Utils::TextFileFormat::ReadSuccess) { - rightFileExists = false; - } + + const Utils::TextFileFormat::ReadResult leftResult + = Utils::TextFileFormat::readFile(m_leftFileName, format.codec, + &leftText, &format, &errorString); + const Utils::TextFileFormat::ReadResult rightResult + = Utils::TextFileFormat::readFile(m_rightFileName, format.codec, + &rightText, &format, &errorString); ReloadInput reloadInput; reloadInput.leftText = leftText; reloadInput.rightText = rightText; reloadInput.leftFileInfo.fileName = m_leftFileName; reloadInput.rightFileInfo.fileName = m_rightFileName; + reloadInput.binaryFiles = (leftResult == Utils::TextFileFormat::ReadEncodingError + || rightResult == Utils::TextFileFormat::ReadEncodingError); + + const bool leftFileExists = (leftResult != Utils::TextFileFormat::ReadIOError); + const bool rightFileExists = (rightResult != Utils::TextFileFormat::ReadIOError); if (!leftFileExists && rightFileExists) reloadInput.fileOperation = FileData::NewFile; else if (leftFileExists && !rightFileExists) |