summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2023-05-15 12:47:56 +0200
committerAndré Hartmann <aha_1980@gmx.de>2023-05-17 07:06:05 +0000
commit29371dc2f3d736b04ee706e2bd2498e8d8ea755a (patch)
treeb0e8d388944958f10dc32cb188101a3a01b1dbc9 /src
parentac0f273081c6294d43c39f1ba4af848bd36da683 (diff)
downloadqt-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.cpp27
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),