From 62133696750624d16ef729da6f0528da4b2690a8 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 11 Jul 2017 09:44:35 +0200 Subject: DiffEditor: Fix saving diff containing new or deleted files Fix also the case when new file was empty. Fix some const correctness. Change-Id: Ied71c3de0398914e595fbf542f1b8ec3659d69b6 Reviewed-by: Tobias Hunger --- src/plugins/diffeditor/diffeditorplugin.cpp | 2 +- src/plugins/diffeditor/diffutils.cpp | 72 ++++++++++++++++++++++------- 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index 6391c0ae0a..f906fdb027 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -856,7 +856,7 @@ void DiffEditor::Internal::DiffEditorPlugin::testMakePatch() QFETCH(bool, lastChunk); QFETCH(QString, patchText); - QString result = DiffUtils::makePatch(sourceChunk, leftFileName, rightFileName, lastChunk); + const QString result = DiffUtils::makePatch(sourceChunk, leftFileName, rightFileName, lastChunk); QCOMPARE(result, patchText); diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp index aa4ee87027..a9d9b11ae2 100644 --- a/src/plugins/diffeditor/diffutils.cpp +++ b/src/plugins/diffeditor/diffutils.cpp @@ -486,6 +486,34 @@ QString DiffUtils::makePatch(const ChunkData &chunkData, return diffText; } +static QString leftFileName(const FileData &fileData, unsigned formatFlags) +{ + QString diffText; + QTextStream str(&diffText); + if (fileData.fileOperation == FileData::NewFile) { + str << "/dev/null"; + } else { + if (formatFlags & DiffUtils::AddLevel) + str << "a/"; + str << fileData.leftFileInfo.fileName; + } + return diffText; +} + +static QString rightFileName(const FileData &fileData, unsigned formatFlags) +{ + QString diffText; + QTextStream str(&diffText); + if (fileData.fileOperation == FileData::DeleteFile) { + str << "/dev/null"; + } else { + if (formatFlags & DiffUtils::AddLevel) + str << "b/"; + str << fileData.rightFileInfo.fileName; + } + return diffText; +} + QString DiffUtils::makePatch(const QList &fileDataList, unsigned formatFlags) { QString diffText; @@ -497,26 +525,36 @@ QString DiffUtils::makePatch(const QList &fileDataList, unsigned forma str << "diff --git a/" << fileData.leftFileInfo.fileName << " b/" << fileData.rightFileInfo.fileName << '\n'; } + if (fileData.fileOperation == FileData::NewFile + || fileData.fileOperation == FileData::DeleteFile) { // git only? + if (fileData.fileOperation == FileData::NewFile) + str << "new"; + else + str << "deleted"; + str << " file mode 100644\n"; + } + str << "index " << fileData.leftFileInfo.typeInfo << ".." << fileData.rightFileInfo.typeInfo; + if (fileData.fileOperation == FileData::ChangeFile) + str << " 100644"; + str << "\n"; + if (fileData.binaryFiles) { str << "Binary files "; - if (formatFlags & AddLevel) - str << "a/"; - str << fileData.leftFileInfo.fileName << " and "; - if (formatFlags & AddLevel) - str << "b/"; - str << fileData.rightFileInfo.fileName << " differ\n"; + str << leftFileName(fileData, formatFlags); + str << " and "; + str << rightFileName(fileData, formatFlags); + str << " differ\n"; } else { - str << "--- "; - if (formatFlags & AddLevel) - str << "a/"; - str << fileData.leftFileInfo.fileName << "\n+++ "; - if (formatFlags & AddLevel) - str << "b/"; - str << fileData.rightFileInfo.fileName << '\n'; - for (int j = 0; j < fileData.chunks.count(); j++) { - str << makePatch(fileData.chunks.at(j), - (j == fileData.chunks.count() - 1) - && fileData.lastChunkAtTheEndOfFile); + if (!fileData.chunks.isEmpty()) { + str << "--- "; + str << leftFileName(fileData, formatFlags) << "\n"; + str << "+++ "; + str << rightFileName(fileData, formatFlags) << "\n"; + for (int j = 0; j < fileData.chunks.count(); j++) { + str << makePatch(fileData.chunks.at(j), + (j == fileData.chunks.count() - 1) + && fileData.lastChunkAtTheEndOfFile); + } } } } -- cgit v1.2.1