diff --git a/src/plugins/diffeditor/diffeditorcontroller.cpp b/src/plugins/diffeditor/diffeditorcontroller.cpp index c07adfc7874..f426ac5f5d2 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.cpp +++ b/src/plugins/diffeditor/diffeditorcontroller.cpp @@ -43,6 +43,8 @@ namespace DiffEditor { DiffEditorController::DiffEditorController(QObject *parent) : QObject(parent), + m_diffFileIndex(-1), + m_chunkIndex(-1), m_descriptionEnabled(false), m_contextLinesNumber(3), m_ignoreWhitespace(true), @@ -99,30 +101,33 @@ bool DiffEditorController::isIgnoreWhitespace() const return m_ignoreWhitespace; } -QString DiffEditorController::makePatch(int diffFileIndex, - int chunkIndex, - bool revert) const +QString DiffEditorController::makePatch(bool revert, bool addPrefix) const { - if (diffFileIndex < 0 || chunkIndex < 0) + if (m_diffFileIndex < 0 || m_chunkIndex < 0) return QString(); - if (diffFileIndex >= m_diffFiles.count()) + if (m_diffFileIndex >= m_diffFiles.count()) return QString(); - const FileData fileData = m_diffFiles.at(diffFileIndex); - if (chunkIndex >= fileData.chunks.count()) + const FileData fileData = m_diffFiles.at(m_diffFileIndex); + if (m_chunkIndex >= fileData.chunks.count()) return QString(); - const ChunkData chunkData = fileData.chunks.at(chunkIndex); - const bool lastChunk = (chunkIndex == fileData.chunks.count() - 1); + const ChunkData chunkData = fileData.chunks.at(m_chunkIndex); + const bool lastChunk = (m_chunkIndex == fileData.chunks.count() - 1); const QString fileName = revert ? fileData.rightFileInfo.fileName : fileData.leftFileInfo.fileName; + QString leftPrefix, rightPrefix; + if (addPrefix) { + leftPrefix = QLatin1String("a/"); + rightPrefix = QLatin1String("b/"); + } return DiffUtils::makePatch(chunkData, - fileName, - fileName, + leftPrefix + fileName, + rightPrefix + fileName, lastChunk && fileData.lastChunkAtTheEndOfFile); } @@ -269,7 +274,9 @@ void DiffEditorController::requestChunkActions(QMenu *menu, int diffFileIndex, int chunkIndex) { - emit chunkActionsRequested(menu, diffFileIndex, chunkIndex); + m_diffFileIndex = diffFileIndex; + m_chunkIndex = chunkIndex; + emit chunkActionsRequested(menu, diffFileIndex >= 0 && chunkIndex >= 0); } void DiffEditorController::requestSaveState() diff --git a/src/plugins/diffeditor/diffeditorcontroller.h b/src/plugins/diffeditor/diffeditorcontroller.h index 4505d5f5b93..abf4cd53ebe 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.h +++ b/src/plugins/diffeditor/diffeditorcontroller.h @@ -55,7 +55,7 @@ public: int contextLinesNumber() const; bool isIgnoreWhitespace() const; - QString makePatch(int diffFileIndex, int chunkIndex, bool revert) const; + QString makePatch(bool revert, bool addPrefix = false) const; DiffEditorReloader *reloader() const; void setReloader(DiffEditorReloader *reloader); @@ -86,9 +86,7 @@ signals: void descriptionEnablementChanged(bool on); void contextLinesNumberChanged(int lines); void ignoreWhitespaceChanged(bool ignore); - void chunkActionsRequested(QMenu *menu, - int diffFileIndex, - int chunkIndex); + void chunkActionsRequested(QMenu *menu, bool isValid); void saveStateRequested(); void restoreStateRequested(); void expandBranchesRequested(const QString &revision); @@ -99,6 +97,8 @@ private: QString m_clearMessage; QList m_diffFiles; + int m_diffFileIndex; + int m_chunkIndex; QString m_workingDirectory; QString m_description; bool m_descriptionEnabled; diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp index ae663c12f70..48740f47f00 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp @@ -1319,9 +1319,7 @@ void SideBySideDiffEditorWidget::slotSendChunkToCodePaster() if (m_contextMenuChunkIndex >= fileData.chunks.count()) return; - const QString patch = m_controller->makePatch(m_contextMenuFileIndex, - m_contextMenuChunkIndex, - false); + const QString patch = m_controller->makePatch(false); if (patch.isEmpty()) return; @@ -1341,27 +1339,27 @@ void SideBySideDiffEditorWidget::slotSendChunkToCodePaster() void SideBySideDiffEditorWidget::slotApplyChunk() { - patch(m_contextMenuFileIndex, m_contextMenuChunkIndex, false); + patch(false); } void SideBySideDiffEditorWidget::slotRevertChunk() { - patch(m_contextMenuFileIndex, m_contextMenuChunkIndex, true); + patch(true); } -void SideBySideDiffEditorWidget::patch(int diffFileIndex, int chunkIndex, bool revert) +void SideBySideDiffEditorWidget::patch(bool revert) { if (!m_controller) return; - if (diffFileIndex < 0 || chunkIndex < 0) + if (m_contextMenuFileIndex < 0 || m_contextMenuChunkIndex < 0) return; - if (diffFileIndex >= m_contextFileData.count()) + if (m_contextMenuFileIndex >= m_contextFileData.count()) return; - const FileData fileData = m_contextFileData.at(diffFileIndex); - if (chunkIndex >= fileData.chunks.count()) + const FileData fileData = m_contextFileData.at(m_contextMenuFileIndex); + if (m_contextMenuChunkIndex >= fileData.chunks.count()) return; const QString title = revert ? tr("Revert Chunk") : tr("Apply Chunk"); @@ -1385,7 +1383,7 @@ void SideBySideDiffEditorWidget::patch(int diffFileIndex, int chunkIndex, bool r ? QFileInfo(fileName).absolutePath() : m_controller->workingDirectory(); - const QString patch = m_controller->makePatch(diffFileIndex, chunkIndex, revert); + const QString patch = m_controller->makePatch(revert); if (patch.isEmpty()) return; diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.h b/src/plugins/diffeditor/sidebysidediffeditorwidget.h index 7367f489f9b..999f0f2a78b 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.h +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.h @@ -94,7 +94,7 @@ private: // void synchronizeFoldings(SideDiffEditorWidget *source, SideDiffEditorWidget *destination); void jumpToOriginalFile(const QString &fileName, int lineNumber, int columnNumber); - void patch(int diffFileIndex, int chunkIndex, bool revert); + void patch(bool revert); DiffEditorGuiController *m_guiController; DiffEditorController *m_controller; diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp index 2c4918c863c..9bb0ebe7897 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp @@ -298,9 +298,7 @@ void UnifiedDiffEditorWidget::slotSendChunkToCodePaster() if (m_contextMenuChunkIndex >= fileData.chunks.count()) return; - const QString patch = m_controller->makePatch(m_contextMenuFileIndex, - m_contextMenuChunkIndex, - false); + const QString patch = m_controller->makePatch(false); if (patch.isEmpty()) return; @@ -321,27 +319,27 @@ void UnifiedDiffEditorWidget::slotSendChunkToCodePaster() void UnifiedDiffEditorWidget::slotApplyChunk() { - patch(m_contextMenuFileIndex, m_contextMenuChunkIndex, false); + patch(false); } void UnifiedDiffEditorWidget::slotRevertChunk() { - patch(m_contextMenuFileIndex, m_contextMenuChunkIndex, true); + patch(true); } -void UnifiedDiffEditorWidget::patch(int diffFileIndex, int chunkIndex, bool revert) +void UnifiedDiffEditorWidget::patch(bool revert) { if (!m_controller) return; - if (diffFileIndex < 0 || chunkIndex < 0) + if (m_contextMenuFileIndex < 0 || m_contextMenuChunkIndex < 0) return; - if (diffFileIndex >= m_contextFileData.count()) + if (m_contextMenuFileIndex >= m_contextFileData.count()) return; - const FileData fileData = m_contextFileData.at(diffFileIndex); - if (chunkIndex >= fileData.chunks.count()) + const FileData fileData = m_contextFileData.at(m_contextMenuFileIndex); + if (m_contextMenuChunkIndex >= fileData.chunks.count()) return; const QString title = revert ? tr("Revert Chunk") : tr("Apply Chunk"); @@ -364,9 +362,7 @@ void UnifiedDiffEditorWidget::patch(int diffFileIndex, int chunkIndex, bool reve ? QFileInfo(fileName).absolutePath() : m_controller->workingDirectory(); - const QString patch = m_controller->makePatch(diffFileIndex, - chunkIndex, - revert); + const QString patch = m_controller->makePatch(revert); if (patch.isEmpty()) return; diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.h b/src/plugins/diffeditor/unifieddiffeditorwidget.h index ef479129285..d82a292fbe1 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.h +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.h @@ -112,7 +112,7 @@ private: void addContextMenuActions(QMenu *menu, int diffFileIndex, int chunkIndex); - void patch(int diffFileIndex, int chunkIndex, bool revert); + void patch(bool revert); DiffEditorGuiController *m_guiController; DiffEditorController *m_controller; diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 34a04dc4afb..743a7065a29 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -731,9 +731,7 @@ GitClient::GitClient(GitSettings *settings) : m_cachedGitVersion(0), m_msgWait(tr("Waiting for data...")), m_settings(settings), - m_disableEditor(false), - m_contextDiffFileIndex(-1), - m_contextChunkIndex(-1) + m_disableEditor(false) { QTC_CHECK(settings); connect(ICore::instance(), SIGNAL(saveSettingsRequested()), this, SLOT(saveSettings())); @@ -823,8 +821,8 @@ GitDiffEditorReloader *GitClient::findOrCreateDiffEditor(const QString &document QTC_ASSERT(diffEditorDocument, return 0); controller = diffEditorDocument->controller(); - connect(controller, SIGNAL(chunkActionsRequested(QMenu*,int,int)), - this, SLOT(slotChunkActionsRequested(QMenu*,int,int)), Qt::DirectConnection); + connect(controller, SIGNAL(chunkActionsRequested(QMenu*,bool)), + this, SLOT(slotChunkActionsRequested(QMenu*,bool)), Qt::DirectConnection); connect(controller, SIGNAL(expandBranchesRequested(QString)), this, SLOT(branchesForCommit(QString))); @@ -839,7 +837,7 @@ GitDiffEditorReloader *GitClient::findOrCreateDiffEditor(const QString &document return reloader; } -void GitClient::slotChunkActionsRequested(QMenu *menu, int diffFileIndex, int chunkIndex) +void GitClient::slotChunkActionsRequested(QMenu *menu, bool isValid) { menu->addSeparator(); QAction *stageChunkAction = menu->addAction(tr("Stage Chunk")); @@ -847,53 +845,20 @@ void GitClient::slotChunkActionsRequested(QMenu *menu, int diffFileIndex, int ch QAction *unstageChunkAction = menu->addAction(tr("Unstage Chunk")); connect(unstageChunkAction, SIGNAL(triggered()), this, SLOT(slotUnstageChunk())); - m_contextDiffFileIndex = diffFileIndex; - m_contextChunkIndex = chunkIndex; m_contextController = qobject_cast(sender()); - if (m_contextDiffFileIndex < 0 || m_contextChunkIndex < 0 || !m_contextController) { + if (!isValid || !m_contextController) { stageChunkAction->setEnabled(false); unstageChunkAction->setEnabled(false); } } -QString GitClient::makePatch(int diffFileIndex, int chunkIndex, bool revert) const -{ - if (m_contextController.isNull()) - return QString(); - - if (diffFileIndex < 0 || chunkIndex < 0) - return QString(); - - QList fileDataList = m_contextController->diffFiles(); - - if (diffFileIndex >= fileDataList.count()) - return QString(); - - const DiffEditor::FileData fileData = fileDataList.at(diffFileIndex); - if (chunkIndex >= fileData.chunks.count()) - return QString(); - - const DiffEditor::ChunkData chunkData = fileData.chunks.at(chunkIndex); - const bool lastChunk = (chunkIndex == fileData.chunks.count() - 1); - - const QString fileName = revert - ? fileData.rightFileInfo.fileName - : fileData.leftFileInfo.fileName; - - return DiffEditor::DiffUtils::makePatch(chunkData, - QLatin1String("a/") + fileName, - QLatin1String("b/") + fileName, - lastChunk && fileData.lastChunkAtTheEndOfFile); -} - void GitClient::slotStageChunk() { if (m_contextController.isNull()) return; - const QString patch = makePatch(m_contextDiffFileIndex, - m_contextChunkIndex, false); + const QString patch = m_contextController->makePatch(false, true); if (patch.isEmpty()) return; @@ -905,8 +870,7 @@ void GitClient::slotUnstageChunk() if (m_contextController.isNull()) return; - const QString patch = makePatch(m_contextDiffFileIndex, - m_contextChunkIndex, true); + const QString patch = m_contextController->makePatch(true, true); if (patch.isEmpty()) return; diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 9e14e820f19..f8f5ab780eb 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -353,13 +353,12 @@ private slots: QString change, int lineNumber); void finishSubmoduleUpdate(); void fetchFinished(const QVariant &cookie); - void slotChunkActionsRequested(QMenu *menu, int diffFileIndex, int chunkIndex); + void slotChunkActionsRequested(QMenu *menu, bool isValid); void slotStageChunk(); void slotUnstageChunk(); void branchesForCommit(const QString &revision); private: - QString makePatch(int diffFileIndex, int chunkIndex, bool revert) const; void stage(const QString &patch, bool revert); QByteArray readConfigBytes(const QString &workingDirectory, const QString &configVar) const; QTextCodec *getSourceCodec(const QString &file) const; @@ -442,8 +441,6 @@ private: QMap m_stashInfo; QStringList m_updatedSubmodules; bool m_disableEditor; - int m_contextDiffFileIndex; - int m_contextChunkIndex; QPointer m_contextController; QFutureSynchronizer m_synchronizer; // for commit updates };