diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 6a1324683bfdd6bcee152baa2ba961946d3cacbc..a351299dcdfbe4f0b447c9d93e7685e0a3cd36db 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 9dc1d936f73aafd64a745e8e7bc6deba9a944a1f..4b230594b62383566bbfbada4b2e5dbecf62f2d2 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 2c6062799bfb884b4e800536a302d5af943bd294..1819fd7a34c7f505ed74ce4e5d0ba16ff16c4f16 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 5010fd8193709f218eff3d664545ca1509555a83..b5539892c90cf76b9c2a42cc5edc220621f81518 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 ecf43b20056594241639c46be8a68838c1f820e2..00445b2375f94042a7997ed9dbbd633a47cf4e94 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 955c194d901287a349aa9fe44a88b7d2fb7e842d..6971b701cf5e0b5a117f54f55bce07fa0f0af42f 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();