diff --git a/src/plugins/projectexplorer/deployconfiguration.cpp b/src/plugins/projectexplorer/deployconfiguration.cpp index 4d16599a12f..fcc0c886bf9 100644 --- a/src/plugins/projectexplorer/deployconfiguration.cpp +++ b/src/plugins/projectexplorer/deployconfiguration.cpp @@ -223,7 +223,10 @@ DeployConfiguration *DeployConfigurationFactory::restore(Target *parent, const Q if (!dc->fromMap(map)) { delete dc; dc = nullptr; + } else if (factory->postRestore()) { + factory->postRestore()(dc, map); } + return dc; } diff --git a/src/plugins/projectexplorer/deployconfiguration.h b/src/plugins/projectexplorer/deployconfiguration.h index 1d9ff883383..66d387291c9 100644 --- a/src/plugins/projectexplorer/deployconfiguration.h +++ b/src/plugins/projectexplorer/deployconfiguration.h @@ -97,6 +97,10 @@ public: void setConfigWidgetCreator(const std::function &configWidgetCreator); void setUseDeploymentDataView(); + using PostRestore = std::function; + void setPostRestore(const PostRestore &postRestore) { m_postRestore = postRestore; } + PostRestore postRestore() const { return m_postRestore; } + protected: using DeployConfigurationCreator = std::function; void setConfigBaseId(Core::Id deployConfigBaseId); @@ -109,6 +113,7 @@ private: QList m_initialSteps; QString m_defaultDisplayName; std::function m_configWidgetCreator; + PostRestore m_postRestore; }; class DefaultDeployConfigurationFactory : public DeployConfigurationFactory diff --git a/src/plugins/projectexplorer/userfileaccessor.cpp b/src/plugins/projectexplorer/userfileaccessor.cpp index 838507e544d..f166425a1de 100644 --- a/src/plugins/projectexplorer/userfileaccessor.cpp +++ b/src/plugins/projectexplorer/userfileaccessor.cpp @@ -155,6 +155,18 @@ public: static QVariant process(const QVariant &entry); }; +// Version 21 adds a "make install" step to an existing RemoteLinux deploy configuration +// if and only if such a step would be added when creating a new one. +// See QTCREATORBUG-22689. +class UserFileVersion21Upgrader : public VersionUpgrader +{ +public: + UserFileVersion21Upgrader() : VersionUpgrader(21, "4.10-pre1") { } + QVariantMap upgrade(const QVariantMap &map) final; + + static QVariant process(const QVariant &entry); +}; + } // namespace // @@ -315,6 +327,7 @@ UserFileAccessor::UserFileAccessor(Project *project) : addVersionUpgrader(std::make_unique()); addVersionUpgrader(std::make_unique()); addVersionUpgrader(std::make_unique()); + addVersionUpgrader(std::make_unique()); } Project *UserFileAccessor::project() const @@ -855,6 +868,33 @@ QVariant UserFileVersion20Upgrader::process(const QVariant &entry) } } +QVariantMap UserFileVersion21Upgrader::upgrade(const QVariantMap &map) +{ + return process(map).toMap(); +} + +QVariant UserFileVersion21Upgrader::process(const QVariant &entry) +{ + switch (entry.type()) { + case QVariant::List: + return Utils::transform(entry.toList(), &UserFileVersion21Upgrader::process); + case QVariant::Map: { + QVariantMap entryMap = entry.toMap(); + if (entryMap.value("ProjectExplorer.ProjectConfiguration.Id").toString() + == "DeployToGenericLinux") { + entryMap.insert("_checkMakeInstall", true); + return entryMap; + } + return Utils::transform( + entryMap.toStdMap(), [](const std::pair &item) { + return qMakePair(item.first, UserFileVersion21Upgrader::process(item.second)); + }); + } + default: + return entry; + } +} + #if defined(WITH_TESTS) #include diff --git a/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp b/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp index 88cd76f66d4..6bdef06dab9 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp +++ b/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp @@ -61,11 +61,19 @@ RemoteLinuxDeployConfigurationFactory::RemoteLinuxDeployConfigurationFactory() "Deploy to Remote Linux Host")); setUseDeploymentDataView(); - addInitialStep(MakeInstallStep::stepId(), [](Target *target) { + const auto needsMakeInstall = [](Target *target) + { const Project * const prj = target->project(); return prj->deploymentKnowledge() == DeploymentKnowledge::Bad && prj->hasMakeInstallEquivalent(); + }; + setPostRestore([needsMakeInstall](DeployConfiguration *dc, const QVariantMap &map) { + // 4.9 -> 4.10. See QTCREATORBUG-22689. + if (map.value("_checkMakeInstall").toBool() && needsMakeInstall(dc->target())) + dc->stepList()->insertStep(0, new MakeInstallStep(dc->stepList())); }); + + addInitialStep(MakeInstallStep::stepId(), needsMakeInstall); addInitialStep(RemoteLinuxCheckForFreeDiskSpaceStep::stepId()); addInitialStep(RemoteLinuxKillAppStep::stepId()); addInitialStep(RsyncDeployStep::stepId(), [](Target *target) {