diff options
author | Andre Hartmann <aha_1980@gmx.de> | 2023-05-15 12:47:56 +0200 |
---|---|---|
committer | André Hartmann <aha_1980@gmx.de> | 2023-05-17 07:06:05 +0000 |
commit | 29371dc2f3d736b04ee706e2bd2498e8d8ea755a (patch) | |
tree | b0e8d388944958f10dc32cb188101a3a01b1dbc9 /src | |
parent | ac0f273081c6294d43c39f1ba4af848bd36da683 (diff) | |
download | qt-creator-29371dc2f3d736b04ee706e2bd2498e8d8ea755a.tar.gz |
Git: Cache author and encoding for instant blame
Querying both may be expensive and is only
necessary when the repository is changed.
Fixes: QTCREATORBUG-29151
Change-Id: I1d37f8b8708c02a8c3dc2d89fe7e331f0f416818
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/git/gitplugin.cpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 34baa29d9d..2b9f908ff8 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -394,6 +394,7 @@ public: void instantBlameOnce(); void instantBlame(); void stopInstantBlame(); + bool refreshWorkingDirectory(const FilePath &workingDirectory); void onApplySettings(); @@ -428,6 +429,8 @@ public: FilePath m_submitRepository; QString m_commitMessageFileName; + FilePath m_workingDirectory; + QTextCodec *m_codec = nullptr; Author m_author; int m_lastVisitedEditorLine = -1; QTimer *m_cursorPositionChangedTimer = nullptr; @@ -1439,9 +1442,8 @@ void GitPluginPrivate::setupInstantBlame() } const Utils::FilePath workingDirectory = GitPlugin::currentState().currentFileTopLevel(); - if (workingDirectory.isEmpty()) + if (!refreshWorkingDirectory(workingDirectory)) return; - m_author = GitClient::instance()->getAuthor(workingDirectory); const TextEditorWidget *widget = TextEditorWidget::fromEditor(editor); if (!widget) @@ -1524,9 +1526,8 @@ void GitPluginPrivate::instantBlameOnce() this, [this] { m_blameMark.reset(); }, Qt::SingleShotConnection); const Utils::FilePath workingDirectory = GitPlugin::currentState().topLevel(); - if (workingDirectory.isEmpty()) + if (!refreshWorkingDirectory(workingDirectory)) return; - m_author = GitClient::instance()->getAuthor(workingDirectory); } m_lastVisitedEditorLine = -1; @@ -1574,10 +1575,9 @@ void GitPluginPrivate::instantBlame() const CommitInfo info = parseBlameOutput(output.split('\n'), filePath, m_author); m_blameMark.reset(new BlameMark(filePath, line, info)); }; - QTextCodec *codec = GitClient::instance()->encoding(GitClient::EncodingCommit, workingDirectory); GitClient::instance()->vcsExecWithHandler(workingDirectory, {"blame", "-p", "-L", lineString, "--", filePath.toString()}, - this, commandHandler, RunFlags::NoOutput, codec); + this, commandHandler, RunFlags::NoOutput, m_codec); } void GitPluginPrivate::stopInstantBlame() @@ -1587,6 +1587,21 @@ void GitPluginPrivate::stopInstantBlame() disconnect(m_blameCursorPosConn); } +bool GitPluginPrivate::refreshWorkingDirectory(const FilePath &workingDirectory) +{ + if (workingDirectory.isEmpty()) + return false; + + if (m_workingDirectory == workingDirectory) + return true; + + m_workingDirectory = workingDirectory; + m_author = GitClient::instance()->getAuthor(workingDirectory); + m_codec = GitClient::instance()->encoding(GitClient::EncodingCommit, workingDirectory); + + return true; +} + IEditor *GitPluginPrivate::openSubmitEditor(const QString &fileName, const CommitData &cd) { IEditor *editor = EditorManager::openEditor(FilePath::fromString(fileName), |