diff --git a/src/plugins/python/pipsupport.cpp b/src/plugins/python/pipsupport.cpp index d6070663fb6..6aa4e466ae5 100644 --- a/src/plugins/python/pipsupport.cpp +++ b/src/plugins/python/pipsupport.cpp @@ -35,6 +35,16 @@ PipInstallTask::PipInstallTask(const FilePath &python) m_watcher.setFuture(m_future.future()); } +void PipInstallTask::setRequirements(const Utils::FilePath &requirementFile) +{ + m_requirementsFile = requirementFile; +} + +void PipInstallTask::setWorkingDirectory(const Utils::FilePath &workingDirectory) +{ + m_process.setWorkingDirectory(workingDirectory); +} + void PipInstallTask::addPackage(const PipPackage &package) { m_packages << package; @@ -47,18 +57,22 @@ void PipInstallTask::setPackages(const QList &packages) void PipInstallTask::run() { - if (m_packages.isEmpty()) { + if (m_packages.isEmpty() && m_requirementsFile.isEmpty()) { emit finished(false); return; } const QString taskTitle = Tr::tr("Install Python Packages"); Core::ProgressManager::addTask(m_future.future(), taskTitle, pipInstallTaskId); QStringList arguments = {"-m", "pip", "install"}; - for (const PipPackage &package : m_packages) { - QString pipPackage = package.packageName; - if (!package.version.isEmpty()) - pipPackage += "==" + package.version; - arguments << pipPackage; + if (!m_requirementsFile.isEmpty()) + arguments << "-r" << m_requirementsFile.toString(); + else { + for (const PipPackage &package : m_packages) { + QString pipPackage = package.packageName; + if (!package.version.isEmpty()) + pipPackage += "==" + package.version; + arguments << pipPackage; + } } // add --user to global pythons, but skip it for venv pythons @@ -115,7 +129,9 @@ void PipInstallTask::handleError() QString PipInstallTask::packagesDisplayName() const { - return Utils::transform(m_packages, &PipPackage::displayName).join(", "); + return m_requirementsFile.isEmpty() + ? Utils::transform(m_packages, &PipPackage::displayName).join(", ") + : m_requirementsFile.toUserOutput(); } void PipPackageInfo::parseField(const QString &field, const QStringList &data) diff --git a/src/plugins/python/pipsupport.h b/src/plugins/python/pipsupport.h index 4d08a3b1ea6..586a2f55e70 100644 --- a/src/plugins/python/pipsupport.h +++ b/src/plugins/python/pipsupport.h @@ -63,6 +63,8 @@ class PipInstallTask : public QObject Q_OBJECT public: explicit PipInstallTask(const Utils::FilePath &python); + void setRequirements(const Utils::FilePath &requirementFile); + void setWorkingDirectory(const Utils::FilePath &workingDirectory); void addPackage(const PipPackage &package); void setPackages(const QList &packages); void run(); @@ -80,6 +82,7 @@ private: const Utils::FilePath m_python; QList m_packages; + Utils::FilePath m_requirementsFile; Utils::Process m_process; QFutureInterface m_future; QFutureWatcher m_watcher;