diff options
author | Daniel Trevitz <daniel.trevitz@belden.com> | 2016-10-05 20:40:33 -0400 |
---|---|---|
committer | Daniel Trevitz <daniel.trevitz@belden.com> | 2016-10-08 22:53:53 +0000 |
commit | 966623d64b1a30691b747605a48dd3ef82072b17 (patch) | |
tree | 8d534e64769d1d485f0eb4820bb98888b71fbf94 | |
parent | 71a449a1e876a088eeec41c3fec89d84a4d65502 (diff) |
Refactor the incremental deployment to a separate class
Extract incremental deployment caching to a new class.
Remove the extra Kit pointer and use target directly.
Add incremental deployment class to deploy service private data member.
Change-Id: I1e2e0829b9413f647ccfa3a4af23260a54895d83
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r-- | src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp | 98 | ||||
-rw-r--r-- | src/plugins/remotelinux/deploymenttimeinfo.cpp | 168 | ||||
-rw-r--r-- | src/plugins/remotelinux/deploymenttimeinfo.h | 58 | ||||
-rw-r--r-- | src/plugins/remotelinux/remotelinux.pro | 6 | ||||
-rw-r--r-- | src/plugins/remotelinux/remotelinux.qbs | 2 |
5 files changed, 242 insertions, 90 deletions
diff --git a/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp b/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp index 06b9ab138e..4da0fff0fe 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp +++ b/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "abstractremotelinuxdeployservice.h" +#include "deploymenttimeinfo.h" #include <projectexplorer/deployablefile.h> #include <projectexplorer/target.h> @@ -44,49 +45,22 @@ namespace RemoteLinux { namespace Internal { namespace { -class DeployParameters -{ -public: - DeployParameters(const DeployableFile &d, const QString &h, const QString &s) - : file(d), host(h), sysroot(s) {} - - bool operator==(const DeployParameters &other) const { - return file == other.file && host == other.host && sysroot == other.sysroot; - } - - DeployableFile file; - QString host; - QString sysroot; -}; -uint qHash(const DeployParameters &p) { - return qHash(qMakePair(qMakePair(p.file, p.host), p.sysroot)); -} - enum State { Inactive, SettingUpDevice, Connecting, Deploying }; - -// TODO: Just change these... -const char LastDeployedHostsKey[] = "Qt4ProjectManager.MaemoRunConfiguration.LastDeployedHosts"; -const char LastDeployedSysrootsKey[] = "Qt4ProjectManager.MaemoRunConfiguration.LastDeployedSysroots"; -const char LastDeployedFilesKey[] = "Qt4ProjectManager.MaemoRunConfiguration.LastDeployedFiles"; -const char LastDeployedRemotePathsKey[] = "Qt4ProjectManager.MaemoRunConfiguration.LastDeployedRemotePaths"; -const char LastDeployedTimesKey[] = "Qt4ProjectManager.MaemoRunConfiguration.LastDeployedTimes"; - } // anonymous namespace class AbstractRemoteLinuxDeployServicePrivate { public: AbstractRemoteLinuxDeployServicePrivate() - : kit(0), connection(0), state(Inactive), stopRequested(false) {} + : connection(0), state(Inactive), stopRequested(false) {} IDevice::ConstPtr deviceConfiguration; QPointer<Target> target; - Kit *kit; + + DeploymentTimeInfo deployTimes; SshConnection *connection; State state; bool stopRequested; - - QHash<DeployParameters, QDateTime> lastDeployed; }; } // namespace Internal @@ -109,7 +83,7 @@ const Target *AbstractRemoteLinuxDeployService::target() const const Kit *AbstractRemoteLinuxDeployService::profile() const { - return d->kit; + return d->target ? d->target->kit() : nullptr; } IDevice::ConstPtr AbstractRemoteLinuxDeployService::deviceConfiguration() const @@ -124,38 +98,18 @@ SshConnection *AbstractRemoteLinuxDeployService::connection() const void AbstractRemoteLinuxDeployService::saveDeploymentTimeStamp(const DeployableFile &deployableFile) { - if (!d->target) - return; - QString systemRoot; - if (SysRootKitInformation::hasSysRoot(d->kit)) - systemRoot = SysRootKitInformation::sysRoot(d->kit).toString(); - d->lastDeployed.insert(DeployParameters(deployableFile, - deviceConfiguration()->sshParameters().host, - systemRoot), - QDateTime::currentDateTime()); + d->deployTimes.saveDeploymentTimeStamp(deployableFile, profile()); } bool AbstractRemoteLinuxDeployService::hasChangedSinceLastDeployment(const DeployableFile &deployableFile) const { - if (!target()) - return true; - QString systemRoot; - if (SysRootKitInformation::hasSysRoot(d->kit)) - systemRoot = SysRootKitInformation::sysRoot(d->kit).toString(); - const QDateTime &lastDeployed = d->lastDeployed.value(DeployParameters(deployableFile, - deviceConfiguration()->sshParameters().host, systemRoot)); - return !lastDeployed.isValid() - || deployableFile.localFilePath().toFileInfo().lastModified() > lastDeployed; + return d->deployTimes.hasChangedSinceLastDeployment(deployableFile, profile()); } void AbstractRemoteLinuxDeployService::setTarget(Target *target) { d->target = target; - if (target) - d->kit = target->kit(); - else - d->kit = 0; - d->deviceConfiguration = DeviceKitInformation::device(d->kit); + d->deviceConfiguration = DeviceKitInformation::device(profile()); } void AbstractRemoteLinuxDeployService::setDevice(const IDevice::ConstPtr &device) @@ -218,44 +172,12 @@ bool AbstractRemoteLinuxDeployService::isDeploymentPossible(QString *whyNot) con QVariantMap AbstractRemoteLinuxDeployService::exportDeployTimes() const { - QVariantMap map; - QVariantList hostList; - QVariantList fileList; - QVariantList sysrootList; - QVariantList remotePathList; - QVariantList timeList; - typedef QHash<DeployParameters, QDateTime>::ConstIterator DepIt; - for (DepIt it = d->lastDeployed.constBegin(); it != d->lastDeployed.constEnd(); ++it) { - fileList << it.key().file.localFilePath().toString(); - remotePathList << it.key().file.remoteDirectory(); - hostList << it.key().host; - sysrootList << it.key().sysroot; - timeList << it.value(); - } - map.insert(QLatin1String(LastDeployedHostsKey), hostList); - map.insert(QLatin1String(LastDeployedSysrootsKey), sysrootList); - map.insert(QLatin1String(LastDeployedFilesKey), fileList); - map.insert(QLatin1String(LastDeployedRemotePathsKey), remotePathList); - map.insert(QLatin1String(LastDeployedTimesKey), timeList); - return map; + return d->deployTimes.exportDeployTimes(); } void AbstractRemoteLinuxDeployService::importDeployTimes(const QVariantMap &map) { - const QVariantList &hostList = map.value(QLatin1String(LastDeployedHostsKey)).toList(); - const QVariantList &sysrootList = map.value(QLatin1String(LastDeployedSysrootsKey)).toList(); - const QVariantList &fileList = map.value(QLatin1String(LastDeployedFilesKey)).toList(); - const QVariantList &remotePathList - = map.value(QLatin1String(LastDeployedRemotePathsKey)).toList(); - const QVariantList &timeList = map.value(QLatin1String(LastDeployedTimesKey)).toList(); - const int elemCount - = qMin(qMin(qMin(hostList.size(), fileList.size()), - qMin(remotePathList.size(), timeList.size())), sysrootList.size()); - for (int i = 0; i < elemCount; ++i) { - const DeployableFile df(fileList.at(i).toString(), remotePathList.at(i).toString()); - d->lastDeployed.insert(DeployParameters(df, hostList.at(i).toString(), - sysrootList.at(i).toString()), timeList.at(i).toDateTime()); - } + d->deployTimes.importDeployTimes(map); } void AbstractRemoteLinuxDeployService::handleDeviceSetupDone(bool success) diff --git a/src/plugins/remotelinux/deploymenttimeinfo.cpp b/src/plugins/remotelinux/deploymenttimeinfo.cpp new file mode 100644 index 0000000000..52ed43b913 --- /dev/null +++ b/src/plugins/remotelinux/deploymenttimeinfo.cpp @@ -0,0 +1,168 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ +#include "deploymenttimeinfo.h" + +#include <projectexplorer/deployablefile.h> +#include <projectexplorer/target.h> +#include <qtsupport/qtkitinformation.h> + +#include <ssh/sshconnection.h> +#include <ssh/sshconnectionmanager.h> + +#include <QPointer> +#include <QDateTime> +#include <QFileInfo> + +using namespace ProjectExplorer; +using namespace QSsh; + +namespace RemoteLinux { + +namespace { +const char LastDeployedHostsKey[] = "ProjectExplorer.RunConfiguration.LastDeployedHosts"; +const char LastDeployedSysrootsKey[] = "ProjectExplorer.RunConfiguration.LastDeployedSysroots"; +const char LastDeployedFilesKey[] = "ProjectExplorer.RunConfiguration.LastDeployedFiles"; +const char LastDeployedRemotePathsKey[] = "ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"; +const char LastDeployedTimesKey[] = "ProjectExplorer.RunConfiguration.LastDeployedTimes"; + +class DeployParameters +{ + +public: + DeployParameters(const DeployableFile &d, const QString &h, const QString &s) + : file(d), host(h), sysroot(s) {} + + bool operator==(const DeployParameters &other) const { + return file == other.file && host == other.host && sysroot == other.sysroot; + } + + DeployableFile file; + QString host; + QString sysroot; +}; + +uint qHash(const DeployParameters &p) { + return qHash(qMakePair(qMakePair(p.file, p.host), p.sysroot)); +} + +} // anonymous namespace + +class DeploymentTimeInfoPrivate +{ +public: + QHash<DeployParameters, QDateTime> lastDeployed; +}; + + +DeploymentTimeInfo::DeploymentTimeInfo() : d(new DeploymentTimeInfoPrivate()) +{ + +} + +void DeploymentTimeInfo::saveDeploymentTimeStamp(const DeployableFile &deployableFile, + const Kit *kit) +{ + if (!kit) + return; + + QString systemRoot; + if (SysRootKitInformation::hasSysRoot(kit)) + systemRoot = SysRootKitInformation::sysRoot(kit).toString(); + + const IDevice::ConstPtr deviceConfiguration = DeviceKitInformation::device(kit); + const QString host = deviceConfiguration->sshParameters().host; + + d->lastDeployed.insert( + DeployParameters(deployableFile, host, systemRoot), + QDateTime::currentDateTime()); +} + +bool DeploymentTimeInfo::hasChangedSinceLastDeployment(const DeployableFile &deployableFile, + const ProjectExplorer::Kit *kit) const +{ + if (!kit) + return false; + + QString systemRoot; + if (SysRootKitInformation::hasSysRoot(kit)) + systemRoot = SysRootKitInformation::sysRoot(kit).toString(); + + const IDevice::ConstPtr deviceConfiguration = DeviceKitInformation::device(kit); + const QString host = deviceConfiguration->sshParameters().host; + + const DeployParameters dp(deployableFile, host, systemRoot); + + const QDateTime &lastDeployed = d->lastDeployed.value(dp); + const QDateTime lastModified = deployableFile.localFilePath().toFileInfo().lastModified(); + + return !lastDeployed.isValid() || (lastModified > lastDeployed); +} + +QVariantMap DeploymentTimeInfo::exportDeployTimes() const +{ + QVariantMap map; + QVariantList hostList; + QVariantList fileList; + QVariantList sysrootList; + QVariantList remotePathList; + QVariantList timeList; + typedef QHash<DeployParameters, QDateTime>::ConstIterator DepIt; + + for (DepIt it = d->lastDeployed.constBegin(); it != d->lastDeployed.constEnd(); ++it) { + fileList << it.key().file.localFilePath().toString(); + remotePathList << it.key().file.remoteDirectory(); + hostList << it.key().host; + sysrootList << it.key().sysroot; + timeList << it.value(); + } + map.insert(QLatin1String(LastDeployedHostsKey), hostList); + map.insert(QLatin1String(LastDeployedSysrootsKey), sysrootList); + map.insert(QLatin1String(LastDeployedFilesKey), fileList); + map.insert(QLatin1String(LastDeployedRemotePathsKey), remotePathList); + map.insert(QLatin1String(LastDeployedTimesKey), timeList); + return map; +} + +void DeploymentTimeInfo::importDeployTimes(const QVariantMap &map) +{ + const QVariantList &hostList = map.value(QLatin1String(LastDeployedHostsKey)).toList(); + const QVariantList &sysrootList = map.value(QLatin1String(LastDeployedSysrootsKey)).toList(); + const QVariantList &fileList = map.value(QLatin1String(LastDeployedFilesKey)).toList(); + const QVariantList &remotePathList + = map.value(QLatin1String(LastDeployedRemotePathsKey)).toList(); + const QVariantList &timeList = map.value(QLatin1String(LastDeployedTimesKey)).toList(); + + const int elemCount = qMin(qMin(qMin(hostList.size(), fileList.size()), + qMin(remotePathList.size(), timeList.size())), + sysrootList.size()); + + for (int i = 0; i < elemCount; ++i) { + const DeployableFile df(fileList.at(i).toString(), remotePathList.at(i).toString()); + const DeployParameters dp(df, hostList.at(i).toString(), sysrootList.at(i).toString()); + d->lastDeployed.insert(dp, timeList.at(i).toDateTime()); + } +} + +} // namespace RemoteLinux diff --git a/src/plugins/remotelinux/deploymenttimeinfo.h b/src/plugins/remotelinux/deploymenttimeinfo.h new file mode 100644 index 0000000000..942bc9c4ab --- /dev/null +++ b/src/plugins/remotelinux/deploymenttimeinfo.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include <QVariantMap> +#include <projectexplorer/devicesupport/idevice.h> + +namespace ProjectExplorer { +class DeployableFile; +class Kit; +} + +namespace RemoteLinux { + +class DeploymentTimeInfoPrivate; + +class DeploymentTimeInfo +{ +public: + DeploymentTimeInfo(); + + void importDeployTimes(const QVariantMap &map); + QVariantMap exportDeployTimes() const; + + void saveDeploymentTimeStamp(const ProjectExplorer::DeployableFile &deployableFile, + const ProjectExplorer::Kit *kit); + + bool hasChangedSinceLastDeployment(const ProjectExplorer::DeployableFile &deployableFile, + const ProjectExplorer::Kit *kit) const; + +private: + DeploymentTimeInfoPrivate *d; +}; + +} // namespace RemoteLinux diff --git a/src/plugins/remotelinux/remotelinux.pro b/src/plugins/remotelinux/remotelinux.pro index 794ae05927..9f1683508d 100644 --- a/src/plugins/remotelinux/remotelinux.pro +++ b/src/plugins/remotelinux/remotelinux.pro @@ -48,7 +48,8 @@ HEADERS += \ abstractremotelinuxrunsupport.h \ linuxdeviceprocess.h \ remotelinuxcustomrunconfiguration.h \ - remotelinuxsignaloperation.h + remotelinuxsignaloperation.h \ + deploymenttimeinfo.h SOURCES += \ embeddedlinuxqtversion.cpp \ @@ -94,7 +95,8 @@ SOURCES += \ abstractremotelinuxrunsupport.cpp \ linuxdeviceprocess.cpp \ remotelinuxcustomrunconfiguration.cpp \ - remotelinuxsignaloperation.cpp + remotelinuxsignaloperation.cpp \ + deploymenttimeinfo.cpp FORMS += \ genericlinuxdeviceconfigurationwizardsetuppage.ui \ diff --git a/src/plugins/remotelinux/remotelinux.qbs b/src/plugins/remotelinux/remotelinux.qbs index 5727355ea0..a651d581a2 100644 --- a/src/plugins/remotelinux/remotelinux.qbs +++ b/src/plugins/remotelinux/remotelinux.qbs @@ -27,6 +27,8 @@ Project { "abstractremotelinuxrunsupport.h", "abstractuploadandinstallpackageservice.cpp", "abstractuploadandinstallpackageservice.h", + "deploymenttimeinfo.cpp", + "deploymenttimeinfo.h", "embeddedlinuxqtversion.cpp", "embeddedlinuxqtversion.h", "embeddedlinuxqtversionfactory.cpp", |