diff options
-rw-r--r-- | datasources/buildsystemsource.cpp | 37 | ||||
-rw-r--r-- | datasources/buildsystemsource.h | 2 |
2 files changed, 33 insertions, 6 deletions
diff --git a/datasources/buildsystemsource.cpp b/datasources/buildsystemsource.cpp index 26433c0..95c22a2 100644 --- a/datasources/buildsystemsource.cpp +++ b/datasources/buildsystemsource.cpp @@ -25,6 +25,7 @@ #include "buildsystemsource.h" #include <QtCore/QSettings> +#include <QtCore/QCryptographicHash> #include <projectexplorer/project.h> #include <projectexplorer/session.h> @@ -96,21 +97,42 @@ QVariant BuildSystemSource::data() return result; } +static QSet<QByteArray> fromVariantList(const QVariantList &vl) +{ + QSet<QByteArray> result; + for (auto &&v : vl) { + result << v.toByteArray(); + } + + return result; +} + void BuildSystemSource::loadImpl(QSettings *settings) { auto setter = ScopedSettingsGroupSetter::forDataSource(*this, *settings); for (int i = QMake; i < Count; ++i) { m_projectsByBuildSystem[size_t(i)] = - settings->value(buildSystemKeys()[i]).toStringList().toSet(); + fromVariantList(settings->value(buildSystemKeys()[i]).toList()); } } +static QVariantList toVariantList(const QSet<QByteArray> &set) +{ + QVariantList result; + result.reserve(set.size()); + + std::transform(set.begin(), set.end(), std::back_inserter(result), + [](const QByteArray &ba) { return QVariant::fromValue(ba); }); + + return result; +} + void BuildSystemSource::storeImpl(QSettings *settings) { auto setter = ScopedSettingsGroupSetter::forDataSource(*this, *settings); for (int i = QMake; i < Count; ++i) { settings->setValue( - buildSystemKeys()[i], QStringList(m_projectsByBuildSystem[size_t(i)].toList())); + buildSystemKeys()[i], toVariantList(m_projectsByBuildSystem[size_t(i)])); } } @@ -120,13 +142,18 @@ void BuildSystemSource::resetImpl(QSettings *settings) storeImpl(settings); } +static QByteArray hashPath(const Utils::FilePath& name) +{ + return QCryptographicHash::hash(name.toString().toUtf8(), QCryptographicHash::Md5); +} + void BuildSystemSource::updateProjects() { for (auto project : ProjectExplorer::SessionManager::projects()) { if (project) { - auto projectName = QString::fromUtf8(project->id().name()).toLower(); - auto projectPath = project->projectFilePath().toString(); - m_projectsByBuildSystem[extractBuildSystemType(projectName)] << projectPath; + const auto projectName = QString::fromUtf8(project->id().name()).toLower(); + const auto projectPath = project->projectFilePath(); + m_projectsByBuildSystem[extractBuildSystemType(projectName)] << hashPath(projectPath); } } } diff --git a/datasources/buildsystemsource.h b/datasources/buildsystemsource.h index d390c37..a6ab03c 100644 --- a/datasources/buildsystemsource.h +++ b/datasources/buildsystemsource.h @@ -73,7 +73,7 @@ private: // Element is a set of full project paths. Full project path is used // as a permanent unique identifier. This identifier is only for // storing locally on user machine and should never be sent! - using ProjectsByBuildSystem = std::array<QSet<QString>, Count>; + using ProjectsByBuildSystem = std::array<QSet<QByteArray>, Count>; ProjectsByBuildSystem m_projectsByBuildSystem; }; |