From 05a6fc48ba6abf017aa4336f248a3f11e1cf8c86 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh <orgad.shaneh@audiocodes.com> Date: Tue, 28 May 2013 20:19:53 +0300 Subject: [PATCH] Git: Support change links on commit editor Useful for commit messages with "reverts <hash>" for example. Can later be extended for interactive rebase Change-Id: Ibf77433ecddfacbd8d443636ddbc406bda474aa7 Reviewed-by: Tobias Hunger <tobias.hunger@digia.com> --- src/plugins/git/gitclient.cpp | 13 +++++++++++++ src/plugins/git/gitclient.h | 1 + src/plugins/git/giteditor.cpp | 16 ++++++++++++++++ src/plugins/git/giteditor.h | 2 ++ src/plugins/vcsbase/vcsbaseeditor.cpp | 15 +++++++++++++-- src/plugins/vcsbase/vcsbaseeditor.h | 1 + 6 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 6a1324683bf..a351299dcdf 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -794,6 +794,19 @@ QString GitClient::findGitDirForRepository(const QString &repositoryDir) const return res; } +QString GitClient::findRepositoryForGitDir(const QString &gitDir) const +{ + static QHash<QString, QString> gitDirCache; + QString &res = gitDirCache[gitDir]; + if (!res.isEmpty()) + return res; + QByteArray outputText; + QStringList arguments; + arguments << QLatin1String("rev-parse") << QLatin1String("--show-toplevel"); + fullySynchronousGit(gitDir, arguments, &outputText, 0, false); + return QString::fromLocal8Bit(outputText.trimmed()); +} + VcsBase::VcsBaseEditorWidget *GitClient::findExistingVCSEditor(const char *registerDynamicProperty, const QString &dynamicPropertyValue) const { diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 9dc1d936f73..4b230594b62 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -138,6 +138,7 @@ public: QString findRepositoryForDirectory(const QString &dir); QString findGitDirForRepository(const QString &repositoryDir) const; + QString findRepositoryForGitDir(const QString &gitDir) const; void diff(const QString &workingDirectory, const QStringList &diffArgs, const QString &fileName); void diff(const QString &workingDirectory, const QStringList &diffArgs, diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index 2c6062799bf..1819fd7a34c 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -235,6 +235,16 @@ void GitEditor::init() new GitSubmitHighlighter(baseTextDocument().data()); } +bool GitEditor::open(QString *errorString, const QString &fileName, const QString &realFileName) +{ + bool res = VcsBaseEditorWidget::open(errorString, fileName, realFileName); + if (editor()->id() == Git::Constants::GIT_COMMIT_TEXT_EDITOR_ID) { + QFileInfo fi(fileName); + setSource(GitPlugin::instance()->gitClient()->findRepositoryForGitDir(fi.absolutePath())); + } + return res; +} + QString GitEditor::decorateVersion(const QString &revision) const { const QFileInfo fi(source()); @@ -284,5 +294,11 @@ QString GitEditor::revisionSubject(const QTextBlock &inBlock) const return QString(); } +bool GitEditor::supportChangeLinks() const +{ + return VcsBaseEditorWidget::supportChangeLinks() + || (editor()->id() == Git::Constants::GIT_COMMIT_TEXT_EDITOR_ID); +} + } // namespace Internal } // namespace Git diff --git a/src/plugins/git/giteditor.h b/src/plugins/git/giteditor.h index 5010fd81937..b5539892c90 100644 --- a/src/plugins/git/giteditor.h +++ b/src/plugins/git/giteditor.h @@ -60,6 +60,7 @@ private slots: private: void init(); + bool open(QString *errorString, const QString &fileName, const QString &realFileName); QSet<QString> annotationChanges() const; QString changeUnderCursor(const QTextCursor &) const; VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes, const QColor &bg) const; @@ -68,6 +69,7 @@ private: bool isValidRevision(const QString &revision) const; void addChangeActions(QMenu *menu, const QString &change); QString revisionSubject(const QTextBlock &inBlock) const; + bool supportChangeLinks() const; mutable QRegExp m_changeNumberPattern; QString m_currentChange; diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index ecf43b20056..00445b2375f 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -663,6 +663,17 @@ void VcsBaseEditorWidget::setLogEntryPattern(const QRegExp &pattern) d->m_logEntryPattern = pattern; } +bool VcsBaseEditorWidget::supportChangeLinks() const +{ + switch (d->m_parameters->type) { + case LogOutput: + case AnnotateOutput: + return true; + default: + return false; + } +} + void VcsBaseEditorWidget::init() { d->m_editor = editor(); @@ -963,7 +974,7 @@ void VcsBaseEditorWidget::mouseMoveEvent(QMouseEvent *e) bool overrideCursor = false; Qt::CursorShape cursorShape; - if (d->m_parameters->type == LogOutput || d->m_parameters->type == AnnotateOutput) { + if (supportChangeLinks()) { // Link emulation behaviour for 'click on change-interaction' const QTextCursor cursor = cursorForPosition(e->pos()); Internal::AbstractTextCursorHandler *handler = d->findTextCursorHandler(cursor); @@ -987,7 +998,7 @@ void VcsBaseEditorWidget::mouseReleaseEvent(QMouseEvent *e) { const bool wasDragging = d->m_mouseDragging; d->m_mouseDragging = false; - if (!wasDragging && (d->m_parameters->type == LogOutput || d->m_parameters->type == AnnotateOutput)) { + if (!wasDragging && supportChangeLinks()) { if (e->button() == Qt::LeftButton &&!(e->modifiers() & Qt::ShiftModifier)) { const QTextCursor cursor = cursorForPosition(e->pos()); Internal::AbstractTextCursorHandler *handler = d->findTextCursorHandler(cursor); diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h index 955c194d901..6971b701cf5 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.h +++ b/src/plugins/vcsbase/vcsbaseeditor.h @@ -103,6 +103,7 @@ protected: void setDiffFilePattern(const QRegExp &pattern); // Pattern for log entry. hash/revision number must be in the first capture group void setLogEntryPattern(const QRegExp &pattern); + virtual bool supportChangeLinks() const; public: virtual void init(); -- GitLab