DiffEditor: fix revert chunk for diffs of modified files

Apply chunk action doesn't make sense for that case,
will stay disabled.

Task-number: QTCREATORBUG-17136
Change-Id: Idce31b3aa9d354536a01607c10b20273158961d5
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Jarek Kobus
2016-10-19 16:44:25 +02:00
committed by Jarek Kobus
parent 344f255fa9
commit 8224c1c95d
7 changed files with 81 additions and 18 deletions

View File

@@ -87,7 +87,9 @@ DiffEditorController *DiffEditorDocument::controller() const
return m_controller;
}
QString DiffEditorDocument::makePatch(int fileIndex, int chunkIndex, bool revert, bool addPrefix) const
QString DiffEditorDocument::makePatch(int fileIndex, int chunkIndex,
bool revert, bool addPrefix,
const QString &overriddenFileName) const
{
if (fileIndex < 0 || chunkIndex < 0)
return QString();
@@ -102,9 +104,10 @@ QString DiffEditorDocument::makePatch(int fileIndex, int chunkIndex, bool revert
const ChunkData &chunkData = fileData.chunks.at(chunkIndex);
const bool lastChunk = (chunkIndex == fileData.chunks.count() - 1);
const QString fileName = revert
? fileData.rightFileInfo.fileName
: fileData.leftFileInfo.fileName;
const QString fileName = !overriddenFileName.isEmpty()
? overriddenFileName : revert
? fileData.rightFileInfo.fileName
: fileData.leftFileInfo.fileName;
QString leftPrefix, rightPrefix;
if (addPrefix) {

View File

@@ -46,7 +46,9 @@ public:
DiffEditorController *controller() const;
QString makePatch(int fileIndex, int chunkIndex, bool revert, bool addPrefix = false) const;
QString makePatch(int fileIndex, int chunkIndex,
bool revert, bool addPrefix = false,
const QString &overriddenFileName = QString()) const;
void setDiffFiles(const QList<FileData> &data, const QString &directory,
const QString &startupFile = QString());

View File

@@ -143,6 +143,7 @@ void DiffCurrentFileController::reload()
fileData.rightFileInfo.fileName = m_fileName;
fileData.leftFileInfo.typeInfo = tr("Saved");
fileData.rightFileInfo.typeInfo = tr("Modified");
fileData.rightFileInfo.patchBehaviour = DiffFileInfo::PatchEditor;
if (!leftFileExists)
fileData.fileOperation = FileData::NewFile;
@@ -201,6 +202,7 @@ void DiffOpenFilesController::reload()
fileData.rightFileInfo.fileName = fileName;
fileData.leftFileInfo.typeInfo = tr("Saved");
fileData.rightFileInfo.typeInfo = tr("Modified");
fileData.rightFileInfo.patchBehaviour = DiffFileInfo::PatchEditor;
if (!leftFileExists)
fileData.fileOperation = FileData::NewFile;
@@ -261,6 +263,7 @@ void DiffModifiedFilesController::reload()
fileData.rightFileInfo.fileName = fileName;
fileData.leftFileInfo.typeInfo = tr("Saved");
fileData.rightFileInfo.typeInfo = tr("Modified");
fileData.rightFileInfo.patchBehaviour = DiffFileInfo::PatchEditor;
if (!leftFileExists)
fileData.fileOperation = FileData::NewFile;

View File

@@ -32,6 +32,7 @@
#include <coreplugin/patchtool.h>
#include <texteditor/fontsettings.h>
#include <texteditor/textdocument.h>
#include <extensionsystem/pluginmanager.h>
@@ -42,6 +43,7 @@
#include <QDir>
#include <QMenu>
#include <QMessageBox>
#include <QTemporaryFile>
#include <QTextCodec>
using namespace Core;
@@ -77,27 +79,60 @@ void DiffEditorWidgetController::patch(bool revert)
return;
}
const int strip = m_document->baseDirectory().isEmpty() ? -1 : 0;
const FileData fileData = m_contextFileData.at(m_contextMenuFileIndex);
const QString fileName = revert
? fileData.rightFileInfo.fileName
: fileData.leftFileInfo.fileName;
const DiffFileInfo::PatchBehaviour patchBehaviour = revert
? fileData.rightFileInfo.patchBehaviour
: fileData.leftFileInfo.patchBehaviour;
const QString workingDirectory = m_document->baseDirectory().isEmpty()
? QFileInfo(fileName).absolutePath()
: m_document->baseDirectory();
const QString absFileName = QFileInfo(workingDirectory + '/' + QFileInfo(fileName).fileName()).absoluteFilePath();
const QString patch = m_document->makePatch(m_contextMenuFileIndex, m_contextMenuChunkIndex, revert);
if (patchBehaviour == DiffFileInfo::PatchFile) {
const int strip = m_document->baseDirectory().isEmpty() ? -1 : 0;
if (patch.isEmpty())
return;
const QString patch = m_document->makePatch(m_contextMenuFileIndex, m_contextMenuChunkIndex, revert);
const QString absFileName = QFileInfo(workingDirectory + '/' + fileName).absoluteFilePath();
FileChangeBlocker fileChangeBlocker(absFileName);
if (PatchTool::runPatch(EditorManager::defaultTextCodec()->fromUnicode(patch),
workingDirectory, strip, revert))
m_document->reload();
if (patch.isEmpty())
return;
FileChangeBlocker fileChangeBlocker(absFileName);
if (PatchTool::runPatch(EditorManager::defaultTextCodec()->fromUnicode(patch),
workingDirectory, strip, revert))
m_document->reload();
} else { // PatchEditor
TextEditor::TextDocument *textDocument = qobject_cast<TextEditor::TextDocument *>(
DocumentModel::documentForFilePath(absFileName));
if (!textDocument)
return;
QTemporaryFile contentsCopy;
if (!contentsCopy.open())
return;
contentsCopy.write(textDocument->contents());
contentsCopy.close();
const QString contentsCopyFileName = contentsCopy.fileName();
const QString contentsCopyDir = QFileInfo(contentsCopyFileName).absolutePath();
const QString patch = m_document->makePatch(m_contextMenuFileIndex,
m_contextMenuChunkIndex, revert, false, QFileInfo(contentsCopyFileName).fileName());
if (patch.isEmpty())
return;
if (PatchTool::runPatch(EditorManager::defaultTextCodec()->fromUnicode(patch),
contentsCopyDir, 0, revert)) {
QString errorString;
if (textDocument->reload(&errorString, contentsCopyFileName))
m_document->reload();
}
}
}
void DiffEditorWidgetController::jumpToOriginalFile(const QString &fileName,

View File

@@ -38,12 +38,18 @@ class Diff;
class DIFFEDITOR_EXPORT DiffFileInfo {
public:
enum PatchBehaviour {
PatchFile,
PatchEditor
};
DiffFileInfo() {}
DiffFileInfo(const QString &file) : fileName(file) {}
DiffFileInfo(const QString &file, const QString &type)
: fileName(file), typeInfo(type) {}
QString fileName;
QString typeInfo;
PatchBehaviour patchBehaviour = PatchFile;
};
class DIFFEDITOR_EXPORT TextLineData {