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>
This commit is contained in:
Andre Hartmann
2023-05-15 12:47:56 +02:00
committed by André Hartmann
parent ac0f273081
commit 29371dc2f3

View File

@@ -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),