Handle environment variables in customprocessstep

Reviewed-by: dt
This commit is contained in:
Tobias Hunger
2010-09-23 13:11:37 +02:00
parent cfe21cafee
commit e9f412c3ed
3 changed files with 53 additions and 25 deletions

View File

@@ -71,6 +71,11 @@ void AbstractProcessStep::setCommand(const QString &cmd)
m_command = cmd; m_command = cmd;
} }
QString AbstractProcessStep::command() const
{
return m_command;
}
QString AbstractProcessStep::workingDirectory() const QString AbstractProcessStep::workingDirectory() const
{ {
return m_workingDirectory; return m_workingDirectory;
@@ -114,6 +119,11 @@ void AbstractProcessStep::setArguments(const QStringList &arguments)
m_arguments = arguments; m_arguments = arguments;
} }
QStringList AbstractProcessStep::arguments() const
{
return m_arguments;
}
void AbstractProcessStep::setEnabled(bool b) void AbstractProcessStep::setEnabled(bool b)
{ {
m_enabled = b; m_enabled = b;
@@ -131,11 +141,6 @@ void AbstractProcessStep::setEnvironment(Utils::Environment env)
bool AbstractProcessStep::init() bool AbstractProcessStep::init()
{ {
if (QFileInfo(m_command).isRelative()) {
QString searchInPath = m_environment.searchInPath(m_command);
if (!searchInPath.isEmpty())
m_command = searchInPath;
}
return true; return true;
} }
@@ -146,12 +151,13 @@ void AbstractProcessStep::run(QFutureInterface<bool> &fi)
fi.reportResult(true); fi.reportResult(true);
return; return;
} }
QDir wd(m_workingDirectory); QString workDir = m_environment.expandVariables(m_workingDirectory);
QDir wd(workDir);
if (!wd.exists()) if (!wd.exists())
wd.mkpath(wd.absolutePath()); wd.mkpath(wd.absolutePath());
m_process = new QProcess(); m_process = new QProcess();
m_process->setWorkingDirectory(m_workingDirectory); m_process->setWorkingDirectory(workDir);
m_process->setEnvironment(m_environment.toStringList()); m_process->setEnvironment(m_environment.toStringList());
connect(m_process, SIGNAL(readyReadStandardOutput()), connect(m_process, SIGNAL(readyReadStandardOutput()),
@@ -165,7 +171,7 @@ void AbstractProcessStep::run(QFutureInterface<bool> &fi)
this, SLOT(slotProcessFinished(int, QProcess::ExitStatus)), this, SLOT(slotProcessFinished(int, QProcess::ExitStatus)),
Qt::DirectConnection); Qt::DirectConnection);
m_process->start(m_command, m_arguments); m_process->start(expandedCommand(), m_environment.expandVariables(m_arguments));
if (!m_process->waitForStarted()) { if (!m_process->waitForStarted()) {
processStartupFailed(); processStartupFailed();
delete m_process; delete m_process;
@@ -205,27 +211,34 @@ void AbstractProcessStep::run(QFutureInterface<bool> &fi)
void AbstractProcessStep::processStarted() void AbstractProcessStep::processStarted()
{ {
emit addOutput(tr("Starting: \"%1\" %2\n").arg(QDir::toNativeSeparators(m_command), m_arguments.join(" ")), BuildStep::MessageOutput); emit addOutput(tr("Starting: \"%1\" %2\n")
.arg(QDir::toNativeSeparators(expandedCommand()),
m_environment.expandVariables(m_arguments).join(QChar(' '))),
BuildStep::MessageOutput);
} }
void AbstractProcessStep::processFinished(int exitCode, QProcess::ExitStatus status) void AbstractProcessStep::processFinished(int exitCode, QProcess::ExitStatus status)
{ {
QString command = expandedCommand();
if (status == QProcess::NormalExit && exitCode == 0) { if (status == QProcess::NormalExit && exitCode == 0) {
emit addOutput(tr("The process \"%1\" exited normally.") emit addOutput(tr("The process \"%1\" exited normally.")
.arg(QDir::toNativeSeparators(m_command)), .arg(QDir::toNativeSeparators(command)),
BuildStep::MessageOutput); BuildStep::MessageOutput);
} else if (status == QProcess::NormalExit) { } else if (status == QProcess::NormalExit) {
emit addOutput(tr("The process \"%1\" exited with code %2.") emit addOutput(tr("The process \"%1\" exited with code %2.")
.arg(QDir::toNativeSeparators(m_command), QString::number(m_process->exitCode())), .arg(QDir::toNativeSeparators(command), QString::number(m_process->exitCode())),
BuildStep::ErrorMessageOutput); BuildStep::ErrorMessageOutput);
} else { } else {
emit addOutput(tr("The process \"%1\" crashed.").arg(QDir::toNativeSeparators(m_command)), BuildStep::ErrorMessageOutput); emit addOutput(tr("The process \"%1\" crashed.").arg(QDir::toNativeSeparators(command)), BuildStep::ErrorMessageOutput);
} }
} }
void AbstractProcessStep::processStartupFailed() void AbstractProcessStep::processStartupFailed()
{ {
emit addOutput(tr("Could not start process \"%1\"").arg(QDir::toNativeSeparators(m_command)), BuildStep::ErrorMessageOutput); emit addOutput(tr("Could not start process \"%1\" %2").
arg(QDir::toNativeSeparators(expandedCommand()),
m_environment.expandVariables(m_arguments).join(QChar(' '))),
BuildStep::ErrorMessageOutput);
} }
bool AbstractProcessStep::processSucceeded(int exitCode, QProcess::ExitStatus status) bool AbstractProcessStep::processSucceeded(int exitCode, QProcess::ExitStatus status)
@@ -340,3 +353,11 @@ void AbstractProcessStep::slotProcessFinished(int, QProcess::ExitStatus)
m_eventLoop->exit(0); m_eventLoop->exit(0);
} }
QString AbstractProcessStep::expandedCommand() const
{
QString command = m_environment.searchInPath(m_command, QStringList() << workingDirectory());
if (command.isEmpty())
command = m_command;
return command;
}

View File

@@ -85,6 +85,7 @@ public:
/// setCommand() sets the executable to run in the \p buildConfiguration /// setCommand() sets the executable to run in the \p buildConfiguration
/// should be called from init() /// should be called from init()
void setCommand(const QString &cmd); void setCommand(const QString &cmd);
QString command() const;
/// sets the workingDirectory for the process for a buildConfiguration /// sets the workingDirectory for the process for a buildConfiguration
/// should be called from init() /// should be called from init()
@@ -93,6 +94,7 @@ public:
/// sets the command line arguments used by the process for a \p buildConfiguration /// sets the command line arguments used by the process for a \p buildConfiguration
/// should be called from init() /// should be called from init()
void setArguments(const QStringList &arguments); void setArguments(const QStringList &arguments);
QStringList arguments() const;
/// enables or disables a BuildStep /// enables or disables a BuildStep
/// Disabled BuildSteps immediately return true from their run method /// Disabled BuildSteps immediately return true from their run method
@@ -121,6 +123,9 @@ protected:
AbstractProcessStep(BuildStepList *bsl, const QString &id); AbstractProcessStep(BuildStepList *bsl, const QString &id);
AbstractProcessStep(BuildStepList *bsl, AbstractProcessStep *bs); AbstractProcessStep(BuildStepList *bsl, AbstractProcessStep *bs);
/// Get the fully expanded command name to run:
QString expandedCommand() const;
/// Called after the process is started /// Called after the process is started
/// the default implementation adds a process started message to the output message /// the default implementation adds a process started message to the output message
virtual void processStarted(); virtual void processStarted();
@@ -151,6 +156,7 @@ private slots:
void outputAdded(const QString &string, ProjectExplorer::BuildStep::OutputFormat format); void outputAdded(const QString &string, ProjectExplorer::BuildStep::OutputFormat format);
private: private:
QTimer *m_timer; QTimer *m_timer;
QFutureInterface<bool> *m_futureInterface; QFutureInterface<bool> *m_futureInterface;
QString m_workingDirectory; QString m_workingDirectory;

View File

@@ -77,6 +77,8 @@ void ProcessStep::ctor()
{ {
//: Default ProcessStep display name //: Default ProcessStep display name
setDefaultDisplayName(tr("Custom Process Step")); setDefaultDisplayName(tr("Custom Process Step"));
if (m_workingDirectory.isEmpty())
m_workingDirectory = QLatin1String("$BUILDDIR");
} }
ProcessStep::~ProcessStep() ProcessStep::~ProcessStep()
@@ -87,11 +89,8 @@ bool ProcessStep::init()
{ {
BuildConfiguration *bc = buildConfiguration(); BuildConfiguration *bc = buildConfiguration();
setEnvironment(bc->environment()); setEnvironment(bc->environment());
QString wd = workingDirectory();
if (wd.isEmpty())
wd = "$BUILDDIR";
AbstractProcessStep::setWorkingDirectory(wd.replace("$BUILDDIR", bc->buildDirectory())); AbstractProcessStep::setWorkingDirectory(workingDirectory());
AbstractProcessStep::setCommand(m_command); AbstractProcessStep::setCommand(m_command);
AbstractProcessStep::setEnabled(m_enabled); AbstractProcessStep::setEnabled(m_enabled);
AbstractProcessStep::setArguments(m_arguments); AbstractProcessStep::setArguments(m_arguments);
@@ -151,7 +150,10 @@ void ProcessStep::setEnabled(bool enabled)
void ProcessStep::setWorkingDirectory(const QString &workingDirectory) void ProcessStep::setWorkingDirectory(const QString &workingDirectory)
{ {
m_workingDirectory = workingDirectory; if (workingDirectory.isEmpty())
m_workingDirectory = QLatin1String("$BUILDDIR");
else
m_workingDirectory = workingDirectory;
} }
QVariantMap ProcessStep::toMap() const QVariantMap ProcessStep::toMap() const
@@ -249,7 +251,7 @@ ProcessStepConfigWidget::ProcessStepConfigWidget(ProcessStep *step)
: m_step(step) : m_step(step)
{ {
m_ui.setupUi(this); m_ui.setupUi(this);
m_ui.command->setExpectedKind(Utils::PathChooser::Command); m_ui.command->setExpectedKind(Utils::PathChooser::ExistingCommand);
connect(m_ui.command, SIGNAL(changed(QString)), connect(m_ui.command, SIGNAL(changed(QString)),
this, SLOT(commandLineEditTextEdited())); this, SLOT(commandLineEditTextEdited()));
connect(m_ui.workingDirectory, SIGNAL(changed(QString)), connect(m_ui.workingDirectory, SIGNAL(changed(QString)),
@@ -281,12 +283,11 @@ QString ProcessStepConfigWidget::displayName() const
void ProcessStepConfigWidget::init() void ProcessStepConfigWidget::init()
{ {
m_ui.command->setEnvironment(m_step->buildConfiguration()->environment());
m_ui.command->setPath(m_step->command()); m_ui.command->setPath(m_step->command());
QString workingDirectory = m_step->workingDirectory(); m_ui.workingDirectory->setEnvironment(m_step->buildConfiguration()->environment());
if (workingDirectory.isEmpty()) m_ui.workingDirectory->setPath(m_step->workingDirectory());
workingDirectory = "$BUILDDIR";
m_ui.workingDirectory->setPath(workingDirectory);
m_ui.commandArgumentsLineEdit->setText(m_step->arguments().join(QString(QLatin1Char(' ')))); m_ui.commandArgumentsLineEdit->setText(m_step->arguments().join(QString(QLatin1Char(' '))));
m_ui.enabledCheckBox->setChecked(m_step->enabled()); m_ui.enabledCheckBox->setChecked(m_step->enabled());
@@ -301,13 +302,13 @@ QString ProcessStepConfigWidget::summaryText() const
void ProcessStepConfigWidget::commandLineEditTextEdited() void ProcessStepConfigWidget::commandLineEditTextEdited()
{ {
m_step->setCommand(m_ui.command->path()); m_step->setCommand(m_ui.command->rawPath());
updateDetails(); updateDetails();
} }
void ProcessStepConfigWidget::workingDirectoryLineEditTextEdited() void ProcessStepConfigWidget::workingDirectoryLineEditTextEdited()
{ {
m_step->setWorkingDirectory(m_ui.workingDirectory->path()); m_step->setWorkingDirectory(m_ui.workingDirectory->rawPath());
} }
void ProcessStepConfigWidget::commandArgumentsLineEditTextEdited() void ProcessStepConfigWidget::commandArgumentsLineEditTextEdited()