aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/pythonextensions/pythonextensionsplugin.cpp
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2018-09-21 13:15:47 +0200
committerEike Ziller <eike.ziller@qt.io>2018-09-21 11:54:38 +0000
commit9ebe20ca27fbce2ca2934e40dfd1a7a21aaa6658 (patch)
tree03effab1e69b9213210ee63c7ad32c37418b42ab /plugins/pythonextensions/pythonextensionsplugin.cpp
parent4d6487e753b8838f460769ff9758ac6c82a88a35 (diff)
Avoid scanning extension directory over and over again
And get rid of separate management of a list of loaded extensions. Instead save the name and state of an extension in a separate class. It will probably get more information about the extension, like its location. The extension manager UI now can also iterate over that list once. Change-Id: I4872e55d621837a7d476e69b919f06aeb491ff03 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Diffstat (limited to 'plugins/pythonextensions/pythonextensionsplugin.cpp')
-rw-r--r--plugins/pythonextensions/pythonextensionsplugin.cpp76
1 files changed, 48 insertions, 28 deletions
diff --git a/plugins/pythonextensions/pythonextensionsplugin.cpp b/plugins/pythonextensions/pythonextensionsplugin.cpp
index 3136bbc..b3730b4 100644
--- a/plugins/pythonextensions/pythonextensionsplugin.cpp
+++ b/plugins/pythonextensions/pythonextensionsplugin.cpp
@@ -39,6 +39,8 @@
#include <extensionsystem/pluginmanager.h>
#include <extensionsystem/pluginspec.h>
+#include <utils/algorithm.h>
+
#include <QDir>
#include <QIODevice>
#include <QFile>
@@ -131,19 +133,32 @@ QDir PythonExtensionsPlugin::extensionDir()
return extension_dir;
}
-QStringList PythonExtensionsPlugin::extensionList(const bool loadedOnly)
+static QVector<Extension> getExtensionList(const QDir &directory)
{
- if (loadedOnly)
- return m_loadedExtensions;
+ if (!directory.exists())
+ return {};
+
+ QStringList entries = directory.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
+ entries.removeAll("site-packages");
+ entries.removeAll("__pycache__");
+ return Utils::transform<QVector>(entries, [](const QString &entry) {
+ return Extension({entry, false});
+ });
+}
- QDir extension_dir = extensionDir();
- if (!extension_dir.exists())
- return QStringList();
+QVector<Extension> PythonExtensionsPlugin::extensionList()
+{
+ return extensionListRef();
+}
- QStringList extension_list = extension_dir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
- extension_list.removeAll("site-packages");
- extension_list.removeAll("__pycache__");
- return extension_list;
+QVector<Extension> &PythonExtensionsPlugin::extensionListRef()
+{
+ static bool initialized = false;
+ if (!initialized) {
+ m_extensions = getExtensionList(extensionDir());
+ initialized = true;
+ }
+ return m_extensions;
}
QString PythonExtensionsPlugin::pythonPackagePath()
@@ -207,16 +222,18 @@ void PythonExtensionsPlugin::installRequirements()
if (!extension_dir.exists())
return;
- QStringList extension_list = extensionList();
- for (const QString &extension : extension_list) {
- QString extension_requirements(extension_dir.absolutePath() + "/" + extension + "/requirements.txt");
- if (QFileInfo::exists(extension_requirements) && !QFileInfo::exists(extension_requirements + ".installed")) {
- if (!PyUtil::pipInstallRequirements(
- extension_requirements.toStdString(),
- pythonPackagePath().toStdString()
- )) {
- qWarning() << "Failed to install requirements for extension" << extension;
- Core::MessageManager::write(Constants::MESSAGE_MANAGER_PREFIX + tr("Failed to install requirements for extension ") + extension);
+ QVector<Extension> extension_list = extensionListRef();
+ for (const Extension &extension : extension_list) {
+ QString extension_requirements(extension_dir.absolutePath() + "/" + extension.name
+ + "/requirements.txt");
+ if (QFileInfo::exists(extension_requirements)
+ && !QFileInfo::exists(extension_requirements + ".installed")) {
+ if (!PyUtil::pipInstallRequirements(extension_requirements.toStdString(),
+ pythonPackagePath().toStdString())) {
+ qWarning() << "Failed to install requirements for extension" << extension.name;
+ Core::MessageManager::write(Constants::MESSAGE_MANAGER_PREFIX
+ + tr("Failed to install requirements for extension ")
+ + extension.name);
}
}
}
@@ -234,22 +251,25 @@ void PythonExtensionsPlugin::initializePythonExtensions()
qDebug() << "Found Python extension directory at location" << extension_dir.absolutePath();
- QStringList extension_list = extensionList();
+ QVector<Extension> &extension_list = extensionListRef();
qDebug() << "Number of Python extensions found:" << extension_list.size();
+ int loadedCount = 0;
// Run the extension initialization code
- for (const QString &extension : extension_list) {
- qDebug() << "Trying to initialize extension" << extension;
- if (!PyUtil::runScript("import " + extension.toStdString())) {
- qWarning() << "Failed to initialize extension" << extension;
- Core::MessageManager::write(Constants::MESSAGE_MANAGER_PREFIX + tr("Failed to initialize extension ") + extension);
+ for (Extension &extension : extension_list) {
+ qDebug() << "Trying to initialize extension" << extension.name;
+ if (PyUtil::runScript("import " + extension.name.toStdString())) {
+ extension.loaded = true;
+ ++loadedCount;
} else {
- m_loadedExtensions << extension;
+ qWarning() << "Failed to initialize extension" << extension.name;
+ Core::MessageManager::write(Constants::MESSAGE_MANAGER_PREFIX
+ + tr("Failed to initialize extension ") + extension.name);
}
}
- qDebug() << "Number of Python extensions loaded:" << m_loadedExtensions.size();
+ qDebug() << "Number of Python extensions loaded:" << loadedCount;
}
} // namespace Internal