Utils/ProjectExplorer: Use FilePath for Runnable::workingDirectory

... and in some using code.

Change-Id: I231ea56628908f7d305d13f07eabe8803fe8a791
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2021-08-02 18:02:10 +02:00
parent b8f369c436
commit 4a42bcd4e8
44 changed files with 92 additions and 80 deletions

View File

@@ -589,12 +589,20 @@ static QString quoteArgWin(const QString &arg)
} }
ProcessArgs ProcessArgs::prepareArgs(const QString &cmd, SplitError *err, OsType osType, ProcessArgs ProcessArgs::prepareArgs(const QString &cmd, SplitError *err, OsType osType,
const Environment *env, const QString *pwd, bool abortOnMeta) const Environment *env, const FilePath *pwd, bool abortOnMeta)
{ {
QString wdcopy;
QString *wd = nullptr;
if (pwd) {
wdcopy = pwd->toString();
wd = &wdcopy;
}
ProcessArgs res;
if (osType == OsTypeWindows) if (osType == OsTypeWindows)
return prepareArgsWin(cmd, err, env, pwd); res = prepareArgsWin(cmd, err, env, wd);
else else
return createUnixArgs(splitArgs(cmd, osType, abortOnMeta, err, env, pwd)); res = createUnixArgs(splitArgs(cmd, osType, abortOnMeta, err, env, wd));
return res;
} }
QString ProcessArgs::quoteArg(const QString &arg, OsType osType) QString ProcessArgs::quoteArg(const QString &arg, OsType osType)
@@ -637,7 +645,7 @@ void ProcessArgs::addArgs(QString *args, const QStringList &inArgs)
bool ProcessArgs::prepareCommand(const QString &command, const QString &arguments, bool ProcessArgs::prepareCommand(const QString &command, const QString &arguments,
QString *outCmd, ProcessArgs *outArgs, OsType osType, QString *outCmd, ProcessArgs *outArgs, OsType osType,
const Environment *env, const QString *pwd) const Environment *env, const FilePath *pwd)
{ {
ProcessArgs::SplitError err; ProcessArgs::SplitError err;
*outArgs = ProcessArgs::prepareArgs(arguments, &err, osType, env, pwd); *outArgs = ProcessArgs::prepareArgs(arguments, &err, osType, env, pwd);

View File

@@ -64,12 +64,12 @@ public:
//! Prepare argument of a shell command for feeding into QProcess //! Prepare argument of a shell command for feeding into QProcess
static ProcessArgs prepareArgs(const QString &cmd, SplitError *err, static ProcessArgs prepareArgs(const QString &cmd, SplitError *err,
OsType osType = HostOsInfo::hostOs(), OsType osType = HostOsInfo::hostOs(),
const Environment *env = nullptr, const QString *pwd = nullptr, const Environment *env = nullptr, const FilePath *pwd = nullptr,
bool abortOnMeta = true); bool abortOnMeta = true);
//! Prepare a shell command for feeding into QProcess //! Prepare a shell command for feeding into QProcess
static bool prepareCommand(const QString &command, const QString &arguments, static bool prepareCommand(const QString &command, const QString &arguments,
QString *outCmd, ProcessArgs *outArgs, OsType osType = HostOsInfo::hostOs(), QString *outCmd, ProcessArgs *outArgs, OsType osType = HostOsInfo::hostOs(),
const Environment *env = nullptr, const QString *pwd = nullptr); const Environment *env = nullptr, const FilePath *pwd = nullptr);
//! Quote and append each argument to a shell command //! Quote and append each argument to a shell command
static void addArgs(QString *args, const QStringList &inArgs); static void addArgs(QString *args, const QStringList &inArgs);
//! Append already quoted arguments to a shell command //! Append already quoted arguments to a shell command

View File

@@ -83,7 +83,7 @@ public:
static QString m_defaultConsoleProcess; static QString m_defaultConsoleProcess;
ConsoleProcess::Mode m_mode = ConsoleProcess::Run; ConsoleProcess::Mode m_mode = ConsoleProcess::Run;
QString m_workingDir; FilePath m_workingDir;
Environment m_environment; Environment m_environment;
qint64 m_appPid = 0; qint64 m_appPid = 0;
int m_appCode; int m_appCode;
@@ -462,7 +462,7 @@ bool ConsoleProcess::start()
d->m_pid = new PROCESS_INFORMATION; d->m_pid = new PROCESS_INFORMATION;
ZeroMemory(d->m_pid, sizeof(PROCESS_INFORMATION)); ZeroMemory(d->m_pid, sizeof(PROCESS_INFORMATION));
QString workDir = QDir::toNativeSeparators(workingDirectory()); QString workDir = workingDirectory().toUserOutput();
if (!workDir.isEmpty() && !workDir.endsWith(QLatin1Char('\\'))) if (!workDir.isEmpty() && !workDir.endsWith(QLatin1Char('\\')))
workDir.append(QLatin1Char('\\')); workDir.append(QLatin1Char('\\'));
@@ -583,7 +583,7 @@ bool ConsoleProcess::start()
<< modeOption(d->m_mode) << modeOption(d->m_mode)
<< d->m_stubServer.fullServerName() << d->m_stubServer.fullServerName()
<< msgPromptToClose() << msgPromptToClose()
<< workingDirectory() << workingDirectory().path()
<< (d->m_tempFile ? d->m_tempFile->fileName() : QString()) << (d->m_tempFile ? d->m_tempFile->fileName() : QString())
<< QString::number(getpid()) << QString::number(getpid())
<< pcmd << pcmd
@@ -958,12 +958,12 @@ QProcess::ExitStatus ConsoleProcess::exitStatus() const
return d->m_appStatus; return d->m_appStatus;
} }
void ConsoleProcess::setWorkingDirectory(const QString &dir) void ConsoleProcess::setWorkingDirectory(const FilePath &dir)
{ {
d->m_workingDir = dir; d->m_workingDir = dir;
} }
QString ConsoleProcess::workingDirectory() const FilePath ConsoleProcess::workingDirectory() const
{ {
return d->m_workingDir; return d->m_workingDir;
} }
@@ -1025,9 +1025,9 @@ QString ConsoleProcess::msgUnexpectedOutput(const QByteArray &what)
return tr("Unexpected output from helper program (%1).").arg(QString::fromLatin1(what)); return tr("Unexpected output from helper program (%1).").arg(QString::fromLatin1(what));
} }
QString ConsoleProcess::msgCannotChangeToWorkDir(const QString & dir, const QString &why) QString ConsoleProcess::msgCannotChangeToWorkDir(const FilePath &dir, const QString &why)
{ {
return tr("Cannot change to working directory \"%1\": %2").arg(dir, why); return tr("Cannot change to working directory \"%1\": %2").arg(dir.toString(), why);
} }
QString ConsoleProcess::msgCannotExecute(const QString & p, const QString &why) QString ConsoleProcess::msgCannotExecute(const QString & p, const QString &why)

View File

@@ -36,8 +36,9 @@ QT_END_NAMESPACE
namespace Utils { namespace Utils {
class Environment;
class CommandLine; class CommandLine;
class Environment;
class FilePath;
class QTCREATOR_UTILS_EXPORT TerminalCommand class QTCREATOR_UTILS_EXPORT TerminalCommand
{ {
@@ -69,8 +70,8 @@ public:
void setAbortOnMetaChars(bool abort); void setAbortOnMetaChars(bool abort);
void setWorkingDirectory(const QString &dir); void setWorkingDirectory(const Utils::FilePath &dir);
QString workingDirectory() const; Utils::FilePath workingDirectory() const;
void setEnvironment(const Environment &env); void setEnvironment(const Environment &env);
Environment environment() const; Environment environment() const;
@@ -135,7 +136,7 @@ private:
static QString msgCannotWriteTempFile(); static QString msgCannotWriteTempFile();
static QString msgCannotCreateTempDir(const QString & dir, const QString &why); static QString msgCannotCreateTempDir(const QString & dir, const QString &why);
static QString msgUnexpectedOutput(const QByteArray &what); static QString msgUnexpectedOutput(const QByteArray &what);
static QString msgCannotChangeToWorkDir(const QString & dir, const QString &why); static QString msgCannotChangeToWorkDir(const Utils::FilePath &dir, const QString &why);
static QString msgCannotExecute(const QString & p, const QString &why); static QString msgCannotExecute(const QString & p, const QString &why);
void emitError(QProcess::ProcessError err, const QString &errorString); void emitError(QProcess::ProcessError err, const QString &errorString);

View File

@@ -591,14 +591,14 @@ void QtcProcess::start()
env = Environment::systemEnvironment(); env = Environment::systemEnvironment();
} }
const QString workDir = d->m_workingDirectory.path(); d->m_process->setWorkingDirectory(d->m_workingDirectory.path());
d->m_process->setWorkingDirectory(workDir);
QString command; QString command;
ProcessArgs arguments; ProcessArgs arguments;
bool success = ProcessArgs::prepareCommand(d->m_commandLine.executable().toString(), bool success = ProcessArgs::prepareCommand(d->m_commandLine.executable().toString(),
d->m_commandLine.arguments(), d->m_commandLine.arguments(),
&command, &arguments, osType, &env, &workDir); &command, &arguments, osType, &env,
&d->m_workingDirectory);
if (osType == OsTypeWindows) { if (osType == OsTypeWindows) {
QString args; QString args;
if (d->m_useCtrlCStub) { if (d->m_useCtrlCStub) {

View File

@@ -125,7 +125,7 @@ QList<ITestConfiguration *> CTestTreeItem::testConfigurationsFor(const QStringLi
} }
const ProjectExplorer::BuildConfiguration *buildConfig = target->activeBuildConfiguration(); const ProjectExplorer::BuildConfiguration *buildConfig = target->activeBuildConfiguration();
if (QTC_GUARD(buildConfig)) if (QTC_GUARD(buildConfig))
config->setWorkingDirectory(buildConfig->buildDirectory().toString()); config->setWorkingDirectory(buildConfig->buildDirectory());
if (selected.isEmpty()) if (selected.isEmpty())
config->setTestCaseCount(testBase()->asTestTool()->rootNode()->childCount()); config->setTestCaseCount(testBase()->asTestTool()->rootNode()->childCount());

View File

@@ -57,7 +57,7 @@ ITestConfiguration::ITestConfiguration(Autotest::ITestBase *testBase)
{ {
} }
void ITestConfiguration::setWorkingDirectory(const QString &workingDirectory) void ITestConfiguration::setWorkingDirectory(const FilePath &workingDirectory)
{ {
m_runnable.workingDirectory = workingDirectory; m_runnable.workingDirectory = workingDirectory;
} }
@@ -65,9 +65,8 @@ void ITestConfiguration::setWorkingDirectory(const QString &workingDirectory)
Utils::FilePath ITestConfiguration::workingDirectory() const Utils::FilePath ITestConfiguration::workingDirectory() const
{ {
if (!m_runnable.workingDirectory.isEmpty()) { if (!m_runnable.workingDirectory.isEmpty()) {
const QFileInfo info(m_runnable.workingDirectory); if (m_runnable.workingDirectory.isDir()) // ensure wanted working dir does exist
if (info.isDir()) // ensure wanted working dir does exist return m_runnable.workingDirectory.absoluteFilePath();
return Utils::FilePath::fromString(info.absoluteFilePath());
} }
const Utils::FilePath executable = executableFilePath(); const Utils::FilePath executable = executableFilePath();

View File

@@ -60,7 +60,7 @@ public:
void setEnvironment(const Utils::Environment &env) { m_runnable.environment = env; } void setEnvironment(const Utils::Environment &env) { m_runnable.environment = env; }
Utils::Environment environment() const { return m_runnable.environment; } Utils::Environment environment() const { return m_runnable.environment; }
void setWorkingDirectory(const QString &workingDirectory); void setWorkingDirectory(const Utils::FilePath &workingDirectory);
Utils::FilePath workingDirectory() const; Utils::FilePath workingDirectory() const;
bool hasExecutable() const; bool hasExecutable() const;
Utils::FilePath executableFilePath() const; Utils::FilePath executableFilePath() const;

View File

@@ -67,7 +67,7 @@ public:
QTC_ASSERT(m_testConfig, return r); QTC_ASSERT(m_testConfig, return r);
r.executable = m_testConfig->executableFilePath(); r.executable = m_testConfig->executableFilePath();
r.commandLineArguments = m_testConfig->argumentsForTestRunner().join(' '); r.commandLineArguments = m_testConfig->argumentsForTestRunner().join(' ');
r.workingDirectory = m_testConfig->workingDirectory().toString(); r.workingDirectory = m_testConfig->workingDirectory();
r.environment = m_testConfig->environment(); r.environment = m_testConfig->environment();
return r; return r;
} }

View File

@@ -911,7 +911,7 @@ void RunConfigurationSelectionDialog::populate()
auto runnable = rc->runnable(); auto runnable = rc->runnable();
const QStringList rcDetails = { runnable.executable.toString(), const QStringList rcDetails = { runnable.executable.toString(),
runnable.commandLineArguments, runnable.commandLineArguments,
runnable.workingDirectory }; runnable.workingDirectory.toString() };
m_rcCombo->addItem(rc->displayName(), rcDetails); m_rcCombo->addItem(rc->displayName(), rcDetails);
} }
} }

View File

@@ -32,6 +32,8 @@
#include <projectexplorer/runcontrol.h> #include <projectexplorer/runcontrol.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
using namespace Utils;
namespace Qdb { namespace Qdb {
namespace Internal { namespace Internal {
@@ -102,7 +104,7 @@ void QdbStopApplicationService::doDeploy()
ProjectExplorer::Runnable runnable; ProjectExplorer::Runnable runnable;
runnable.executable = Utils::FilePath::fromString(Constants::AppcontrollerFilepath); runnable.executable = Utils::FilePath::fromString(Constants::AppcontrollerFilepath);
runnable.commandLineArguments = QStringLiteral("--stop"); runnable.commandLineArguments = QStringLiteral("--stop");
runnable.workingDirectory = QStringLiteral("/usr/bin"); runnable.workingDirectory = FilePath::fromString("/usr/bin");
d->applicationLauncher.start(runnable, d->applicationLauncher.start(runnable,
ProjectExplorer::DeviceKitAspect::device(target()->kit())); ProjectExplorer::DeviceKitAspect::device(target()->kit()));

View File

@@ -334,7 +334,7 @@ void CorePlugin::addToPathChooserContextMenu(Utils::PathChooser *pathChooser, QM
if (pathChooser->openTerminalHandler()) if (pathChooser->openTerminalHandler())
pathChooser->openTerminalHandler()(); pathChooser->openTerminalHandler()();
else else
FileUtils::openTerminal(pathChooser->filePath().toString()); FileUtils::openTerminal(pathChooser->filePath());
}); });
menu->insertAction(firstAction, showInTerminal); menu->insertAction(firstAction, showInTerminal);

View File

@@ -2573,7 +2573,7 @@ void EditorManagerPrivate::openTerminal()
{ {
if (!d->m_contextMenuEntry || d->m_contextMenuEntry->fileName().isEmpty()) if (!d->m_contextMenuEntry || d->m_contextMenuEntry->fileName().isEmpty())
return; return;
FileUtils::openTerminal(d->m_contextMenuEntry->fileName().parentDir().toString()); FileUtils::openTerminal(d->m_contextMenuEntry->fileName().parentDir());
} }
void EditorManagerPrivate::findInDirectory() void EditorManagerPrivate::findInDirectory()

View File

@@ -124,14 +124,14 @@ void FileUtils::showInGraphicalShell(QWidget *parent, const QString &pathIn)
} }
} }
void FileUtils::openTerminal(const QString &path) void FileUtils::openTerminal(const FilePath &path)
{ {
openTerminal(path, Environment::systemEnvironment()); openTerminal(path, Environment::systemEnvironment());
} }
void FileUtils::openTerminal(const QString &path, const Environment &env) void FileUtils::openTerminal(const FilePath &path, const Environment &env)
{ {
const QFileInfo fileInfo(path); const QFileInfo fileInfo = path.toFileInfo();
const QString pwd = QDir::toNativeSeparators(fileInfo.isDir() ? const QString pwd = QDir::toNativeSeparators(fileInfo.isDir() ?
fileInfo.absoluteFilePath() : fileInfo.absoluteFilePath() :
fileInfo.absolutePath()); fileInfo.absolutePath());

View File

@@ -43,8 +43,8 @@ struct CORE_EXPORT FileUtils
{ {
// Helpers for common directory browser options. // Helpers for common directory browser options.
static void showInGraphicalShell(QWidget *parent, const QString &path); static void showInGraphicalShell(QWidget *parent, const QString &path);
static void openTerminal(const QString &path); static void openTerminal(const Utils::FilePath &path);
static void openTerminal(const QString &path, const Utils::Environment &env); static void openTerminal(const Utils::FilePath &path, const Utils::Environment &env);
static QString msgFindInDirectory(); static QString msgFindInDirectory();
// Platform-dependent action descriptions // Platform-dependent action descriptions
static QString msgGraphicalShellAction(); static QString msgGraphicalShellAction();

View File

@@ -132,9 +132,9 @@ Runnable StartRemoteDialog::runnable() const
Kit *kit = d->kitChooser->currentKit(); Kit *kit = d->kitChooser->currentKit();
Runnable r; Runnable r;
r.device = DeviceKitAspect::device(kit); r.device = DeviceKitAspect::device(kit);
r.executable = Utils::FilePath::fromString(d->executable->text()); r.executable = FilePath::fromString(d->executable->text());
r.commandLineArguments = d->arguments->text(); r.commandLineArguments = d->arguments->text();
r.workingDirectory = d->workingDirectory->text(); r.workingDirectory = FilePath::fromString(d->workingDirectory->text());
return r; return r;
} }

View File

@@ -176,7 +176,7 @@ void StartApplicationParameters::toSettings(QSettings *settings) const
settings->setValue("LastServerAddress", serverAddress); settings->setValue("LastServerAddress", serverAddress);
settings->setValue("LastExternalExecutable", runnable.executable.toVariant()); settings->setValue("LastExternalExecutable", runnable.executable.toVariant());
settings->setValue("LastExternalExecutableArguments", runnable.commandLineArguments); settings->setValue("LastExternalExecutableArguments", runnable.commandLineArguments);
settings->setValue("LastExternalWorkingDirectory", runnable.workingDirectory); settings->setValue("LastExternalWorkingDirectory", runnable.workingDirectory.toVariant());
settings->setValue("LastExternalBreakAtMain", breakAtMain); settings->setValue("LastExternalBreakAtMain", breakAtMain);
settings->setValue("LastExternalRunInTerminal", runInTerminal); settings->setValue("LastExternalRunInTerminal", runInTerminal);
settings->setValue("LastExternalUseTargetExtended", useTargetExtendedRemote); settings->setValue("LastExternalUseTargetExtended", useTargetExtendedRemote);
@@ -193,7 +193,7 @@ void StartApplicationParameters::fromSettings(const QSettings *settings)
serverAddress = settings->value("LastServerAddress").toString(); serverAddress = settings->value("LastServerAddress").toString();
runnable.executable = FilePath::fromVariant(settings->value("LastExternalExecutable")); runnable.executable = FilePath::fromVariant(settings->value("LastExternalExecutable"));
runnable.commandLineArguments = settings->value("LastExternalExecutableArguments").toString(); runnable.commandLineArguments = settings->value("LastExternalExecutableArguments").toString();
runnable.workingDirectory = settings->value("LastExternalWorkingDirectory").toString(); runnable.workingDirectory = FilePath::fromVariant(settings->value("LastExternalWorkingDirectory"));
breakAtMain = settings->value("LastExternalBreakAtMain").toBool(); breakAtMain = settings->value("LastExternalBreakAtMain").toBool();
runInTerminal = settings->value("LastExternalRunInTerminal").toBool(); runInTerminal = settings->value("LastExternalRunInTerminal").toBool();
useTargetExtendedRemote = settings->value("LastExternalUseTargetExtended").toBool(); useTargetExtendedRemote = settings->value("LastExternalUseTargetExtended").toBool();
@@ -490,7 +490,7 @@ StartApplicationParameters StartApplicationDialog::parameters() const
result.kitId = d->kitChooser->currentKitId(); result.kitId = d->kitChooser->currentKitId();
result.debugInfoLocation = d->debuginfoPathChooser->filePath().toString(); result.debugInfoLocation = d->debuginfoPathChooser->filePath().toString();
result.runnable.commandLineArguments = d->arguments->text(); result.runnable.commandLineArguments = d->arguments->text();
result.runnable.workingDirectory = d->workingDirectory->filePath().toString(); result.runnable.workingDirectory = d->workingDirectory->filePath();
result.breakAtMain = d->breakAtMainCheckBox->isChecked(); result.breakAtMain = d->breakAtMainCheckBox->isChecked();
result.runInTerminal = d->runInTerminalCheckBox->isChecked(); result.runInTerminal = d->runInTerminalCheckBox->isChecked();
result.useTargetExtendedRemote = d->useTargetExtendedRemoteCheckBox->isChecked(); result.useTargetExtendedRemote = d->useTargetExtendedRemoteCheckBox->isChecked();
@@ -508,7 +508,7 @@ void StartApplicationDialog::setParameters(const StartApplicationParameters &p)
d->serverResetCommandsTextEdit->setPlainText(p.serverResetCommands); d->serverResetCommandsTextEdit->setPlainText(p.serverResetCommands);
d->debuginfoPathChooser->setPath(p.debugInfoLocation); d->debuginfoPathChooser->setPath(p.debugInfoLocation);
d->arguments->setText(p.runnable.commandLineArguments); d->arguments->setText(p.runnable.commandLineArguments);
d->workingDirectory->setPath(p.runnable.workingDirectory); d->workingDirectory->setFilePath(p.runnable.workingDirectory);
d->breakAtMainCheckBox->setChecked(p.breakAtMain); d->breakAtMainCheckBox->setChecked(p.breakAtMain);
d->runInTerminalCheckBox->setChecked(p.runInTerminal); d->runInTerminalCheckBox->setChecked(p.runInTerminal);
d->useTargetExtendedRemoteCheckBox->setChecked(p.useTargetExtendedRemote); d->useTargetExtendedRemoteCheckBox->setChecked(p.useTargetExtendedRemote);

View File

@@ -2627,8 +2627,7 @@ QString DebuggerEngine::formatStartParameters() const
str << " [terminal]"; str << " [terminal]";
str << '\n'; str << '\n';
if (!sp.inferior.workingDirectory.isEmpty()) if (!sp.inferior.workingDirectory.isEmpty())
str << "Directory: " << QDir::toNativeSeparators(sp.inferior.workingDirectory) str << "Directory: " << sp.inferior.workingDirectory.toUserOutput() << '\n';
<< '\n';
} }
if (!sp.debugger.executable.isEmpty()) if (!sp.debugger.executable.isEmpty())
str << "Debugger: " << sp.debugger.executable.toUserOutput() << '\n'; str << "Debugger: " << sp.debugger.executable.toUserOutput() << '\n';

View File

@@ -346,7 +346,7 @@ Runnable DebuggerKitAspect::runnable(const Kit *kit)
Runnable runnable; Runnable runnable;
if (const DebuggerItem *item = debugger(kit)) { if (const DebuggerItem *item = debugger(kit)) {
runnable.executable = item->command(); runnable.executable = item->command();
runnable.workingDirectory = item->workingDirectory().toString(); runnable.workingDirectory = item->workingDirectory();
runnable.environment = kit->runEnvironment(); runnable.environment = kit->runEnvironment();
runnable.environment.set("LC_NUMERIC", "C"); runnable.environment.set("LC_NUMERIC", "C");
} }

View File

@@ -889,7 +889,7 @@ DebuggerRunTool::DebuggerRunTool(RunControl *runControl, AllowTerminal allowTerm
m_runParameters.inferior = runnable(); m_runParameters.inferior = runnable();
// Normalize to work around QTBUG-17529 (QtDeclarative fails with 'File name case mismatch'...) // Normalize to work around QTBUG-17529 (QtDeclarative fails with 'File name case mismatch'...)
m_runParameters.inferior.workingDirectory = m_runParameters.inferior.workingDirectory =
FileUtils::normalizePathName(m_runParameters.inferior.workingDirectory); FilePath::fromString(FileUtils::normalizePathName(m_runParameters.inferior.workingDirectory.toString()));
setUseTerminal(allowTerminal == DoAllowTerminal && m_runParameters.useTerminal); setUseTerminal(allowTerminal == DoAllowTerminal && m_runParameters.useTerminal);
const QByteArray envBinary = qgetenv("QTC_DEBUGGER_PATH"); const QByteArray envBinary = qgetenv("QTC_DEBUGGER_PATH");

View File

@@ -3848,7 +3848,7 @@ void GdbEngine::setupEngine()
showMessage("STARTING " + gdbCommand.toUserOutput()); showMessage("STARTING " + gdbCommand.toUserOutput());
m_gdbProc.setCommand(gdbCommand); m_gdbProc.setCommand(gdbCommand);
if (QFileInfo(rp.debugger.workingDirectory).isDir()) if (rp.debugger.workingDirectory.isDir())
m_gdbProc.setWorkingDirectory(rp.debugger.workingDirectory); m_gdbProc.setWorkingDirectory(rp.debugger.workingDirectory);
m_gdbProc.setEnvironment(gdbEnv); m_gdbProc.setEnvironment(gdbEnv);
m_gdbProc.setKeepWriteChannelOpen(); m_gdbProc.setKeepWriteChannelOpen();
@@ -4463,7 +4463,7 @@ void GdbEngine::setupInferior()
setEnvironmentVariables(); setEnvironmentVariables();
if (!rp.inferior.workingDirectory.isEmpty()) if (!rp.inferior.workingDirectory.isEmpty())
runCommand({"cd " + rp.inferior.workingDirectory}); runCommand({"cd " + rp.inferior.workingDirectory.path()});
if (!rp.inferior.commandLineArguments.isEmpty()) { if (!rp.inferior.commandLineArguments.isEmpty()) {
QString args = rp.inferior.commandLineArguments; QString args = rp.inferior.commandLineArguments;
runCommand({"-exec-arguments " + args}); runCommand({"-exec-arguments " + args});

View File

@@ -213,7 +213,7 @@ void LldbEngine::setupEngine()
Environment environment = runParameters().debugger.environment; Environment environment = runParameters().debugger.environment;
environment.appendOrSet("PYTHONUNBUFFERED", "1"); // avoid flushing problem on macOS environment.appendOrSet("PYTHONUNBUFFERED", "1"); // avoid flushing problem on macOS
m_lldbProc.setEnvironment(environment); m_lldbProc.setEnvironment(environment);
if (QFileInfo(runParameters().debugger.workingDirectory).isDir()) if (runParameters().debugger.workingDirectory.isDir())
m_lldbProc.setWorkingDirectory(runParameters().debugger.workingDirectory); m_lldbProc.setWorkingDirectory(runParameters().debugger.workingDirectory);
if (HostOsInfo::isRunningUnderRosetta()) if (HostOsInfo::isRunningUnderRosetta())

View File

@@ -134,7 +134,7 @@ void PdbEngine::setupEngine()
} }
QStringList args = {bridge, scriptFile.fileName()}; QStringList args = {bridge, scriptFile.fileName()};
args.append(Utils::ProcessArgs::splitArgs(runParameters().inferior.workingDirectory)); args.append(Utils::ProcessArgs::splitArgs(runParameters().inferior.workingDirectory.path()));
showMessage("STARTING " + m_interpreter + ' ' + args.join(' ')); showMessage("STARTING " + m_interpreter + ' ' + args.join(' '));
m_proc.setEnvironment(runParameters().debugger.environment.toStringList()); m_proc.setEnvironment(runParameters().debugger.environment.toStringList());
m_proc.start(m_interpreter, args); m_proc.start(m_interpreter, args);

View File

@@ -481,7 +481,7 @@ DockerDevice::DockerDevice(const DockerDeviceData &data)
setDisplayName(tr("Docker Image \"%1\" (%2)").arg(data.repo).arg(data.imageId)); setDisplayName(tr("Docker Image \"%1\" (%2)").arg(data.repo).arg(data.imageId));
setAllowEmptyCommand(true); setAllowEmptyCommand(true);
setOpenTerminal([this](const Environment &env, const QString &workingDir) { setOpenTerminal([this](const Environment &env, const FilePath &workingDir) {
DeviceProcess * const proc = createProcess(nullptr); DeviceProcess * const proc = createProcess(nullptr);
QObject::connect(proc, &DeviceProcess::finished, [proc] { QObject::connect(proc, &DeviceProcess::finished, [proc] {
if (!proc->errorString().isEmpty()) { if (!proc->errorString().isEmpty()) {
@@ -508,7 +508,7 @@ DockerDevice::DockerDevice(const DockerDeviceData &data)
if (HostOsInfo::isAnyUnixHost()) { if (HostOsInfo::isAnyUnixHost()) {
addDeviceAction({tr("Open Shell in Container"), [](const IDevice::Ptr &device, QWidget *) { addDeviceAction({tr("Open Shell in Container"), [](const IDevice::Ptr &device, QWidget *) {
device->openTerminal(Environment(), QString()); device->openTerminal(Environment(), FilePath());
}}); }});
} }
} }

View File

@@ -97,9 +97,8 @@ public:
runControl->runConfiguration()->aspect<StringAspect>()->value(), runControl->runConfiguration()->aspect<StringAspect>()->value(),
CommandLine::Raw); CommandLine::Raw);
Runnable r; Runnable r;
r.workingDirectory =
target->activeBuildConfiguration()->buildDirectory().toUserOutput();
r.setCommandLine(cmd); r.setCommandLine(cmd);
r.workingDirectory = target->activeBuildConfiguration()->buildDirectory();
r.environment = target->activeBuildConfiguration()->environment(); r.environment = target->activeBuildConfiguration()->environment();
SimpleTargetRunner::doStart(r, {}); SimpleTargetRunner::doStart(r, {});
}); });

View File

@@ -373,9 +373,9 @@ void ApplicationLauncherPrivate::start(const Runnable &runnable, const IDevice::
if (m_isLocal) { if (m_isLocal) {
// Work around QTBUG-17529 (QtDeclarative fails with 'File name case mismatch' ...) // Work around QTBUG-17529 (QtDeclarative fails with 'File name case mismatch' ...)
const QString fixedPath = FileUtils::normalizePathName(runnable.workingDirectory); const QString fixedPath = FileUtils::normalizePathName(runnable.workingDirectory.toString());
m_guiProcess.setWorkingDirectory(fixedPath); m_guiProcess.setWorkingDirectory(fixedPath);
m_consoleProcess.setWorkingDirectory(fixedPath); m_consoleProcess.setWorkingDirectory(FilePath::fromString(fixedPath));
Environment env = runnable.environment; Environment env = runnable.environment;
if (m_runAsRoot) if (m_runAsRoot)

View File

@@ -64,7 +64,7 @@ BuildDirectoryAspect::BuildDirectoryAspect(const BuildConfiguration *bc) : d(new
return pathChooser() ? pathChooser()->defaultValidationFunction()(edit, error) : true; return pathChooser() ? pathChooser()->defaultValidationFunction()(edit, error) : true;
}); });
setOpenTerminalHandler([this, bc] { setOpenTerminalHandler([this, bc] {
Core::FileUtils::openTerminal(value(), bc->environment()); Core::FileUtils::openTerminal(FilePath::fromString(value()), bc->environment());
}); });
} }

View File

@@ -103,7 +103,7 @@ Runnable CustomExecutableRunConfiguration::runnable() const
Runnable r; Runnable r;
r.setCommandLine(commandLine()); r.setCommandLine(commandLine());
r.environment = aspect<EnvironmentAspect>()->environment(); r.environment = aspect<EnvironmentAspect>()->environment();
r.workingDirectory = workingDirectory.toString(); r.workingDirectory = workingDirectory;
r.device = DeviceManager::defaultDesktopDevice(); r.device = DeviceManager::defaultDesktopDevice();
if (!r.executable.isEmpty()) { if (!r.executable.isEmpty()) {

View File

@@ -64,7 +64,7 @@ DesktopDevice::DesktopDevice()
const QString portRange = const QString portRange =
QString::fromLatin1("%1-%2").arg(DESKTOP_PORT_START).arg(DESKTOP_PORT_END); QString::fromLatin1("%1-%2").arg(DESKTOP_PORT_START).arg(DESKTOP_PORT_END);
setFreePorts(Utils::PortList::fromString(portRange)); setFreePorts(Utils::PortList::fromString(portRange));
setOpenTerminal([](const Utils::Environment &env, const QString &workingDir) { setOpenTerminal([](const Environment &env, const FilePath &workingDir) {
Core::FileUtils::openTerminal(workingDir, env); Core::FileUtils::openTerminal(workingDir, env);
}); });
} }

View File

@@ -186,7 +186,7 @@ bool IDevice::canOpenTerminal() const
return bool(d->openTerminal); return bool(d->openTerminal);
} }
void IDevice::openTerminal(const Utils::Environment &env, const QString &workingDir) const void IDevice::openTerminal(const Environment &env, const FilePath &workingDir) const
{ {
QTC_ASSERT(canOpenTerminal(), return); QTC_ASSERT(canOpenTerminal(), return);
d->openTerminal(env, workingDir); d->openTerminal(env, workingDir);

View File

@@ -223,7 +223,7 @@ public:
void setupId(Origin origin, Utils::Id id = Utils::Id()); void setupId(Origin origin, Utils::Id id = Utils::Id());
bool canOpenTerminal() const; bool canOpenTerminal() const;
void openTerminal(const Utils::Environment &env, const QString &workingDir) const; void openTerminal(const Utils::Environment &env, const Utils::FilePath &workingDir) const;
bool isEmptyCommandAllowed() const; bool isEmptyCommandAllowed() const;
void setAllowEmptyCommand(bool allow); void setAllowEmptyCommand(bool allow);
@@ -274,7 +274,7 @@ public:
protected: protected:
IDevice(); IDevice();
using OpenTerminal = std::function<void(const Utils::Environment &, const QString &)>; using OpenTerminal = std::function<void(const Utils::Environment &, const Utils::FilePath &)>;
void setOpenTerminal(const OpenTerminal &openTerminal); void setOpenTerminal(const OpenTerminal &openTerminal);
void setDisplayType(const QString &type); void setDisplayType(const QString &type);
void setOsType(Utils::OsType osType); void setOsType(Utils::OsType osType);

View File

@@ -56,6 +56,8 @@
#include <QTreeWidgetItem> #include <QTreeWidgetItem>
#include <QVBoxLayout> #include <QVBoxLayout>
using namespace Utils;
namespace ProjectExplorer { namespace ProjectExplorer {
class PathTreeWidget : public QTreeWidget class PathTreeWidget : public QTreeWidget
@@ -320,7 +322,7 @@ EnvironmentWidget::EnvironmentWidget(QWidget *parent, Type type, QWidget *additi
if (d->m_openTerminalFunc) if (d->m_openTerminalFunc)
d->m_openTerminalFunc(env); d->m_openTerminalFunc(env);
else else
Core::FileUtils::openTerminal(QDir::currentPath(), env); Core::FileUtils::openTerminal(FilePath::fromString(QDir::currentPath()), env);
}); });
connect(d->m_detailsContainer, &Utils::DetailsWidget::linkActivated, connect(d->m_detailsContainer, &Utils::DetailsWidget::linkActivated,
this, &EnvironmentWidget::linkActivated); this, &EnvironmentWidget::linkActivated);

View File

@@ -164,7 +164,7 @@ QString ProcessParameters::prettyCommand() const
QString ProcessParameters::prettyArguments() const QString ProcessParameters::prettyArguments() const
{ {
QString margs = effectiveArguments(); QString margs = effectiveArguments();
QString workDir = effectiveWorkingDirectory().toString(); FilePath workDir = effectiveWorkingDirectory();
ProcessArgs::SplitError err; ProcessArgs::SplitError err;
ProcessArgs args = ProcessArgs args =
ProcessArgs::prepareArgs(margs, &err, HostOsInfo::hostOs(), &m_environment, &workDir); ProcessArgs::prepareArgs(margs, &err, HostOsInfo::hostOs(), &m_environment, &workDir);

View File

@@ -3704,7 +3704,7 @@ void ProjectExplorerPluginPrivate::openTerminalHere(const EnvironmentGetter &env
if (!environment) if (!environment)
return; return;
Core::FileUtils::openTerminal(currentNode->directory().toString(), environment.value()); Core::FileUtils::openTerminal(currentNode->directory(), environment.value());
} }
void ProjectExplorerPluginPrivate::openTerminalHereWithRunEnv() void ProjectExplorerPluginPrivate::openTerminalHereWithRunEnv()
@@ -3725,8 +3725,8 @@ void ProjectExplorerPluginPrivate::openTerminalHereWithRunEnv()
if (!device) if (!device)
device = DeviceKitAspect::device(target->kit()); device = DeviceKitAspect::device(target->kit());
QTC_ASSERT(device && device->canOpenTerminal(), return); QTC_ASSERT(device && device->canOpenTerminal(), return);
const QString workingDir = device->type() == Constants::DESKTOP_DEVICE_TYPE const FilePath workingDir = device->type() == Constants::DESKTOP_DEVICE_TYPE
? currentNode->directory().toString() : runnable.workingDirectory; ? currentNode->directory() : runnable.workingDirectory;
device->openTerminal(runnable.environment, workingDir); device->openTerminal(runnable.environment, workingDir);
} }

View File

@@ -400,7 +400,7 @@ Runnable RunConfiguration::runnable() const
Runnable r; Runnable r;
r.setCommandLine(commandLine()); r.setCommandLine(commandLine());
if (auto workingDirectoryAspect = aspect<WorkingDirectoryAspect>()) if (auto workingDirectoryAspect = aspect<WorkingDirectoryAspect>())
r.workingDirectory = workingDirectoryAspect->workingDirectory(macroExpander()).toString(); r.workingDirectory = workingDirectoryAspect->workingDirectory(macroExpander());
if (auto environmentAspect = aspect<EnvironmentAspect>()) if (auto environmentAspect = aspect<EnvironmentAspect>())
r.environment = environmentAspect->environment(); r.environment = environmentAspect->environment();
if (m_runnableModifier) if (m_runnableModifier)

View File

@@ -72,7 +72,7 @@ public:
Utils::FilePath executable; Utils::FilePath executable;
QString commandLineArguments; QString commandLineArguments;
QString workingDirectory; Utils::FilePath workingDirectory;
Utils::Environment environment; Utils::Environment environment;
IDevice::ConstPtr device; // Override the kit's device. Keep unset by default. IDevice::ConstPtr device; // Override the kit's device. Keep unset by default.
QHash<Utils::Id, QVariant> extraData; QHash<Utils::Id, QVariant> extraData;

View File

@@ -517,10 +517,10 @@ void openPythonRepl(const FilePath &file, ReplType type)
static const auto workingDir = [](const FilePath &file) { static const auto workingDir = [](const FilePath &file) {
if (file.isEmpty()) { if (file.isEmpty()) {
if (ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject()) if (ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject())
return project->projectDirectory().toFileInfo().filePath(); return project->projectDirectory();
return QDir::currentPath(); return FilePath::fromString(QDir::currentPath());
} }
return file.toFileInfo().path(); return file;
}; };
const auto args = QStringList{"-i"} + replImportArgs(file, type); const auto args = QStringList{"-i"} + replImportArgs(file, type);

View File

@@ -138,7 +138,7 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target, Id id)
setRunnableModifier([this](Runnable &r) { setRunnableModifier([this](Runnable &r) {
const QmlBuildSystem *bs = static_cast<QmlBuildSystem *>(activeBuildSystem()); const QmlBuildSystem *bs = static_cast<QmlBuildSystem *>(activeBuildSystem());
r.workingDirectory = bs->targetDirectory().toString(); r.workingDirectory = bs->targetDirectory();
}); });
setDisplayName(tr("QML Utility", "QMLRunConfiguration display name.")); setDisplayName(tr("QML Utility", "QMLRunConfiguration display name."));

View File

@@ -55,7 +55,8 @@ QString QnxDeviceProcess::fullCommandLine(const Runnable &runnable) const
"test -f $HOME/profile && . $HOME/profile ; "; "test -f $HOME/profile && . $HOME/profile ; ";
if (!runnable.workingDirectory.isEmpty()) if (!runnable.workingDirectory.isEmpty())
fullCommandLine += QString::fromLatin1("cd %1 ; ").arg(ProcessArgs::quoteArg(runnable.workingDirectory)); fullCommandLine += QString::fromLatin1("cd %1 ; ").arg(
ProcessArgs::quoteArg(runnable.workingDirectory.toString()));
const Environment env = runnable.environment; const Environment env = runnable.environment;
for (auto it = env.constBegin(); it != env.constEnd(); ++it) { for (auto it = env.constBegin(); it != env.constEnd(); ++it) {

View File

@@ -189,7 +189,7 @@ LinuxDevice::LinuxDevice()
} }
}}); }});
setOpenTerminal([this](const Utils::Environment &env, const QString &workingDir) { setOpenTerminal([this](const Environment &env, const FilePath &workingDir) {
DeviceProcess * const proc = createProcess(nullptr); DeviceProcess * const proc = createProcess(nullptr);
QObject::connect(proc, &DeviceProcess::finished, [proc] { QObject::connect(proc, &DeviceProcess::finished, [proc] {
if (!proc->errorString().isEmpty()) { if (!proc->errorString().isEmpty()) {
@@ -218,7 +218,7 @@ LinuxDevice::LinuxDevice()
if (Utils::HostOsInfo::isAnyUnixHost()) { if (Utils::HostOsInfo::isAnyUnixHost()) {
addDeviceAction({tr("Open Remote Shell"), [](const IDevice::Ptr &device, QWidget *) { addDeviceAction({tr("Open Remote Shell"), [](const IDevice::Ptr &device, QWidget *) {
device->openTerminal(Utils::Environment(), QString()); device->openTerminal(Environment(), FilePath());
}}); }});
} }
} }

View File

@@ -96,7 +96,7 @@ QString LinuxDeviceProcess::fullCommandLine(const Runnable &runnable) const
} }
if (!runnable.workingDirectory.isEmpty()) { if (!runnable.workingDirectory.isEmpty()) {
cmd.addArgs({"cd", runnable.workingDirectory}); cmd.addArgs({"cd", runnable.workingDirectory.path()});
cmd.addArgs("&&", CommandLine::Raw); cmd.addArgs("&&", CommandLine::Raw);
} }

View File

@@ -41,6 +41,7 @@
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace RemoteLinux::Internal; using namespace RemoteLinux::Internal;
using namespace Utils;
namespace { namespace {
const QString FetchEnvButtonText const QString FetchEnvButtonText
@@ -79,7 +80,7 @@ RemoteLinuxEnvironmentAspectWidget::RemoteLinuxEnvironmentAspectWidget
} }
const auto linuxDevice = device.dynamicCast<const LinuxDevice>(); const auto linuxDevice = device.dynamicCast<const LinuxDevice>();
QTC_ASSERT(linuxDevice, return); QTC_ASSERT(linuxDevice, return);
linuxDevice->openTerminal(env, QString()); linuxDevice->openTerminal(env, FilePath());
}; };
envWidget()->setOpenTerminalFunc(openTerminalFunc); envWidget()->setOpenTerminalFunc(openTerminalFunc);
} }

View File

@@ -207,7 +207,7 @@ void CallgrindController::getLocalDataFile()
{ {
// we look for callgrind.out.PID, but there may be updated ones called ~.PID.NUM // we look for callgrind.out.PID, but there may be updated ones called ~.PID.NUM
const QString baseFileName = QString("callgrind.out.%1").arg(m_pid); const QString baseFileName = QString("callgrind.out.%1").arg(m_pid);
const QString workingDir = m_valgrindRunnable.workingDirectory; const QString workingDir = m_valgrindRunnable.workingDirectory.toString();
// first, set the to-be-parsed file to callgrind.out.PID // first, set the to-be-parsed file to callgrind.out.PID
QString fileName = workingDir.isEmpty() ? baseFileName : (workingDir + '/' + baseFileName); QString fileName = workingDir.isEmpty() ? baseFileName : (workingDir + '/' + baseFileName);

View File

@@ -752,7 +752,7 @@ void MemcheckToolPrivate::heobAction()
} }
QString executable = sr.executable.toString(); QString executable = sr.executable.toString();
const QString workingDirectory = Utils::FileUtils::normalizePathName(sr.workingDirectory); const QString workingDirectory = Utils::FileUtils::normalizePathName(sr.workingDirectory.toString());
const QString commandLineArguments = sr.commandLineArguments; const QString commandLineArguments = sr.commandLineArguments;
const QStringList envStrings = sr.environment.toStringList(); const QStringList envStrings = sr.environment.toStringList();