diff --git a/doc/src/howto/creator-vcs.qdoc b/doc/src/howto/creator-vcs.qdoc index f045ae67e264ee71bf023f18911dfb3ef4ed3528..edea52b557fc6823fd9a529956ef98ce9119232d 100644 --- a/doc/src/howto/creator-vcs.qdoc +++ b/doc/src/howto/creator-vcs.qdoc @@ -199,6 +199,7 @@ display a description of the change including the diff. Right-clicking on an identifier brings up a context menu that lets you show annotation views of previous versions (see \l{Annotating Files}). + With Git you can also choose to cherry-pick or revert a change. \image qtcreator-vcs-log.png diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index 69e0b52cb139087e74eb0cba273b97c35d768ad0..d9413d550e80c31570678826a96741cfac62765a 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -219,6 +219,20 @@ void GitEditor::commandFinishedGotoLine(bool ok, int /* exitCode */, const QVari } } +void GitEditor::cherryPickChange() +{ + const QFileInfo fi(source()); + const QString workingDirectory = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath(); + GitPlugin::instance()->gitClient()->cherryPickCommit(workingDirectory, m_currentChange); +} + +void GitEditor::revertChange() +{ + const QFileInfo fi(source()); + const QString workingDirectory = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath(); + GitPlugin::instance()->gitClient()->revertCommit(workingDirectory, m_currentChange); +} + QString GitEditor::decorateVersion(const QString &revision) const { const QFileInfo fi(source()); @@ -249,6 +263,12 @@ bool GitEditor::isValidRevision(const QString &revision) const return GitPlugin::instance()->gitClient()->isValidRevision(revision); } +void GitEditor::addChangeActions(QMenu *menu, const QString &change) +{ + m_currentChange = change; + menu->addAction(tr("Cherry-pick Change %1").arg(change), this, SLOT(cherryPickChange())); + menu->addAction(tr("Revert Change %1").arg(change), this, SLOT(revertChange())); +} + } // namespace Internal } // namespace Git - diff --git a/src/plugins/git/giteditor.h b/src/plugins/git/giteditor.h index 6b55f0b3ef0e036e8546ca878b84ee8696c55a86..f51e15e41a6eec2ab0fe605bcf7da49fb114f86a 100644 --- a/src/plugins/git/giteditor.h +++ b/src/plugins/git/giteditor.h @@ -54,6 +54,10 @@ public slots: // Matches the signature of the finished signal of GitCommand void commandFinishedGotoLine(bool ok, int exitCode, const QVariant &v); +private slots: + void cherryPickChange(); + void revertChange(); + private: QSet<QString> annotationChanges() const; QString changeUnderCursor(const QTextCursor &) const; @@ -61,9 +65,11 @@ private: QString decorateVersion(const QString &revision) const; QStringList annotationPreviousVersions(const QString &revision) const; bool isValidRevision(const QString &revision) const; + void addChangeActions(QMenu *menu, const QString &change); mutable QRegExp m_changeNumberPattern8; mutable QRegExp m_changeNumberPattern40; + QString m_currentChange; }; } // namespace Git diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index a4751bc6baf966f0f9b9b6649f7484a52a0e9461..38b74cc590998c4334ba0abfdd469df1ff2d9bb0 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -365,6 +365,7 @@ void ChangeTextCursorHandler::fillContextMenu(QMenu *menu, EditorContentType typ default: break; } + widget->addChangeActions(menu, m_currentChange); } QString ChangeTextCursorHandler::currentContents() const @@ -1449,6 +1450,10 @@ QString VcsBaseEditorWidget::fileNameFromDiffSpecification(const QTextBlock &inB return QString(); } +void VcsBaseEditorWidget::addChangeActions(QMenu *, const QString &) +{ +} + QString VcsBaseEditorWidget::decorateVersion(const QString &revision) const { return revision; diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h index ff870923898c89c17a1d448b347ebf4c8529f9bc..1b2ad08fe88ea00d809fd4dc0754c889727ada90 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.h +++ b/src/plugins/vcsbase/vcsbaseeditor.h @@ -236,6 +236,9 @@ protected: // Revert a patch chunk. Default implementation uses patch.exe virtual bool applyDiffChunk(const DiffChunk &dc, bool revert = false) const; + virtual void addChangeActions(QMenu *menu, const QString &change); + +private: // Implement to return a set of change identifiers in // annotation mode virtual QSet<QString> annotationChanges() const = 0;