diff --git a/src/app/main.cpp b/src/app/main.cpp index ad61ab0c750..eedc9e13653 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -69,7 +69,7 @@ static const char *HELP_OPTION4 = "--help"; static const char *VERSION_OPTION = "-version"; static const char *CLIENT_OPTION = "-client"; -typedef QSet PluginSpecSet; +typedef QList PluginSpecSet; // Helpers for displaying messages. Note that there is no console on Windows. #ifdef Q_WS_WIN diff --git a/src/libs/extensionsystem/optionsparser.cpp b/src/libs/extensionsystem/optionsparser.cpp index 8884cb378ce..09dbaa59b72 100644 --- a/src/libs/extensionsystem/optionsparser.cpp +++ b/src/libs/extensionsystem/optionsparser.cpp @@ -129,7 +129,7 @@ bool OptionsParser::checkForNoLoadOption() "The plugin '%1' does not exist.").arg(m_currentArg); m_hasError = true; } else { - m_pmPrivate->pluginSpecs.remove(spec); + m_pmPrivate->pluginSpecs.removeAll(spec); delete spec; m_isDependencyRefreshNeeded = true; } diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index 3f7ba386e4e..90e6e4bb004 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -48,7 +48,7 @@ #include #endif -typedef QSet PluginSpecSet; +typedef QList PluginSpecSet; enum { debugLeaks = 0 }; @@ -162,6 +162,11 @@ enum { debugLeaks = 0 }; using namespace ExtensionSystem; using namespace ExtensionSystem::Internal; +static bool lessThanByPluginName(const PluginSpec *one, const PluginSpec *two) +{ + return one->name() < two->name(); +} + PluginManager *PluginManager::m_instance = 0; /*! @@ -306,7 +311,7 @@ QStringList PluginManager::arguments() const } /*! - \fn QSet PluginManager::plugins() const + \fn QList PluginManager::plugins() const List of all plugin specifications that have been found in the plugin search paths. This list is valid directly after the setPluginPaths() call. The plugin specifications contain the information from the plugins' xml description files @@ -315,7 +320,7 @@ QStringList PluginManager::arguments() const \sa setPluginPaths() */ -QSet PluginManager::plugins() const +QList PluginManager::plugins() const { return d->pluginSpecs; } @@ -703,9 +708,11 @@ void PluginManagerPrivate::readPluginPaths() foreach (const QString &specFile, specFiles) { PluginSpec *spec = new PluginSpec; spec->d->read(specFile); - pluginSpecs.insert(spec); + pluginSpecs.append(spec); } resolveDependencies(); + // ensure deterministic plugin load order by sorting + qSort(pluginSpecs.begin(), pluginSpecs.end(), lessThanByPluginName); emit q->pluginsChanged(); } diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h index e46451901e9..e621fbea17f 100644 --- a/src/libs/extensionsystem/pluginmanager.h +++ b/src/libs/extensionsystem/pluginmanager.h @@ -101,7 +101,7 @@ public: void loadPlugins(); QStringList pluginPaths() const; void setPluginPaths(const QStringList &paths); - QSet plugins() const; + QList plugins() const; void setFileExtension(const QString &extension); QString fileExtension() const; diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h index 74cb84c8678..b286fdf2b1d 100644 --- a/src/libs/extensionsystem/pluginmanager_p.h +++ b/src/libs/extensionsystem/pluginmanager_p.h @@ -66,7 +66,7 @@ public: void loadPlugin(PluginSpec *spec, PluginSpec::State destState); void resolveDependencies(); - QSet pluginSpecs; + QList pluginSpecs; QList testSpecs; QStringList pluginPaths; QString extension; diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp index 170cd72ba0b..a8694e29677 100644 --- a/src/libs/extensionsystem/pluginspec.cpp +++ b/src/libs/extensionsystem/pluginspec.cpp @@ -693,10 +693,10 @@ int PluginSpecPrivate::versionCompare(const QString &version1, const QString &ve } /*! - \fn bool PluginSpecPrivate::resolveDependencies(const QSet &specs) + \fn bool PluginSpecPrivate::resolveDependencies(const QList &specs) \internal */ -bool PluginSpecPrivate::resolveDependencies(const QSet &specs) +bool PluginSpecPrivate::resolveDependencies(const QList &specs) { if (hasError) return false; diff --git a/src/libs/extensionsystem/pluginspec_p.h b/src/libs/extensionsystem/pluginspec_p.h index 922fe36d05d..b4fefc59b32 100644 --- a/src/libs/extensionsystem/pluginspec_p.h +++ b/src/libs/extensionsystem/pluginspec_p.h @@ -56,7 +56,7 @@ public: bool read(const QString &fileName); bool provides(const QString &pluginName, const QString &version) const; - bool resolveDependencies(const QSet &specs); + bool resolveDependencies(const QList &specs); bool loadLibrary(); bool initializePlugin(); bool initializeExtensions();