diff --git a/cmd/launcher/main.go b/cmd/launcher/main.go index 32acdf6d..a6c15889 100644 --- a/cmd/launcher/main.go +++ b/cmd/launcher/main.go @@ -127,9 +127,11 @@ func main() { //nolint:funlen l = l.WithField("exe_path", exe) - args, wait, mainExe := findAndStripWait(args) + args, wait, mainExes := findAndStripWait(args) if wait { - waitForProcessToFinish(mainExe) + for _, mainExe := range mainExes { + waitForProcessToFinish(mainExe) + } } cmd := execabs.Command(exe, appendLauncherPath(launcher, args)...) //nolint:gosec @@ -186,12 +188,11 @@ func findAndStrip[T comparable](slice []T, v T) (strippedList []T, found bool) { } // findAndStripWait Check for waiter flag get its value and clean them both. -func findAndStripWait(args []string) ([]string, bool, string) { +func findAndStripWait(args []string) ([]string, bool, []string) { res := append([]string{}, args...) hasFlag := false - var value string - + values := make([]string, 0) for k, v := range res { if v != FlagWait { continue @@ -200,14 +201,16 @@ func findAndStripWait(args []string) ([]string, bool, string) { continue } hasFlag = true - value = res[k+1] + values = append(values, res[k+1]) } if hasFlag { res, _ = findAndStrip(res, FlagWait) - res, _ = findAndStrip(res, value) + for _, v := range values { + res, _ = findAndStrip(res, v) + } } - return res, hasFlag, value + return res, hasFlag, values } func getPathToUpdatedExecutable( diff --git a/cmd/launcher/main_test.go b/cmd/launcher/main_test.go index 607b60fe..42e80595 100644 --- a/cmd/launcher/main_test.go +++ b/cmd/launcher/main_test.go @@ -56,3 +56,25 @@ func TestFindAndStrip(t *testing.T) { assert.False(t, found) assert.True(t, xslices.Equal(result, []string{})) } + +func TestFindAndStripWait(t *testing.T) { + result, found, values := findAndStripWait([]string{"a", "b", "c"}) + assert.False(t, found) + assert.True(t, xslices.Equal(result, []string{"a", "b", "c"})) + assert.True(t, xslices.Equal(values, []string{})) + + result, found, values = findAndStripWait([]string{"a", "--wait", "b"}) + assert.True(t, found) + assert.True(t, xslices.Equal(result, []string{"a"})) + assert.True(t, xslices.Equal(values, []string{"b"})) + + result, found, values = findAndStripWait([]string{"a", "--wait", "b", "--wait", "c"}) + assert.True(t, found) + assert.True(t, xslices.Equal(result, []string{"a"})) + assert.True(t, xslices.Equal(values, []string{"b", "c"})) + + result, found, values = findAndStripWait([]string{"a", "--wait", "b", "--wait", "c", "--wait", "d"}) + assert.True(t, found) + assert.True(t, xslices.Equal(result, []string{"a"})) + assert.True(t, xslices.Equal(values, []string{"b", "c", "d"})) +} diff --git a/internal/frontend/bridge-gui/bridge-gui/main.cpp b/internal/frontend/bridge-gui/bridge-gui/main.cpp index c4f69a6a..1e6c01e0 100644 --- a/internal/frontend/bridge-gui/bridge-gui/main.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/main.cpp @@ -248,7 +248,7 @@ void focusOtherInstance() { //**************************************************************************************************************************************************** /// \param [in] args list of arguments to pass to bridge. //**************************************************************************************************************************************************** -void launchBridge(QStringList const &args) { +const QString launchBridge(QStringList const &args) { UPOverseer &overseer = app().bridgeOverseer(); overseer.reset(); @@ -265,6 +265,7 @@ void launchBridge(QStringList const &args) { app().log().info(QString("Launching bridge process with command \"%1\" %2").arg(bridgeExePath, params.join(" "))); overseer = std::make_unique(new ProcessMonitor(bridgeExePath, params, nullptr), nullptr); overseer->startWorker(true); + return bridgeExePath; } @@ -330,7 +331,7 @@ int main(int argc, char *argv[]) { // When not in attached mode, log entries are forwarded to bridge, which output it on stdout/stderr. bridge-gui's process monitor intercept // these outputs and output them on the command-line. log.setLevel(cliOptions.logLevel); - + QString bridgeexec; if (!cliOptions.attach) { if (isBridgeRunning()) { throw Exception("An orphan instance of bridge is already running. Please terminate it and relaunch the application.", @@ -339,7 +340,7 @@ int main(int argc, char *argv[]) { // before launching bridge, we remove any trailing service config file, because we need to make sure we get a newly generated one. GRPCClient::removeServiceConfigFile(); - launchBridge(cliOptions.bridgeArgs); + bridgeexec = launchBridge(cliOptions.bridgeArgs); } log.info(QString("Retrieving gRPC service configuration from '%1'").arg(QDir::toNativeSeparators(grpcServerConfigPath()))); @@ -401,6 +402,10 @@ int main(int argc, char *argv[]) { QStringList args = cliOptions.bridgeGuiArgs; args.append(waitFlag); args.append(mainexec); + if (!bridgeexec.isEmpty()) { + args.append(waitFlag); + args.append(bridgeexec); + } app().setLauncherArgs(cliOptions.launcher, args); result = QGuiApplication::exec(); }