From accb1e6e08305ea7a7f34e38284360949e9c0dc4 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 3 Jun 2021 10:39:15 +0200 Subject: [PATCH] Utils: Make QtcProcess::{setW,w}orkingDirectory use FilePath But keep the old setter for a while to ease transition. Change-Id: If02b79b1fcd31fbf8b06ef26876c41af891127f9 Reviewed-by: hjk --- src/libs/utils/buildablehelperlibrary.cpp | 3 ++- src/libs/utils/qtcprocess.cpp | 21 +++++++++++++++---- src/libs/utils/qtcprocess.h | 5 +++-- src/plugins/android/androiddeployqtstep.cpp | 2 +- .../cmakeprojectmanager/cmakeprocess.cpp | 2 +- src/plugins/debugger/gdb/gdbengine.cpp | 7 ++++--- src/plugins/docker/dockerdevice.cpp | 6 +++--- src/plugins/git/gerrit/gerritmodel.cpp | 2 +- .../project/mesonprocess.cpp | 2 +- .../projectexplorer/abstractprocessstep.cpp | 5 ++--- 10 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/libs/utils/buildablehelperlibrary.cpp b/src/libs/utils/buildablehelperlibrary.cpp index 8d75be68737..3ffee6a7c90 100644 --- a/src/libs/utils/buildablehelperlibrary.cpp +++ b/src/libs/utils/buildablehelperlibrary.cpp @@ -285,7 +285,8 @@ static bool runBuildProcess(QtcProcess &proc, *errorMessage = QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary", "Error running \"%1\" in %2: %3"). - arg(cmd, proc.workingDirectory(), *errorMessage); + arg(cmd, proc.workingDirectory().toUserOutput(), + *errorMessage); qWarning("%s", qPrintable(*errorMessage)); } return rc; diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 3a73bd2ebee..7ac4ee19322 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -170,6 +170,7 @@ public: QtcProcess *q; ProcessHelper *m_process; CommandLine m_commandLine; + FilePath m_workingDirectory; Environment m_environment; QByteArray m_writeData; bool m_haveEnv = false; @@ -263,6 +264,9 @@ const Environment &QtcProcess::environment() const void QtcProcess::setCommand(const CommandLine &cmdLine) { + if (d->m_workingDirectory.needsDevice() && cmdLine.executable().needsDevice()) { + QTC_CHECK(d->m_workingDirectory.host() == cmdLine.executable().host()); + } d->m_commandLine = cmdLine; } @@ -271,14 +275,22 @@ const CommandLine &QtcProcess::commandLine() const return d->m_commandLine; } -QString QtcProcess::workingDirectory() const +FilePath QtcProcess::workingDirectory() const { - return d->m_process->workingDirectory(); + return d->m_workingDirectory; +} + +void QtcProcess::setWorkingDirectory(const FilePath &dir) +{ + if (dir.needsDevice() && d->m_commandLine.executable().needsDevice()) { + QTC_CHECK(dir.host() == d->m_commandLine.executable().host()); + } + d->m_workingDirectory = dir; } void QtcProcess::setWorkingDirectory(const QString &dir) { - d->m_process->setWorkingDirectory(dir); + setWorkingDirectory(FilePath::fromString(dir)); } void QtcProcess::setUseCtrlCStub(bool enabled) @@ -322,7 +334,8 @@ void QtcProcess::start() env = Environment::systemEnvironment(); } - const QString &workDir = workingDirectory(); + const QString workDir = d->m_workingDirectory.path(); + QString command; ProcessArgs arguments; bool success = ProcessArgs::prepareCommand(d->m_commandLine.executable().toString(), diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index 1de64b02990..b79dd3f4303 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -83,8 +83,9 @@ public: void setCommand(const CommandLine &cmdLine); const CommandLine &commandLine() const; - QString workingDirectory() const; - void setWorkingDirectory(const QString &dir); + FilePath workingDirectory() const; + void setWorkingDirectory(const FilePath &dir); + void setWorkingDirectory(const QString &dir); // FIXME: Kept to ease downstream transition void setUseCtrlCStub(bool enabled); void setLowPriority(); diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index aa65539eede..c7f4e830771 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -289,7 +289,7 @@ AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::runDeploy() m_process = new Utils::QtcProcess; m_process->setCommand(cmd); - m_process->setWorkingDirectory(m_workingDirectory.toString()); + m_process->setWorkingDirectory(m_workingDirectory); m_process->setEnvironment(m_environment); if (Utils::HostOsInfo::isWindowsHost()) diff --git a/src/plugins/cmakeprojectmanager/cmakeprocess.cpp b/src/plugins/cmakeprojectmanager/cmakeprocess.cpp index efabe3f52a8..5a78f4a7b90 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprocess.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprocess.cpp @@ -103,7 +103,7 @@ void CMakeProcess::run(const BuildDirParameters ¶meters, const QStringList & m_cancelTimer.start(); - process->setWorkingDirectory(workDirectory.toString()); + process->setWorkingDirectory(workDirectory); process->setEnvironment(parameters.environment); connect(process.get(), &QtcProcess::readyReadStandardOutput, diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 95a332d37c7..1435de0ff29 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -3856,9 +3856,10 @@ void GdbEngine::setupEngine() if (!m_gdbProc.waitForStarted()) { handleGdbStartFailed(); QString msg; - QString wd = m_gdbProc.workingDirectory(); - if (!QFileInfo(wd).isDir()) - msg = failedToStartMessage() + ' ' + tr("The working directory \"%1\" is not usable.").arg(wd); + FilePath wd = m_gdbProc.workingDirectory(); + if (!wd.isReadableDir()) + msg = failedToStartMessage() + ' ' + tr("The working directory \"%1\" is not usable.") + .arg(wd.toUserOutput()); else msg = RunWorker::userMessageForProcessError(QProcess::FailedToStart, rp.debugger.executable); handleAdapterStartFailed(msg); diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 70a2f9a5a1c..92aa80a74af 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -718,16 +718,16 @@ QByteArray DockerDevice::fileContents(const FilePath &filePath, int limit) const void DockerDevice::runProcess(QtcProcess &process) const { - const QString origWd = process.workingDirectory(); + const FilePath workingDir = process.workingDirectory(); const CommandLine origCmd = process.commandLine(); CommandLine cmd{"docker", {"exec"}}; - cmd.addArgs({"-w", process.workingDirectory()}); + cmd.addArgs({"-w", workingDir.path()}); cmd.addArg(d->m_container); cmd.addArg(origCmd.executable().path()); // Cut off the docker://.../ bits. cmd.addArgs(origCmd.splitArguments(osType())); - LOG("Run" << cmd.toUserOutput()); + LOG("Run" << cmd.toUserOutput() << " in " << workingDir.toUserOutput()); process.setCommand(cmd); process.start(); diff --git a/src/plugins/git/gerrit/gerritmodel.cpp b/src/plugins/git/gerrit/gerritmodel.cpp index 7558cfd50de..d954c31e219 100644 --- a/src/plugins/git/gerrit/gerritmodel.cpp +++ b/src/plugins/git/gerrit/gerritmodel.cpp @@ -321,7 +321,7 @@ void QueryContext::start() fp->setKeepOnFinish(Core::FutureProgress::HideOnFinish); m_progress.reportStarted(); // Order: synchronous call to error handling if something goes wrong. - VcsOutputWindow::appendCommand(m_process.workingDirectory(), {m_binary, m_arguments}); + VcsOutputWindow::appendCommand(m_process.workingDirectory().toString(), {m_binary, m_arguments}); m_timer.start(); m_process.setCommand({m_binary, m_arguments}); m_process.start(); diff --git a/src/plugins/mesonprojectmanager/project/mesonprocess.cpp b/src/plugins/mesonprojectmanager/project/mesonprocess.cpp index a761f9dc2f6..9a6ca5a4c4a 100644 --- a/src/plugins/mesonprojectmanager/project/mesonprocess.cpp +++ b/src/plugins/mesonprojectmanager/project/mesonprocess.cpp @@ -180,7 +180,7 @@ void MesonProcess::setupProcess(const Command &command, &MesonProcess::processStandardError); } - m_process->setWorkingDirectory(command.workDir().toString()); + m_process->setWorkingDirectory(command.workDir()); m_process->setEnvironment(env); Core::MessageManager::writeFlashing( tr("Running %1 in %2.").arg(command.toUserOutput()).arg(command.workDir().toUserOutput())); diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index fa6a506ec12..4224046fa52 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -220,13 +220,12 @@ void AbstractProcessStep::doRun() d->m_process.reset(new QtcProcess()); d->m_process->setUseCtrlCStub(HostOsInfo::isWindowsHost()); - if (!wd.needsDevice()) // FIXME: Make QtcProcess take FilePath as working directory. - d->m_process->setWorkingDirectory(wd.toString()); + d->m_process->setWorkingDirectory(wd); // Enforce PWD in the environment because some build tools use that. // PWD can be different from getcwd in case of symbolic links (getcwd resolves symlinks). // For example Clang uses PWD for paths in debug info, see QTCREATORBUG-23788 Environment envWithPwd = d->m_param.environment(); - envWithPwd.set("PWD", d->m_process->workingDirectory()); + envWithPwd.set("PWD", d->m_process->workingDirectory().path()); d->m_process->setEnvironment(envWithPwd); d->m_process->setCommand(effectiveCommand); if (d->m_lowPriority && ProjectExplorerPlugin::projectExplorerSettings().lowBuildPriority)