forked from qt-creator/qt-creator
VcsBase: Introduce vcsExecWithHandler()
Before, vcsExec() returned already started VcsCommand. Later, callers of vcsExec() were establishing connections to the retured VcsCommand::done() signal. However, when process fails to start (e.g. because of non-existing executable), the done() signal may be emitted synchonously from inside VcsCommand::start(). In this scenario callers of VcsCommand could miss the emission of done() signal and connect to already finished command. Instead, provide a vcsExecWithHandler() function which takes a handler to be called when command finished. In addition it takes the context object, too. Don't return VcsCommand from vcsExec() anymore. Change-Id: I2fb5fbe5d27632ea039c650d37e5d7d1b60cebc0 Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
@@ -1572,19 +1572,19 @@ void GitPluginPrivate::instantBlame()
|
||||
const QFileInfo fi(filePath.toString());
|
||||
const Utils::FilePath workingDirectory = Utils::FilePath::fromString(fi.path());
|
||||
const QString lineString = QString("%1,%1").arg(line);
|
||||
const VcsCommand *command = GitClient::instance()->vcsExec(
|
||||
workingDirectory, {"blame", "-p", "-L", lineString, "--", filePath.toString()},
|
||||
nullptr, false, RunFlags::NoOutput);
|
||||
connect(command, &VcsCommand::done, this, [command, filePath, line, this] {
|
||||
if (command->result() == ProcessResult::FinishedWithError &&
|
||||
command->cleanedStdErr().contains("no such path")) {
|
||||
const auto commandHandler = [this, filePath, line](const CommandResult &result) {
|
||||
if (result.result() == ProcessResult::FinishedWithError &&
|
||||
result.cleanedStdErr().contains("no such path")) {
|
||||
disconnect(m_blameCursorPosConn);
|
||||
return;
|
||||
}
|
||||
const QString output = command->cleanedStdOut();
|
||||
const QString output = result.cleanedStdOut();
|
||||
const CommitInfo info = parseBlameOutput(output.split('\n'), filePath, m_author);
|
||||
m_blameMark.reset(new BlameMark(filePath, line, info));
|
||||
});
|
||||
};
|
||||
GitClient::instance()->vcsExecWithHandler(workingDirectory,
|
||||
{"blame", "-p", "-L", lineString, "--", filePath.toString()},
|
||||
this, commandHandler, RunFlags::NoOutput, false);
|
||||
}
|
||||
|
||||
void GitPluginPrivate::stopInstantBlame()
|
||||
|
Reference in New Issue
Block a user