ProjectExplorer: Allow ProcessStep to resolve relative paths

Change-Id: I35a06f7d32e528cc8b524c6db86d8d62be2c8201
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Marcus Tillmanns
2024-10-07 16:24:53 +02:00
parent 3b8f537c26
commit a8a19767b4
2 changed files with 17 additions and 2 deletions

View File

@@ -19,6 +19,8 @@ namespace ProjectExplorer::Internal {
const char PROCESS_COMMAND_KEY[] = "ProjectExplorer.ProcessStep.Command"; const char PROCESS_COMMAND_KEY[] = "ProjectExplorer.ProcessStep.Command";
const char PROCESS_WORKINGDIRECTORY_KEY[] = "ProjectExplorer.ProcessStep.WorkingDirectory"; const char PROCESS_WORKINGDIRECTORY_KEY[] = "ProjectExplorer.ProcessStep.WorkingDirectory";
const char PROCESS_WORKINGDIRECTORYRELATIVEBASE_KEY[]
= "ProjectExplorer.ProcessStep.WorkingDirectoryRelativeBasePath";
const char PROCESS_ARGUMENTS_KEY[] = "ProjectExplorer.ProcessStep.Arguments"; const char PROCESS_ARGUMENTS_KEY[] = "ProjectExplorer.ProcessStep.Arguments";
ProcessStep::ProcessStep(BuildStepList *bsl, Id id) ProcessStep::ProcessStep(BuildStepList *bsl, Id id)
@@ -38,10 +40,18 @@ ProcessStep::ProcessStep(BuildStepList *bsl, Id id)
m_workingDirectory.setLabelText(Tr::tr("Working directory:")); m_workingDirectory.setLabelText(Tr::tr("Working directory:"));
m_workingDirectory.setExpectedKind(PathChooser::Directory); m_workingDirectory.setExpectedKind(PathChooser::Directory);
m_workingDirRelativeBasePath.setSettingsKey(PROCESS_WORKINGDIRECTORYRELATIVEBASE_KEY);
m_workingDirRelativeBasePath.setValue(QString());
m_workingDirRelativeBasePath.setVisible(false);
m_workingDirRelativeBasePath.setExpectedKind(PathChooser::Directory);
setWorkingDirectoryProvider([this] { setWorkingDirectoryProvider([this] {
const FilePath workingDir = m_workingDirectory(); const FilePath workingDir = m_workingDirectory();
const FilePath relativeBasePath = m_workingDirRelativeBasePath();
if (workingDir.isEmpty()) if (workingDir.isEmpty())
return FilePath::fromString(fallbackWorkingDirectory()); return FilePath::fromString(fallbackWorkingDirectory());
else if (workingDir.isRelativePath() && !relativeBasePath.isEmpty())
return relativeBasePath.resolvePath(workingDir);
return workingDir; return workingDir;
}); });
@@ -69,9 +79,11 @@ void ProcessStep::setArguments(const QStringList &arguments)
m_arguments.setValue(arguments.join(" ")); m_arguments.setValue(arguments.join(" "));
} }
void ProcessStep::setWorkingDirectory(const Utils::FilePath &workingDirectory) void ProcessStep::setWorkingDirectory(
const Utils::FilePath &workingDirectory, const Utils::FilePath &relativeBasePath)
{ {
m_workingDirectory.setValue(workingDirectory); m_workingDirectory.setValue(workingDirectory);
m_workingDirRelativeBasePath.setValue(relativeBasePath);
} }
void ProcessStep::setupOutputFormatter(OutputFormatter *formatter) void ProcessStep::setupOutputFormatter(OutputFormatter *formatter)

View File

@@ -15,7 +15,9 @@ public:
void setCommand(const Utils::FilePath &command); void setCommand(const Utils::FilePath &command);
void setArguments(const QStringList &arguments); void setArguments(const QStringList &arguments);
void setWorkingDirectory(const Utils::FilePath &workingDirectory); void setWorkingDirectory(
const Utils::FilePath &workingDirectory,
const Utils::FilePath &relativeBasePath = Utils::FilePath());
private: private:
void setupOutputFormatter(Utils::OutputFormatter *formatter) final; void setupOutputFormatter(Utils::OutputFormatter *formatter) final;
@@ -23,6 +25,7 @@ private:
Utils::FilePathAspect m_command{this}; Utils::FilePathAspect m_command{this};
Utils::StringAspect m_arguments{this}; Utils::StringAspect m_arguments{this};
Utils::FilePathAspect m_workingDirectory{this}; Utils::FilePathAspect m_workingDirectory{this};
Utils::FilePathAspect m_workingDirRelativeBasePath{this};
}; };
class ProcessStepFactory final : public BuildStepFactory class ProcessStepFactory final : public BuildStepFactory