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 <tobias.hunger@qt.io>
This commit is contained in:
Jarek Kobus
2017-07-11 09:44:35 +02:00
parent e3ce4b150d
commit 6213369675
2 changed files with 56 additions and 18 deletions

View File

@@ -856,7 +856,7 @@ void DiffEditor::Internal::DiffEditorPlugin::testMakePatch()
QFETCH(bool, lastChunk); QFETCH(bool, lastChunk);
QFETCH(QString, patchText); QFETCH(QString, patchText);
QString result = DiffUtils::makePatch(sourceChunk, leftFileName, rightFileName, lastChunk); const QString result = DiffUtils::makePatch(sourceChunk, leftFileName, rightFileName, lastChunk);
QCOMPARE(result, patchText); QCOMPARE(result, patchText);

View File

@@ -486,6 +486,34 @@ QString DiffUtils::makePatch(const ChunkData &chunkData,
return diffText; 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<FileData> &fileDataList, unsigned formatFlags) QString DiffUtils::makePatch(const QList<FileData> &fileDataList, unsigned formatFlags)
{ {
QString diffText; QString diffText;
@@ -497,22 +525,31 @@ QString DiffUtils::makePatch(const QList<FileData> &fileDataList, unsigned forma
str << "diff --git a/" << fileData.leftFileInfo.fileName str << "diff --git a/" << fileData.leftFileInfo.fileName
<< " b/" << fileData.rightFileInfo.fileName << '\n'; << " 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) { if (fileData.binaryFiles) {
str << "Binary files "; str << "Binary files ";
if (formatFlags & AddLevel) str << leftFileName(fileData, formatFlags);
str << "a/"; str << " and ";
str << fileData.leftFileInfo.fileName << " and "; str << rightFileName(fileData, formatFlags);
if (formatFlags & AddLevel) str << " differ\n";
str << "b/";
str << fileData.rightFileInfo.fileName << " differ\n";
} else { } else {
if (!fileData.chunks.isEmpty()) {
str << "--- "; str << "--- ";
if (formatFlags & AddLevel) str << leftFileName(fileData, formatFlags) << "\n";
str << "a/"; str << "+++ ";
str << fileData.leftFileInfo.fileName << "\n+++ "; str << rightFileName(fileData, formatFlags) << "\n";
if (formatFlags & AddLevel)
str << "b/";
str << fileData.rightFileInfo.fileName << '\n';
for (int j = 0; j < fileData.chunks.count(); j++) { for (int j = 0; j < fileData.chunks.count(); j++) {
str << makePatch(fileData.chunks.at(j), str << makePatch(fileData.chunks.at(j),
(j == fileData.chunks.count() - 1) (j == fileData.chunks.count() - 1)
@@ -520,6 +557,7 @@ QString DiffUtils::makePatch(const QList<FileData> &fileDataList, unsigned forma
} }
} }
} }
}
return diffText; return diffText;
} }