SettingsAccessor: Keep version information in map up to date

Introduce a original version to indicate which version the map was
upgraded from.

THIS CHANGE REMOVES SUPPORT FOR .USER FILES WITHOUT VERSION INFORMATION!

Those files were written before Qt Creator version 1.3.

Change-Id: I2c7264cf84c458b139a9073fc415c257dfbd0498
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
Tobias Hunger
2014-02-27 14:15:03 +01:00
parent 6822c47c01
commit d66685da99
2 changed files with 68 additions and 492 deletions

View File

@@ -50,6 +50,10 @@
using namespace Utils; using namespace Utils;
const char ENVIRONMENT_ID_KEY[] = "ProjectExplorer.Project.Updater.EnvironmentId";
const char VERSION_KEY[] = "ProjectExplorer.Project.Updater.FileVersion";
const char ORIGINAL_VERSION_KEY[] = "OriginalVersion";
namespace { namespace {
static QString generateSuffix(const QString &alt1, const QString &alt2) static QString generateSuffix(const QString &alt1, const QString &alt2)
{ {
@@ -122,25 +126,6 @@ namespace {
const char USER_STICKY_KEYS_KEY[] = "ProjectExplorer.Project.UserStickyKeys"; const char USER_STICKY_KEYS_KEY[] = "ProjectExplorer.Project.UserStickyKeys";
const char SHARED_SETTINGS[] = "SharedSettings"; const char SHARED_SETTINGS[] = "SharedSettings";
// Version 0 is used in Qt Creator 1.3.x and
// (in a slighly different flavour) post 1.3 master.
class UserFileVersion0Upgrader : public VersionUpgrader
{
public:
UserFileVersion0Upgrader(UserFileAccessor *a) : m_accessor(a) { }
int version() const { return 0; }
QString backupExtension() const { return QLatin1String("1.3"); }
QVariantMap upgrade(const QVariantMap &map);
private:
QVariantMap convertBuildConfigurations(const QVariantMap &map) const;
QVariantMap convertRunConfigurations(const QVariantMap &map) const;
QVariantMap convertBuildSteps(const QVariantMap &map) const;
UserFileAccessor *m_accessor;
};
// Version 1 is used in master post Qt Creator 1.3.x. // Version 1 is used in master post Qt Creator 1.3.x.
// It was never used in any official release but is required for the // It was never used in any official release but is required for the
// transition to later versions (which introduce support for targets). // transition to later versions (which introduce support for targets).
@@ -394,7 +379,6 @@ UserFileAccessor::UserFileAccessor(Project *project)
: SettingsAccessor(project) : SettingsAccessor(project)
{ {
// Register Upgraders: // Register Upgraders:
addVersionUpgrader(new UserFileVersion0Upgrader(this));
addVersionUpgrader(new UserFileVersion1Upgrader(this)); addVersionUpgrader(new UserFileVersion1Upgrader(this));
addVersionUpgrader(new UserFileVersion2Upgrader); addVersionUpgrader(new UserFileVersion2Upgrader);
addVersionUpgrader(new UserFileVersion3Upgrader); addVersionUpgrader(new UserFileVersion3Upgrader);
@@ -467,6 +451,8 @@ public:
for (; it != eit; ++it) { for (; it != eit; ++it) {
const QString &key = it.key(); const QString &key = it.key();
if (key == QLatin1String(VERSION_KEY))
continue;
const QVariant &sharedValue = it.value(); const QVariant &sharedValue = it.value();
const QVariant &userValue = userMap.value(key); const QVariant &userValue = userMap.value(key);
if (sharedValue.type() == QVariant::Map) { if (sharedValue.type() == QVariant::Map) {
@@ -520,23 +506,51 @@ private:
} // namespace } // namespace
int SettingsAccessor::versionFromMap(const QVariantMap &data)
{
return data.value(QLatin1String(VERSION_KEY), -1).toInt();
}
int SettingsAccessor::originalVersionFromMap(const QVariantMap &data)
{
return data.value(QLatin1String(ORIGINAL_VERSION_KEY), versionFromMap(data)).toInt();
}
QVariantMap SettingsAccessor::setOriginalVersionInMap(const QVariantMap &data, int version)
{
QVariantMap result = data;
result.insert(QLatin1String(ORIGINAL_VERSION_KEY), version);
return result;
}
QVariantMap SettingsAccessor::setVersionInMap(const QVariantMap &data, int version)
{
QVariantMap result = data;
result.insert(QLatin1String(VERSION_KEY), version);
return result;
}
/** /**
* @brief Upgrade the settings to a target version * @brief Upgrade the settings to a target version
*/ */
void SettingsAccessor::upgradeSettings(SettingsData &data, int toVersion) const void SettingsAccessor::upgradeSettings(SettingsData &data, int toVersion) const
{ {
const int version = versionFromMap(data.m_map);
if (data.m_map.isEmpty()) if (data.m_map.isEmpty())
return; return;
if (data.version() >= toVersion if (!data.m_map.contains(QLatin1String(ORIGINAL_VERSION_KEY)))
|| data.version() < m_firstVersion data.m_map = setOriginalVersionInMap(data.m_map, version);
if (version >= toVersion
|| version < m_firstVersion
|| toVersion > currentVersion()) || toVersion > currentVersion())
return; return;
for (int i = data.version(); i < toVersion; ++i) { for (int i = version; i < toVersion; ++i) {
VersionUpgrader *upgrader = d->m_upgraders.value(data.version()); VersionUpgrader *upgrader = d->m_upgraders.value(i);
data.m_map = upgrader->upgrade(data.m_map); data.m_map = upgrader->upgrade(data.m_map);
data.m_version++; data.m_map = setVersionInMap(data.m_map, i + 1);
} }
return; return;
@@ -568,6 +582,10 @@ QVariantMap mergeSharedSettings(const QVariantMap &userMap, const QVariantMap &s
stickyKeys.insert(v.toString()); stickyKeys.insert(v.toString());
} }
// Do not override bookkeeping settings:
stickyKeys.insert(QLatin1String(ORIGINAL_VERSION_KEY));
stickyKeys.insert(QLatin1String(VERSION_KEY));
MergeSettingsOperation op(stickyKeys); MergeSettingsOperation op(stickyKeys);
op.synchronize(result, sharedMap); op.synchronize(result, sharedMap);
return result; return result;
@@ -704,11 +722,12 @@ void SettingsAccessor::backupUserFile() const
QString backupName = origName; QString backupName = origName;
if (!oldSettings.environmentId().isEmpty() && oldSettings.environmentId() != creatorId()) if (!oldSettings.environmentId().isEmpty() && oldSettings.environmentId() != creatorId())
backupName += QLatin1String(".") + QString::fromLatin1(oldSettings.environmentId()).mid(1, 7); backupName += QLatin1String(".") + QString::fromLatin1(oldSettings.environmentId()).mid(1, 7);
if (oldSettings.version() != currentVersion()) { const int oldVersion = versionFromMap(oldSettings.m_map);
if (d->m_upgraders.contains(oldSettings.version())) if (oldVersion != currentVersion()) {
backupName += QLatin1String(".") + d->m_upgraders.value(oldSettings.version())->backupExtension(); if (d->m_upgraders.contains(oldVersion))
backupName += QLatin1String(".") + d->m_upgraders.value(oldVersion)->backupExtension();
else else
backupName += QLatin1String(".") + QString::number(oldSettings.version()); backupName += QLatin1String(".") + QString::number(oldVersion);
} }
if (backupName != origName) if (backupName != origName)
QFile::copy(origName, backupName); QFile::copy(origName, backupName);
@@ -756,7 +775,7 @@ SettingsAccessor::SettingsData SettingsAccessor::readUserSettings(QWidget *paren
if (msgBox.exec() == QMessageBox::No) if (msgBox.exec() == QMessageBox::No)
result.clear(); result.clear();
} else if ((result.fileName().toString() != defaultFileName(m_userSuffix)) } else if ((result.fileName().toString() != defaultFileName(m_userSuffix))
&& (result.version() < currentVersion())) { && (versionFromMap(result.m_map) < currentVersion())) {
QMessageBox::information( QMessageBox::information(
parent, parent,
QApplication::translate("ProjectExplorer::SettingsAccessor", QApplication::translate("ProjectExplorer::SettingsAccessor",
@@ -785,7 +804,7 @@ SettingsAccessor::SettingsData SettingsAccessor::readSharedSettings(QWidget *par
if (!readFile(&sharedSettings, false)) if (!readFile(&sharedSettings, false))
return sharedSettings; return sharedSettings;
if (sharedSettings.m_version > currentVersion()) { if (versionFromMap(sharedSettings.m_map) > currentVersion()) {
// The shared file version is newer than Creator... If we have valid user // The shared file version is newer than Creator... If we have valid user
// settings we prompt the user whether we could try an *unsupported* update. // settings we prompt the user whether we could try an *unsupported* update.
// This makes sense since the merging operation will only replace shared settings // This makes sense since the merging operation will only replace shared settings
@@ -807,7 +826,7 @@ SettingsAccessor::SettingsData SettingsAccessor::readSharedSettings(QWidget *par
if (msgBox.exec() == QMessageBox::No) if (msgBox.exec() == QMessageBox::No)
sharedSettings.clear(); sharedSettings.clear();
else else
sharedSettings.m_version = currentVersion(); sharedSettings.m_map = setVersionInMap(sharedSettings.m_map, currentVersion());
} }
return sharedSettings; return sharedSettings;
} }
@@ -824,23 +843,25 @@ SettingsAccessor::SettingsData SettingsAccessor::findBestSettings(const QStringL
if (!readFile(&tmp, true)) if (!readFile(&tmp, true))
continue; continue;
if (tmp.version() > currentVersion()) { const int tmpVersion = versionFromMap(tmp.m_map);
if (tmpVersion > currentVersion()) {
qWarning() << "Skipping settings file" << tmp.fileName().toUserOutput() << "(too new)."; qWarning() << "Skipping settings file" << tmp.fileName().toUserOutput() << "(too new).";
continue; continue;
} }
if (tmp.version() < m_firstVersion) { if (tmpVersion < m_firstVersion) {
qWarning() << "Skipping settings file" << tmp.fileName().toUserOutput() << "(too old)."; qWarning() << "Skipping settings file" << tmp.fileName().toUserOutput() << "(too old).";
continue; continue;
} }
if (tmp.environmentId().isEmpty() || tmp.environmentId() == creatorId()) { if (tmp.environmentId().isEmpty() || tmp.environmentId() == creatorId()) {
if (tmp.version() > newestMatching.version()) if (tmpVersion > versionFromMap(newestMatching.m_map))
newestMatching = tmp; newestMatching = tmp;
} else { } else {
if (tmp.version() > newestNonMatching.version()) if (tmpVersion > versionFromMap(newestNonMatching.m_map))
newestNonMatching = tmp; newestNonMatching = tmp;
} }
if (newestMatching.version() == m_lastVersion + 1) if (versionFromMap(newestMatching.m_map) == m_lastVersion + 1)
break; break;
} }
@@ -860,8 +881,8 @@ SettingsAccessor::SettingsData SettingsAccessor::mergeSettings(const SettingsAcc
SettingsData newShared = shared; SettingsData newShared = shared;
SettingsData result; SettingsData result;
if (shared.isValid() && user.isValid()) { if (shared.isValid() && user.isValid()) {
upgradeSettings(newUser, newShared.version()); upgradeSettings(newUser, versionFromMap(newShared.m_map));
upgradeSettings(newShared, newUser.version()); upgradeSettings(newShared, versionFromMap(newUser.m_map));
result = newUser; result = newUser;
result.m_map = mergeSharedSettings(newUser.m_map, newShared.m_map); result.m_map = mergeSharedSettings(newUser.m_map, newShared.m_map);
} else if (shared.isValid()) { } else if (shared.isValid()) {
@@ -886,7 +907,6 @@ SettingsAccessor::SettingsData SettingsAccessor::mergeSettings(const SettingsAcc
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void SettingsAccessor::SettingsData::clear() void SettingsAccessor::SettingsData::clear()
{ {
m_version = -1;
m_map.clear(); m_map.clear();
m_fileName.clear(); m_fileName.clear();
m_environmentId.clear(); m_environmentId.clear();
@@ -894,12 +914,9 @@ void SettingsAccessor::SettingsData::clear()
bool SettingsAccessor::SettingsData::isValid() const bool SettingsAccessor::SettingsData::isValid() const
{ {
return m_version > -1 && !m_fileName.isEmpty(); return versionFromMap(m_map) > -1 && !m_fileName.isEmpty();
} }
static const char VERSION_KEY[] = "ProjectExplorer.Project.Updater.FileVersion";
static const char ENVIRONMENT_ID_KEY[] = "ProjectExplorer.Project.Updater.EnvironmentId";
bool SettingsAccessor::readFile(SettingsData *settings, bool environmentSpecific) const bool SettingsAccessor::readFile(SettingsData *settings, bool environmentSpecific) const
{ {
if (settings->fileName().isEmpty()) { if (settings->fileName().isEmpty()) {
@@ -921,8 +938,6 @@ bool SettingsAccessor::readFile(SettingsData *settings, bool environmentSpecific
settings->m_map.remove(QLatin1String(ENVIRONMENT_ID_KEY)); settings->m_map.remove(QLatin1String(ENVIRONMENT_ID_KEY));
} }
// Get and verify file version
settings->m_version = settings->m_map.value(QLatin1String(VERSION_KEY), 0).toInt();
return true; return true;
} }
@@ -946,448 +961,6 @@ bool SettingsAccessor::writeFile(const SettingsData *settings, QWidget *parent)
return d->m_writer->save(data, parent); return d->m_writer->save(data, parent);
} }
// -------------------------------------------------------------------------
// UserFileVersion0Upgrader:
// -------------------------------------------------------------------------
QVariantMap UserFileVersion0Upgrader::convertBuildConfigurations(const QVariantMap &map) const
{
QVariantMap result;
// Find a valid Id to use:
QString id;
Project *project = m_accessor->project();
if (project->id() == "GenericProjectManager.GenericProject") {
id = QLatin1String("GenericProjectManager.GenericBuildConfiguration");
} else if (project->id() == "CMakeProjectManager.CMakeProject") {
id = QLatin1String("CMakeProjectManager.CMakeBuildConfiguration");
} else if (project->id() == "Qt4ProjectManager.Qt4Project") {
result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.NeedsV0Update"), QVariant());
id = QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration");
} else {
return QVariantMap(); // QmlProjects do not(/no longer) have BuildConfigurations,
// or we do not know how to handle this.
}
result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), id);
for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i) {
if (i.key() == QLatin1String("ProjectExplorer.BuildConfiguration.DisplayName")) {
result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName"),
i.value());
continue;
}
if (id == QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration") ||
id.startsWith(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration."))) {
// QmakeBuildConfiguration:
if (i.key() == QLatin1String("QtVersionId")) {
result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId"),
i.value().toInt());
} else if (i.key() == QLatin1String("ToolChain")) {
result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.ToolChain"),
i.value());
} else if (i.key() == QLatin1String("buildConfiguration")) {
result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration"),
i.value());
} else if (i.key() == QLatin1String("userEnvironmentChanges")) {
result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.UserEnvironmentChanges"),
i.value());
} else if (i.key() == QLatin1String("useShadowBuild")) {
result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild"),
i.value());
} else if (i.key() == QLatin1String("clearSystemEnvironment")) {
result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.ClearSystemEnvironment"),
i.value());
} else if (i.key() == QLatin1String("buildDirectory")) {
result.insert(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory"),
i.value());
} else {
qWarning() << "Unknown QmakeBuildConfiguration Key found:" << i.key() << i.value();
}
continue;
} else if (id == QLatin1String("CMakeProjectManager.CMakeBuildConfiguration")) {
if (i.key() == QLatin1String("userEnvironmentChanges")) {
result.insert(QLatin1String("CMakeProjectManager.CMakeBuildConfiguration.UserEnvironmentChanges"),
i.value());
} else if (i.key() == QLatin1String("msvcVersion")) {
result.insert(QLatin1String("CMakeProjectManager.CMakeBuildConfiguration.MsvcVersion"),
i.value());
} else if (i.key() == QLatin1String("buildDirectory")) {
result.insert(QLatin1String("CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory"),
i.value());
} else {
qWarning() << "Unknown CMakeBuildConfiguration Key found:" << i.key() << i.value();
}
continue;
} else if (id == QLatin1String("GenericProjectManager.GenericBuildConfiguration")) {
if (i.key() == QLatin1String("buildDirectory")) {
result.insert(QLatin1String("GenericProjectManager.GenericBuildConfiguration.BuildDirectory"),
i.value());
} else {
qWarning() << "Unknown GenericBuildConfiguration Key found:" << i.key() << i.value();
}
continue;
}
qWarning() << "Unknown BuildConfiguration Key found:" << i.key() << i.value();
qWarning() << "BuildConfiguration Id is:" << id;
}
return result;
}
QVariantMap UserFileVersion0Upgrader::convertRunConfigurations(const QVariantMap &map) const
{
QVariantMap result;
QString id;
// Convert Id:
id = map.value(QLatin1String("Id")).toString();
if (id.isEmpty())
id = map.value(QLatin1String("type")).toString();
if (id.isEmpty())
return QVariantMap();
if (QLatin1String("Qt4ProjectManager.DeviceRunConfiguration") == id)
id = QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration");
if (QLatin1String("Qt4ProjectManager.EmulatorRunConfiguration") == id)
id = QLatin1String("Qt4ProjectManager.S60EmulatorRunConfiguration");
// no need to change the CMakeRunConfiguration, CustomExecutableRunConfiguration,
// MaemoRunConfiguration or Qt4RunConfiguration
result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), id);
// Convert everything else:
for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i) {
if (i.key() == QLatin1String("Id") || i.key() == QLatin1String("type"))
continue;
if (i.key() == QLatin1String("RunConfiguration.name")) {
result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName"),
i.value());
} else if (QLatin1String("CMakeProjectManager.CMakeRunConfiguration") == id) {
if (i.key() == QLatin1String("CMakeRunConfiguration.Target"))
result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.Target"), i.value());
else if (i.key() == QLatin1String("CMakeRunConfiguration.WorkingDirectory"))
result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.WorkingDirectory"), i.value());
else if (i.key() == QLatin1String("CMakeRunConfiguration.UserWorkingDirectory"))
result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"), i.value());
else if (i.key() == QLatin1String("CMakeRunConfiguration.UseTerminal"))
result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.UseTerminal"), i.value());
else if (i.key() == QLatin1String("CMakeRunConfiguation.Title"))
result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguation.Title"), i.value());
else if (i.key() == QLatin1String("CMakeRunConfiguration.Arguments"))
result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.Arguments"), i.value());
else if (i.key() == QLatin1String("CMakeRunConfiguration.UserEnvironmentChanges"))
result.insert(QLatin1String("CMakeProjectManager.CMakeRunConfiguration.UserEnvironmentChanges"), i.value());
else if (i.key() == QLatin1String("BaseEnvironmentBase"))
result.insert(QLatin1String("CMakeProjectManager.BaseEnvironmentBase"), i.value());
else
qWarning() << "Unknown CMakeRunConfiguration key found:" << i.key() << i.value();
} else if (QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration") == id) {
if (i.key() == QLatin1String("ProFile"))
result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.ProFile"), i.value());
else if (i.key() == QLatin1String("SigningMode"))
result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.SigningMode"), i.value());
else if (i.key() == QLatin1String("CustomSignaturePath"))
result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.CustomSignaturePath"), i.value());
else if (i.key() == QLatin1String("CustomKeyPath"))
result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.CustomKeyPath"), i.value());
else if (i.key() == QLatin1String("SerialPortName"))
result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.SerialPortName"), i.value());
else if (i.key() == QLatin1String("CommunicationType"))
result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.CommunicationType"), i.value());
else if (i.key() == QLatin1String("CommandLineArguments"))
result.insert(QLatin1String("Qt4ProjectManager.S60DeviceRunConfiguration.CommandLineArguments"), i.value());
else
qWarning() << "Unknown S60DeviceRunConfiguration key found:" << i.key() << i.value();
} else if (QLatin1String("Qt4ProjectManager.S60EmulatorRunConfiguration") == id) {
if (i.key() == QLatin1String("ProFile"))
result.insert(QLatin1String("Qt4ProjectManager.S60EmulatorRunConfiguration.ProFile"), i.value());
else
qWarning() << "Unknown S60EmulatorRunConfiguration key found:" << i.key() << i.value();
} else if (QLatin1String("Qt4ProjectManager.Qt4RunConfiguration") == id) {
if (i.key() == QLatin1String("ProFile"))
result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.ProFile"), i.value());
else if (i.key() == QLatin1String("CommandLineArguments"))
result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"), i.value());
else if (i.key() == QLatin1String("UserSetName"))
result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UserSetName"), i.value());
else if (i.key() == QLatin1String("UseTerminal"))
result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UseTerminal"), i.value());
else if (i.key() == QLatin1String("UseDyldImageSuffix"))
result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix"), i.value());
else if (i.key() == QLatin1String("UserEnvironmentChanges"))
result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UserEnvironmentChanges"), i.value());
else if (i.key() == QLatin1String("BaseEnvironmentBase"))
result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase"), i.value());
else if (i.key() == QLatin1String("UserSetWorkingDirectory"))
result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UserSetWorkingDirectory"), i.value());
else if (i.key() == QLatin1String("UserWorkingDirectory"))
result.insert(QLatin1String("Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"), i.value());
else
qWarning() << "Unknown Qt4RunConfiguration key found:" << i.key() << i.value();
} else if (QLatin1String("Qt4ProjectManager.MaemoRunConfiguration") == id) {
if (i.key() == QLatin1String("ProFile"))
result.insert(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.ProFile"), i.value());
else if (i.key() == QLatin1String("Arguments"))
result.insert(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.Arguments"), i.value());
else if (i.key() == QLatin1String("Simulator"))
result.insert(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.Simulator"), i.value());
else if (i.key() == QLatin1String("DeviceId"))
result.insert(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.DeviceId"), i.value());
else if (i.key() == QLatin1String("LastDeployed"))
result.insert(QLatin1String("Qt4ProjectManager.MaemoRunConfiguration.LastDeployed"), i.value());
else
qWarning() << "Unknown MaemoRunConfiguration key found:" << i.key() << i.value();
} else if (QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration") == id) {
if (i.key() == QLatin1String("Executable"))
result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.Executable"), i.value());
else if (i.key() == QLatin1String("Arguments"))
result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.Arguments"), i.value());
else if (i.key() == QLatin1String("WorkingDirectory"))
result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory"), i.value());
else if (i.key() == QLatin1String("UseTerminal"))
result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal"), i.value());
else if (i.key() == QLatin1String("UserSetName"))
result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.UserSetName"), i.value());
else if (i.key() == QLatin1String("UserName"))
result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.UserName"), i.value());
else if (i.key() == QLatin1String("UserEnvironmentChanges"))
result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.UserEnvironmentChanges"), i.value());
else if (i.key() == QLatin1String("BaseEnvironmentBase"))
result.insert(QLatin1String("ProjectExplorer.CustomExecutableRunConfiguration.BaseEnvironmentBase"), i.value());
else
qWarning() << "Unknown CustomExecutableRunConfiguration key found:" << i.key() << i.value();
} else {
result.insert(i.key(), i.value());
}
}
return result;
}
QVariantMap UserFileVersion0Upgrader::convertBuildSteps(const QVariantMap &map) const
{
QVariantMap result;
QString id(map.value(QLatin1String("Id")).toString());
if (QLatin1String("GenericProjectManager.MakeStep") == id)
id = QLatin1String("GenericProjectManager.GenericMakeStep");
if (QLatin1String("projectexplorer.processstep") == id)
id = QLatin1String("ProjectExplorer.ProcessStep");
if (QLatin1String("trolltech.qt4projectmanager.make") == id)
id = QLatin1String("Qt4ProjectManager.MakeStep");
if (QLatin1String("trolltech.qt4projectmanager.qmake") == id)
id = QLatin1String("QtProjectManager.QMakeBuildStep");
// No need to change the CMake MakeStep.
result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), id);
for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i) {
if (i.key() == QLatin1String("Id"))
continue;
if (i.key() == QLatin1String("ProjectExplorer.BuildConfiguration.DisplayName")) {
// skip this: Not needed.
continue;
}
if (QLatin1String("GenericProjectManager.GenericMakeStep") == id) {
if (i.key() == QLatin1String("buildTargets"))
result.insert(QLatin1String("GenericProjectManager.GenericMakeStep.BuildTargets"), i.value());
else if (i.key() == QLatin1String("makeArguments"))
result.insert(QLatin1String("GenericProjectManager.GenericMakeStep.MakeArguments"), i.value());
else if (i.key() == QLatin1String("makeCommand"))
result.insert(QLatin1String("GenericProjectManager.GenericMakeStep.MakeCommand"), i.value());
else
qWarning() << "Unknown GenericMakeStep value found:" << i.key() << i.value();
continue;
} else if (QLatin1String("ProjectExplorer.ProcessStep") == id) {
if (i.key() == QLatin1String("ProjectExplorer.ProcessStep.DisplayName"))
result.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName"), i.value());
else if (i.key() == QLatin1String("abstractProcess.command"))
result.insert(QLatin1String("ProjectExplorer.ProcessStep.Command"), i.value());
else if ((i.key() == QLatin1String("abstractProcess.workingDirectory") ||
i.key() == QLatin1String("workingDirectory")) &&
!i.value().toString().isEmpty())
result.insert(QLatin1String("ProjectExplorer.ProcessStep.WorkingDirectory"), i.value());
else if (i.key() == QLatin1String("abstractProcess.arguments"))
result.insert(QLatin1String("ProjectExplorer.ProcessStep.Arguments"), i.value());
else if (i.key() == QLatin1String("abstractProcess.enabled"))
result.insert(QLatin1String("ProjectExplorer.ProcessStep.Enabled"), i.value());
else
qWarning() << "Unknown ProcessStep value found:" << i.key() << i.value();
} else if (QLatin1String("Qt4ProjectManager.MakeStep") == id) {
if (i.key() == QLatin1String("makeargs"))
result.insert(QLatin1String("Qt4ProjectManager.MakeStep.MakeArguments"), i.value());
else if (i.key() == QLatin1String("makeCmd"))
result.insert(QLatin1String("Qt4ProjectManager.MakeStep.MakeCommand"), i.value());
else if (i.key() == QLatin1String("clean"))
result.insert(QLatin1String("Qt4ProjectManager.MakeStep.Clean"), i.value());
else
qWarning() << "Unknown Qt4MakeStep value found:" << i.key() << i.value();
} else if (QLatin1String("QtProjectManager.QMakeBuildStep") == id) {
if (i.key() == QLatin1String("qmakeArgs"))
result.insert(QLatin1String("QtProjectManager.QMakeBuildStep.QMakeArguments"), i.value());
else
qWarning() << "Unknown Qt4QMakeStep value found:" << i.key() << i.value();
} else if (QLatin1String("CMakeProjectManager.MakeStep") == id) {
if (i.key() == QLatin1String("buildTargets"))
result.insert(QLatin1String("CMakeProjectManager.MakeStep.BuildTargets"), i.value());
else if (i.key() == QLatin1String("additionalArguments"))
result.insert(QLatin1String("CMakeProjectManager.MakeStep.AdditionalArguments"), i.value());
else if (i.key() == QLatin1String("clean"))
result.insert(QLatin1String("CMakeProjectManager.MakeStep.Clean"), i.value());
else
qWarning() << "Unknown CMakeMakeStep value found:" << i.key() << i.value();
} else {
result.insert(i.key(), i.value());
}
}
return result;
}
QVariantMap UserFileVersion0Upgrader::upgrade(const QVariantMap &map)
{
QVariantMap result;
// "project": section is unused, just ignore it.
// "buildconfigurations" and "buildConfiguration-":
QStringList bcs(map.value(QLatin1String("buildconfigurations")).toStringList());
QString active(map.value(QLatin1String("activebuildconfiguration")).toString());
int count(0);
foreach (const QString &bc, bcs) {
// convert buildconfiguration:
QString oldBcKey(QString::fromLatin1("buildConfiguration-") + bc);
if (bc == active)
result.insert(QLatin1String("ProjectExplorer.Project.ActiveBuildConfiguration"), count);
QVariantMap tmp(map.value(oldBcKey).toMap());
QVariantMap bcMap(convertBuildConfigurations(tmp));
if (bcMap.isEmpty())
continue;
// buildsteps
QStringList buildSteps(map.value(oldBcKey + QLatin1String("-buildsteps")).toStringList());
if (buildSteps.isEmpty())
// try lowercase version, too:-(
buildSteps = map.value(QString::fromLatin1("buildconfiguration-") + bc + QLatin1String("-buildsteps")).toStringList();
if (buildSteps.isEmpty())
buildSteps = map.value(QLatin1String("buildsteps")).toStringList();
int pos(0);
foreach (const QString &bs, buildSteps) {
// Watch out: Capitalization differs from oldBcKey!
const QString localKey(QLatin1String("buildconfiguration-") + bc + QString::fromLatin1("-buildstep") + QString::number(pos));
const QString globalKey(QString::fromLatin1("buildstep") + QString::number(pos));
QVariantMap local(map.value(localKey).toMap());
QVariantMap global(map.value(globalKey).toMap());
for (QVariantMap::const_iterator i = global.constBegin(); i != global.constEnd(); ++i) {
if (!local.contains(i.key()))
local.insert(i.key(), i.value());
if (i.key() == QLatin1String("ProjectExplorer.BuildConfiguration.DisplayName") &&
local.value(i.key()).toString().isEmpty())
local.insert(i.key(), i.value());
}
local.insert(QLatin1String("Id"), bs);
bcMap.insert(QString::fromLatin1("ProjectExplorer.BuildConfiguration.BuildStep.") + QString::number(pos),
convertBuildSteps(local));
++pos;
}
bcMap.insert(QLatin1String("ProjectExplorer.BuildConfiguration.BuildStepsCount"), pos);
// cleansteps
QStringList cleanSteps(map.value(oldBcKey + QLatin1String("-cleansteps")).toStringList());
if (cleanSteps.isEmpty())
// try lowercase version, too:-(
cleanSteps = map.value(QString::fromLatin1("buildconfiguration-") + bc + QLatin1String("-cleansteps")).toStringList();
if (cleanSteps.isEmpty())
cleanSteps = map.value(QLatin1String("cleansteps")).toStringList();
pos = 0;
foreach (const QString &bs, cleanSteps) {
// Watch out: Capitalization differs from oldBcKey!
const QString localKey(QLatin1String("buildconfiguration-") + bc + QString::fromLatin1("-cleanstep") + QString::number(pos));
const QString globalKey(QString::fromLatin1("cleanstep") + QString::number(pos));
QVariantMap local(map.value(localKey).toMap());
QVariantMap global(map.value(globalKey).toMap());
for (QVariantMap::const_iterator i = global.constBegin(); i != global.constEnd(); ++i) {
if (!local.contains(i.key()))
local.insert(i.key(), i.value());
if (i.key() == QLatin1String("ProjectExplorer.BuildConfiguration.DisplayName") &&
local.value(i.key()).toString().isEmpty())
local.insert(i.key(), i.value());
}
local.insert(QLatin1String("Id"), bs);
bcMap.insert(QString::fromLatin1("ProjectExplorer.BuildConfiguration.CleanStep.") + QString::number(pos),
convertBuildSteps(local));
++pos;
}
bcMap.insert(QLatin1String("ProjectExplorer.BuildConfiguration.CleanStepsCount"), pos);
// Merge into result set:
result.insert(QString::fromLatin1("ProjectExplorer.Project.BuildConfiguration.") + QString::number(count), bcMap);
++count;
}
result.insert(QLatin1String("ProjectExplorer.Project.BuildConfigurationCount"), count);
// "RunConfiguration*":
active = map.value(QLatin1String("activeRunConfiguration")).toString();
count = 0;
forever {
QString prefix(QLatin1String("RunConfiguration") + QString::number(count) + QLatin1Char('-'));
QVariantMap rcMap;
for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i) {
if (!i.key().startsWith(prefix))
continue;
QString newKey(i.key().mid(prefix.size()));
rcMap.insert(newKey, i.value());
}
if (rcMap.isEmpty()) {
result.insert(QLatin1String("ProjectExplorer.Project.RunConfigurationCount"), count);
break;
}
result.insert(QString::fromLatin1("ProjectExplorer.Project.RunConfiguration.") + QString::number(count),
convertRunConfigurations(rcMap));
++count;
}
// "defaultFileEncoding" (EditorSettings):
QVariant codecVariant(map.value(QLatin1String("defaultFileEncoding")));
if (codecVariant.isValid()) {
QByteArray codec(codecVariant.toByteArray());
QVariantMap editorSettingsMap;
editorSettingsMap.insert(QLatin1String("EditorConfiguration.Codec"), codec);
result.insert(QLatin1String("ProjectExplorer.Project.EditorSettings"),
editorSettingsMap);
}
QVariant toolchain(map.value(QLatin1String("toolChain")));
if (toolchain.isValid()) {
bool ok;
int type(toolchain.toInt(&ok));
if (!ok) {
QString toolChainName(toolchain.toString());
if (toolChainName == QLatin1String("gcc"))
type = 0;
else if (toolChainName == QLatin1String("mingw"))
type = 2;
else if (toolChainName == QLatin1String("msvc"))
type = 3;
else if (toolChainName == QLatin1String("wince"))
type = 4;
}
result.insert(QLatin1String("GenericProjectManager.GenericProject.Toolchain"), type);
}
return result;
}
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// UserFileVersion1Upgrader: // UserFileVersion1Upgrader:
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------

View File

@@ -55,6 +55,11 @@ public:
QVariantMap restoreSettings(QWidget *parent) const; QVariantMap restoreSettings(QWidget *parent) const;
bool saveSettings(const QVariantMap &data, QWidget *parent) const; bool saveSettings(const QVariantMap &data, QWidget *parent) const;
static QVariantMap setVersionInMap(const QVariantMap &data, int version);
static int versionFromMap(const QVariantMap &data);
static int originalVersionFromMap(const QVariantMap &data);
static QVariantMap setOriginalVersionInMap(const QVariantMap &data, int version);
void addVersionUpgrader(Internal::VersionUpgrader *handler); // Takes ownership of the handler! void addVersionUpgrader(Internal::VersionUpgrader *handler); // Takes ownership of the handler!
private: private:
QStringList findSettingsFiles(const QString &suffix) const; QStringList findSettingsFiles(const QString &suffix) const;
@@ -67,16 +72,14 @@ private:
class SettingsData class SettingsData
{ {
public: public:
SettingsData() : m_version(-1) {} SettingsData() {}
SettingsData(const QVariantMap &map) : m_version(-1), m_map(map) {} SettingsData(const QVariantMap &map) : m_map(map) {}
void clear(); void clear();
bool isValid() const; bool isValid() const;
QByteArray environmentId() const { return m_environmentId; } QByteArray environmentId() const { return m_environmentId; }
int version() const { return m_version; }
Utils::FileName fileName() const { return m_fileName; } Utils::FileName fileName() const { return m_fileName; }
int m_version;
QByteArray m_environmentId; QByteArray m_environmentId;
QVariantMap m_map; QVariantMap m_map;
Utils::FileName m_fileName; Utils::FileName m_fileName;