GitGrep: Use QtcProcess instead of VcsCommand

Originally VcsCommand was created in main thread,
while VcsCommand::runCommand() has been called
in worker thread. Fix it by using QtcProcess
directly in worker thread.

Change-Id: I65f3476c0b89466c4347b0469e4cbad89c09072d
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Jarek Kobus
2022-09-05 18:04:54 +02:00
parent bf0b81f257
commit b04b24ca81

View File

@@ -4,30 +4,24 @@
#include "gitgrep.h" #include "gitgrep.h"
#include "gitclient.h" #include "gitclient.h"
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/progressmanager/progressmanager.h>
#include <coreplugin/vcsmanager.h> #include <coreplugin/vcsmanager.h>
#include <texteditor/findinfiles.h> #include <texteditor/findinfiles.h>
#include <vcsbase/vcsbaseconstants.h> #include <vcsbase/vcsbaseconstants.h>
#include <vcsbase/vcscommand.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/commandline.h> #include <utils/environment.h>
#include <utils/fancylineedit.h> #include <utils/fancylineedit.h>
#include <utils/filesearch.h> #include <utils/filesearch.h>
#include <utils/fileutils.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/qtcprocess.h>
#include <utils/runextensions.h> #include <utils/runextensions.h>
#include <utils/textfileformat.h>
#include <QCheckBox> #include <QCheckBox>
#include <QFuture> #include <QFuture>
#include <QFutureWatcher>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QRegularExpressionValidator> #include <QRegularExpressionValidator>
#include <QScopedPointer>
#include <QSettings> #include <QSettings>
#include <QTextStream> #include <QTextStream>
@@ -59,8 +53,8 @@ public:
: m_parameters(parameters) : m_parameters(parameters)
{ {
m_directory = FilePath::fromString(parameters.additionalParameters.toString()); m_directory = FilePath::fromString(parameters.additionalParameters.toString());
m_command.reset(GitClient::instance()->createCommand(m_directory));
m_vcsBinary = GitClient::instance()->vcsBinary(); m_vcsBinary = GitClient::instance()->vcsBinary();
m_environment = GitClient::instance()->processEnvironment();
} }
struct Match struct Match
@@ -130,13 +124,12 @@ public:
QTextStream stream(&t); QTextStream stream(&t);
while (!stream.atEnd() && !fi.isCanceled()) while (!stream.atEnd() && !fi.isCanceled())
processLine(stream.readLine(), &resultList); processLine(stream.readLine(), &resultList);
if (!resultList.isEmpty()) if (!resultList.isEmpty() && !fi.isCanceled())
fi.reportResult(resultList); fi.reportResult(resultList);
} }
void operator()(FutureInterfaceType &fi) void operator()(FutureInterfaceType &fi)
{ {
Core::ProgressTimer progress(fi, 5);
QStringList arguments = { QStringList arguments = {
"-c", "color.grep.match=bold red", "-c", "color.grep.match=bold red",
"-c", "color.grep=always", "-c", "color.grep=always",
@@ -168,19 +161,16 @@ public:
return QString(":!" + filter); return QString(":!" + filter);
}); });
arguments << "--" << filterArgs << exclusionArgs; arguments << "--" << filterArgs << exclusionArgs;
m_command->addFlags(VcsCommand::SilentOutput);
m_command->setProgressiveOutput(true); QtcProcess process;
QFutureWatcher<FileSearchResultList> watcher; process.setEnvironment(m_environment);
QObject::connect(&watcher, process.setCommand({m_vcsBinary, arguments});
&QFutureWatcher<FileSearchResultList>::canceled, process.setWorkingDirectory(m_directory);
m_command.get(), process.setStdOutCallback([this, &fi](const QString &text) { read(fi, text); });
&VcsCommand::cancel); process.start();
watcher.setFuture(fi.future()); process.waitForFinished();
QObject::connect(m_command.get(),
&VcsCommand::stdOutText, switch (process.result()) {
[this, &fi](const QString &text) { read(fi, text); });
const CommandResult result = m_command->runCommand({m_vcsBinary, arguments}, 0);
switch (result.result()) {
case ProcessResult::TerminatedAbnormally: case ProcessResult::TerminatedAbnormally:
case ProcessResult::StartFailed: case ProcessResult::StartFailed:
case ProcessResult::Hang: case ProcessResult::Hang:
@@ -199,7 +189,7 @@ private:
FilePath m_directory; FilePath m_directory;
QString m_ref; QString m_ref;
TextEditor::FileFindParameters m_parameters; TextEditor::FileFindParameters m_parameters;
std::unique_ptr<VcsCommand> m_command; Environment m_environment;
}; };
} // namespace } // namespace