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:
Jarek Kobus
2022-12-08 18:50:54 +01:00
parent c08317b5a6
commit 287a7c9268
11 changed files with 193 additions and 167 deletions

View File

@@ -9,7 +9,9 @@
#include <optional>
namespace VcsBase { class VcsCommand; }
namespace VcsBase {
class CommandResult;
}
namespace Git::Internal {
@@ -51,7 +53,8 @@ public:
void removeBranch(const QModelIndex &idx);
void removeTag(const QModelIndex &idx);
VcsBase::VcsCommand *checkoutBranch(const QModelIndex &idx);
void checkoutBranch(const QModelIndex &idx, const QObject *context = nullptr,
const std::function<void(const VcsBase::CommandResult &)> &handler = {});
bool branchIsMerged(const QModelIndex &idx);
QModelIndex addBranch(const QString &name, bool track, const QModelIndex &trackedBranch);
void setRemoteTracking(const QModelIndex &trackingIndex);