logic: Added migration for C/C++ standard to ProjectSettings

* extended SettingsMigrator to support lambdas
* added PROJECT_STATE_NEEDS_MIGRATION and dialog for loading old project files
This commit is contained in:
Eberhard Graether
2016-09-15 12:23:18 +02:00
parent 73ef7c1bcb
commit 5680bf7b25
12 changed files with 261 additions and 82 deletions
+47
View File
@@ -3,6 +3,9 @@
#include "settings/CxxProjectSettings.h"
#include "settings/JavaProjectSettings.h"
#include "utility/utility.h"
#include "utility/utilityString.h"
const size_t ProjectSettings::VERSION = 1;
LanguageType ProjectSettings::getLanguageOfProject(FilePath projectFilePath)
{
@@ -45,6 +48,22 @@ std::vector<std::string> ProjectSettings::getLanguageStandards() const
return std::vector<std::string>();
}
bool ProjectSettings::needMigration() const
{
return getMigrations().willMigrate(this, ProjectSettings::VERSION);
}
void ProjectSettings::migrate()
{
SettingsMigrator migrator = getMigrations();
bool migrated = migrator.migrate(this, ProjectSettings::VERSION);
if (migrated)
{
save();
}
}
bool ProjectSettings::reload()
{
return Settings::load(getFilePath());
@@ -163,3 +182,31 @@ std::string ProjectSettings::getDefaultStandard() const
return "";
}
SettingsMigrator ProjectSettings::getMigrations() const
{
SettingsMigrator migrator;
if (getLanguage() == LANGUAGE_C || getLanguage() == LANGUAGE_CPP)
{
migrator.addLambdaMigration(1,
[](Settings* settings)
{
ProjectSettings* s = dynamic_cast<ProjectSettings*>(settings);
if (s->getLanguage() == LANGUAGE_C && !utility::isPrefix("c", s->getStandard()))
{
s->setStandard("c" + s->getStandard());
}
if (s->getLanguage() == LANGUAGE_CPP && !utility::isPrefix("c++", s->getStandard()))
{
s->setStandard("c++" + s->getStandard());
}
}
);
}
return migrator;
}
+7
View File
@@ -13,6 +13,8 @@ class ProjectSettings
public:
static LanguageType getLanguageOfProject(FilePath projectFilePath);
static const size_t VERSION;
ProjectSettings();
ProjectSettings(const FilePath& projectFilePath);
ProjectSettings(std::string projectName, const FilePath& projectFileLocation);
@@ -22,6 +24,9 @@ public:
virtual std::vector<std::string> getLanguageStandards() const;
bool needMigration() const;
void migrate();
bool reload();
std::string getProjectName() const;
@@ -55,6 +60,8 @@ protected:
private:
virtual std::vector<std::string> getDefaultSourceExtensions() const;
virtual std::string getDefaultStandard() const;
SettingsMigrator getMigrations() const;
};
#endif // PROJECT_SETTINGS_H
+2 -19
View File
@@ -6,8 +6,8 @@
#include "utility/utilityString.h"
Settings::Settings(const Settings& other)
: m_filePath(other.m_filePath)
, m_config(other.m_config->createCopy())
: m_config(other.m_config->createCopy())
, m_filePath(other.m_filePath)
{
}
@@ -83,23 +83,6 @@ void Settings::setVersion(size_t version)
setValue<int>("version", version);
}
Settings Settings::createFromText(const std::shared_ptr<TextAccess> textAccess)
{
Settings settings;
settings.m_config = ConfigManager::createAndLoad(textAccess);
return settings;
}
std::string Settings::getAsText() const
{
if (m_config)
{
return m_config->toString();
}
return "";
}
Settings::Settings()
{
clear();
+2 -4
View File
@@ -28,9 +28,6 @@ public:
size_t getVersion() const;
void setVersion(size_t version);
static Settings createFromText(const std::shared_ptr<TextAccess> textAccess);
std::string getAsText() const;
protected:
Settings();
@@ -62,9 +59,10 @@ protected:
friend bool SettingsMigrator::migrate(Settings* settings, size_t targetVersion) const;
std::shared_ptr<ConfigManager> m_config;
private:
FilePath m_filePath;
std::shared_ptr<ConfigManager> m_config;
};
template<typename T>
+35 -1
View File
@@ -20,6 +20,36 @@ void SettingsMigrator::addMigration(size_t targetVersion, std::string oldKey, st
m_migrations.emplace(targetVersion, migration);
}
void SettingsMigrator::addLambdaMigration(size_t targetVersion, std::function<void(Settings*)> lambda)
{
Migration migration;
migration.targetVersion = targetVersion;
migration.lambda = lambda;
m_migrations.emplace(targetVersion, migration);
}
bool SettingsMigrator::willMigrate(const Settings* settings, size_t targetVersion) const
{
size_t originVersion = settings->getVersion();
if (originVersion < targetVersion)
{
for (; originVersion <= targetVersion; originVersion++)
{
std::pair<std::multimap<size_t, Migration>::const_iterator, std::multimap<size_t, Migration>::const_iterator> ret;
ret = m_migrations.equal_range(originVersion);
for (std::multimap<size_t, Migration>::const_iterator it = ret.first; it != ret.second; it++)
{
return true;
}
}
}
return false;
}
bool SettingsMigrator::migrate(Settings* settings, size_t targetVersion) const
{
size_t originVersion = settings->getVersion();
@@ -35,7 +65,11 @@ bool SettingsMigrator::migrate(Settings* settings, size_t targetVersion) const
{
const Migration& migration = it->second;
if (!settings->isValueDefined(migration.newKey))
if (!migration.oldKey.size())
{
migration.lambda(settings);
}
else if (!settings->isValueDefined(migration.newKey))
{
settings->setValues<std::string>(
migration.newKey,
+5
View File
@@ -1,6 +1,7 @@
#ifndef SETTNGS_MIGRATOR_H
#define SETTNGS_MIGRATOR_H
#include <functional>
#include <map>
#include <string>
@@ -15,7 +16,9 @@ public:
virtual ~SettingsMigrator();
void addMigration(size_t targetVersion, std::string oldKey, std::string newKey);
void addLambdaMigration(size_t targetVersion, std::function<void(Settings*)> lambda);
bool willMigrate(const Settings* settings, size_t targetVersion) const;
bool migrate(Settings* settings, size_t targetVersion) const;
private:
@@ -24,6 +27,8 @@ private:
size_t targetVersion;
std::string oldKey;
std::string newKey;
std::function<void(Settings*)> lambda;
};
std::multimap<size_t, Migration> m_migrations;