forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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,26 +525,36 @@ 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 {
|
||||||
str << "--- ";
|
if (!fileData.chunks.isEmpty()) {
|
||||||
if (formatFlags & AddLevel)
|
str << "--- ";
|
||||||
str << "a/";
|
str << leftFileName(fileData, formatFlags) << "\n";
|
||||||
str << fileData.leftFileInfo.fileName << "\n+++ ";
|
str << "+++ ";
|
||||||
if (formatFlags & AddLevel)
|
str << rightFileName(fileData, formatFlags) << "\n";
|
||||||
str << "b/";
|
for (int j = 0; j < fileData.chunks.count(); j++) {
|
||||||
str << fileData.rightFileInfo.fileName << '\n';
|
str << makePatch(fileData.chunks.at(j),
|
||||||
for (int j = 0; j < fileData.chunks.count(); j++) {
|
(j == fileData.chunks.count() - 1)
|
||||||
str << makePatch(fileData.chunks.at(j),
|
&& fileData.lastChunkAtTheEndOfFile);
|
||||||
(j == fileData.chunks.count() - 1)
|
}
|
||||||
&& fileData.lastChunkAtTheEndOfFile);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user