68 lines
2.5 KiB
C++
68 lines
2.5 KiB
C++
#include "workspace/CommandExecutor.h"
|
|
|
|
#include <QFileInfo>
|
|
#include <QProcess>
|
|
#include <QProcessEnvironment>
|
|
|
|
#include "common/SpdLogger.h"
|
|
|
|
void CommandExecutor::Execute(WorkSpace* ws, WorkSpace::CommandWhen when) {
|
|
if (!ws) return;
|
|
if (!cmd_.enabled) return;
|
|
|
|
const QString whenStr = (when == WorkSpace::CommandWhen::OnCreate) ? QStringLiteral("oncreate") : QStringLiteral("onload");
|
|
|
|
// Build final arguments (already prepared by manager but honor rawArgs if provided)
|
|
QStringList argsList = cmd_.args;
|
|
auto pushArgs = [&argsList](const QString& s) {
|
|
if (!s.isEmpty()) {
|
|
for (const auto& part : s.split(' ', Qt::SkipEmptyParts)) {
|
|
argsList << part;
|
|
}
|
|
}
|
|
};
|
|
if (!cmd_.rawArgs.isEmpty()) {
|
|
pushArgs(cmd_.rawArgs);
|
|
}
|
|
|
|
const QString programLower = cmd_.program.toLower();
|
|
if (!cmd_.path.isEmpty()) {
|
|
if (programLower.endsWith("cmd.exe")) {
|
|
argsList << "/c" << cmd_.path;
|
|
} else if (programLower.endsWith("powershell.exe")) {
|
|
argsList << "-NoProfile" << "-ExecutionPolicy" << "Bypass" << "-File" << cmd_.path;
|
|
} else {
|
|
argsList << cmd_.path;
|
|
}
|
|
}
|
|
|
|
QProcess proc;
|
|
// Apply environment if provided
|
|
if (!cmd_.env.empty()) {
|
|
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
|
|
for (auto it = cmd_.env.begin(); it != cmd_.env.end(); ++it) {
|
|
env.insert(it.key(), it.value());
|
|
}
|
|
proc.setProcessEnvironment(env);
|
|
}
|
|
|
|
proc.setProgram(cmd_.program);
|
|
proc.setArguments(argsList);
|
|
proc.setWorkingDirectory(cmd_.workingDir.isEmpty() ? ws->GetDir() : cmd_.workingDir);
|
|
LOG_INFO("run command: name={} prog={} args={} cwd={} when={} desc={}",
|
|
cmd_.name.toLocal8Bit().constData(),
|
|
cmd_.program.toLocal8Bit().constData(),
|
|
argsList.join(' ').toLocal8Bit().constData(),
|
|
proc.workingDirectory().toLocal8Bit().constData(),
|
|
whenStr.toLocal8Bit().constData(),
|
|
cmd_.descript.toLocal8Bit().constData());
|
|
proc.start();
|
|
if (!proc.waitForStarted()) {
|
|
LOG_WARN("command failed to start: {}", cmd_.program.toLocal8Bit().constData());
|
|
return;
|
|
}
|
|
proc.waitForFinished(cmd_.timeoutMs);
|
|
const QByteArray out = proc.readAllStandardOutput();
|
|
const QByteArray err = proc.readAllStandardError();
|
|
LOG_INFO("command '{}' exitCode={} stdout={} stderr={}", cmd_.name.toLocal8Bit().constData(), proc.exitCode(), out.constData(), err.constData());
|
|
} |