diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index 181172e36ef019d3d670a392fd2f2c6387735a40..4f0b8314c673ec3bb80263cc9538f9f2285984c2 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -366,5 +366,19 @@ bool GitEditor::supportChangeLinks() const || (editor()->id() == Git::Constants::GIT_REBASE_EDITOR_ID); } +QString GitEditor::fileNameForLine(int line) const +{ + // 7971b6e7 share/qtcreator/dumper/dumper.py (hjk + QTextBlock block = document()->findBlockByLineNumber(line - 1); + QTC_ASSERT(block.isValid(), return source()); + static QRegExp renameExp(QLatin1String("^" CHANGE_PATTERN "\\s+([^(]+)")); + if (renameExp.indexIn(block.text()) != -1) { + const QString fileName = renameExp.cap(1).trimmed(); + if (!fileName.isEmpty()) + return fileName; + } + return source(); +} + } // namespace Internal } // namespace Git diff --git a/src/plugins/git/giteditor.h b/src/plugins/git/giteditor.h index 1ed80c7ccfc62c3cb6f6bfdb2c400dc7f0572f7c..84b53992214000b345977ad16d5b6b484d97e9f8 100644 --- a/src/plugins/git/giteditor.h +++ b/src/plugins/git/giteditor.h @@ -74,6 +74,7 @@ private: void addChangeActions(QMenu *menu, const QString &change); QString revisionSubject(const QTextBlock &inBlock) const; bool supportChangeLinks() const; + QString fileNameForLine(int line) const; mutable QRegExp m_changeNumberPattern; QString m_currentChange; diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index a7be34a5a9aae8120952c373de3338ca99bee75f..fe72592fb148e554fd1e9119a5c1b0e4750c0e07 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -684,6 +684,12 @@ bool VcsBaseEditorWidget::supportChangeLinks() const } } +QString VcsBaseEditorWidget::fileNameForLine(int line) const +{ + Q_UNUSED(line); + return source(); +} + void VcsBaseEditorWidget::init() { d->m_editor = editor(); @@ -1414,8 +1420,13 @@ void VcsBaseEditorWidget::addDiffActions(QMenu *, const DiffChunk &) void VcsBaseEditorWidget::slotAnnotateRevision() { if (const QAction *a = qobject_cast<const QAction *>(sender())) { - QFileInfo fi(source()); - emit annotateRevisionRequested(fi.absolutePath(), fi.fileName(), + const int currentLine = editor()->currentLine(); + const QString fileName = fileNameForLine(currentLine); + QString workingDirectory = d->m_workingDirectory; + if (workingDirectory.isEmpty()) + workingDirectory = QFileInfo(fileName).absolutePath(); + emit annotateRevisionRequested(workingDirectory, + QDir(workingDirectory).relativeFilePath(fileName), a->data().toString(), currentLine); } } diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h index b932defb3312c65c20ddcc0a6549de33e66bbc34..7c0654dae64fa2ca4f51a4a7c582215c09a7b397 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.h +++ b/src/plugins/vcsbase/vcsbaseeditor.h @@ -107,6 +107,7 @@ protected: // Pattern for log entry. hash/revision number must be in the first capture group void setLogEntryPattern(const QRegExp &pattern); virtual bool supportChangeLinks() const; + virtual QString fileNameForLine(int line) const; public: virtual void init();