diff --git a/src/plugins/remotelinux/genericdirectuploadservice.cpp b/src/plugins/remotelinux/genericdirectuploadservice.cpp index 878ac5e96b609c975139d5e80c82c4233f31e254..e0f03e8fdbf3be64b19f629587459142859bedeb 100644 --- a/src/plugins/remotelinux/genericdirectuploadservice.cpp +++ b/src/plugins/remotelinux/genericdirectuploadservice.cpp @@ -54,8 +54,10 @@ enum State { Inactive, InitializingSftp, Uploading }; class GenericDirectUploadServicePrivate { public: - GenericDirectUploadServicePrivate() : stopRequested(false), state(Inactive) {} + GenericDirectUploadServicePrivate() + : incremental(false), stopRequested(false), state(Inactive) {} + bool incremental; bool stopRequested; State state; QList<DeployableFile> filesToUpload; @@ -79,6 +81,11 @@ void GenericDirectUploadService::setDeployableFiles(const QList<DeployableFile> m_d->deployableFiles = deployableFiles; } +void GenericDirectUploadService::setIncrementalDeployment(bool incremental) +{ + m_d->incremental = incremental; +} + bool GenericDirectUploadService::isDeploymentNecessary() const { m_d->filesToUpload.clear(); @@ -259,15 +266,13 @@ void GenericDirectUploadService::stopDeployment() handleDeploymentDone(); } -// Note: time stamp checks disabled for now; it's too much hassle for the user to force -// deployment in case the device has changed. void GenericDirectUploadService::checkDeploymentNeeded(const DeployableFile &deployable) const { QFileInfo fileInfo(deployable.localFilePath); if (fileInfo.isDir()) { const QStringList files = QDir(deployable.localFilePath) .entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); - if (files.isEmpty() /* && hasChangedSinceLastDeployment(deployable) */) + if (files.isEmpty() && (!m_d->incremental || hasChangedSinceLastDeployment(deployable))) m_d->filesToUpload << deployable; foreach (const QString &fileName, files) { const QString localFilePath = deployable.localFilePath @@ -276,7 +281,7 @@ void GenericDirectUploadService::checkDeploymentNeeded(const DeployableFile &dep + fileInfo.fileName(); checkDeploymentNeeded(DeployableFile(localFilePath, remoteDir)); } - } else /* if (hasChangedSinceLastDeployment(deployable)) */ { + } else if (!m_d->incremental || hasChangedSinceLastDeployment(deployable)) { m_d->filesToUpload << deployable; } } diff --git a/src/plugins/remotelinux/genericdirectuploadservice.h b/src/plugins/remotelinux/genericdirectuploadservice.h index d522a8f3522a74da422ecb881ae0d20db11c94ac..da5b006fa86935e9f9a1a53b7651955cc5f18589 100644 --- a/src/plugins/remotelinux/genericdirectuploadservice.h +++ b/src/plugins/remotelinux/genericdirectuploadservice.h @@ -52,6 +52,7 @@ public: GenericDirectUploadService(QObject *parent = 0); void setDeployableFiles(const QList<DeployableFile> &deployableFiles); + void setIncrementalDeployment(bool incremental); private slots: void handleSftpInitialized(); diff --git a/src/plugins/remotelinux/genericdirectuploadstep.cpp b/src/plugins/remotelinux/genericdirectuploadstep.cpp index a6b215317985476ac02b8538912e9aaa6d0d72da..d3e97062454df235a4493673bae12bde7e34c0e2 100644 --- a/src/plugins/remotelinux/genericdirectuploadstep.cpp +++ b/src/plugins/remotelinux/genericdirectuploadstep.cpp @@ -35,17 +35,64 @@ #include "deploymentinfo.h" #include "genericdirectuploadservice.h" #include "remotelinuxdeployconfiguration.h" +#include "remotelinuxdeploystepwidget.h" +#include <QtGui/QCheckBox> +#include <QtGui/QVBoxLayout> #include <QtCore/QList> #include <QtCore/QSharedPointer> +using namespace ProjectExplorer; + namespace RemoteLinux { namespace Internal { +namespace { +const char IncrementalKey[] = "RemoteLinux.GenericDirectUploadStep.Incremental"; + +class ConfigWidget : public BuildStepConfigWidget +{ + Q_OBJECT +public: + ConfigWidget(GenericDirectUploadStep *step) : m_widget(step) + { + m_incrementalCheckBox.setText(tr("Incremental deployment")); + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setMargin(0); + mainLayout->addWidget(&m_widget); + mainLayout->addWidget(&m_incrementalCheckBox); + m_incrementalCheckBox.setChecked(step->incrementalDeployment()); + connect(&m_widget, SIGNAL(updateSummary()), SIGNAL(updateSummary())); + connect(&m_incrementalCheckBox, SIGNAL(toggled(bool)), + SLOT(handleIncrementalChanged(bool))); + } + +private: + QString summaryText() const { return m_widget.summaryText(); } + QString displayName() const { return m_widget.displayName(); } + + GenericDirectUploadStep *myStep() const { + return qobject_cast<GenericDirectUploadStep *>(m_widget.step()); + } + + Q_SLOT void handleIncrementalChanged(bool incremental) { + myStep()->setIncrementalDeployment(incremental); + } + + RemoteLinuxDeployStepWidget m_widget; + QCheckBox m_incrementalCheckBox; +}; + +} // anonymous namespace + class GenericDirectUploadStepPrivate { public: + GenericDirectUploadStepPrivate() : incremental(true) {} + GenericDirectUploadService deployService; + bool incremental; }; + } // namespace Internal GenericDirectUploadStep::GenericDirectUploadStep(ProjectExplorer::BuildStepList *bsl, const QString &id) @@ -65,6 +112,11 @@ GenericDirectUploadStep::~GenericDirectUploadStep() delete m_d; } +BuildStepConfigWidget *GenericDirectUploadStep::createConfigWidget() +{ + return new Internal::ConfigWidget(this); +} + bool GenericDirectUploadStep::isDeploymentPossible(QString *whyNot) const { QList<DeployableFile> deployableFiles; @@ -73,6 +125,7 @@ bool GenericDirectUploadStep::isDeploymentPossible(QString *whyNot) const for (int i = 0; i < deployableCount; ++i) deployableFiles << deploymentInfo->deployableAt(i); m_d->deployService.setDeployableFiles(deployableFiles); + m_d->deployService.setIncrementalDeployment(incrementalDeployment()); return AbstractRemoteLinuxDeployStep::isDeploymentPossible(whyNot); } @@ -81,12 +134,37 @@ AbstractRemoteLinuxDeployService *GenericDirectUploadStep::deployService() const return &m_d->deployService; } +bool GenericDirectUploadStep::fromMap(const QVariantMap &map) +{ + if (!AbstractRemoteLinuxDeployStep::fromMap(map)) + return false; + setIncrementalDeployment(map.value(QLatin1String(Internal::IncrementalKey), true).toBool()); + return true; +} + +QVariantMap GenericDirectUploadStep::toMap() const +{ + QVariantMap map = AbstractRemoteLinuxDeployStep::toMap(); + map.insert(QLatin1String(Internal::IncrementalKey), incrementalDeployment()); + return map; +} + void GenericDirectUploadStep::ctor() { setDefaultDisplayName(displayName()); m_d = new Internal::GenericDirectUploadStepPrivate; } +void GenericDirectUploadStep::setIncrementalDeployment(bool incremental) +{ + m_d->incremental = incremental; +} + +bool GenericDirectUploadStep::incrementalDeployment() const +{ + return m_d->incremental; +} + QString GenericDirectUploadStep::stepId() { return QLatin1String("RemoteLinux.DirectUploadStep"); @@ -98,3 +176,5 @@ QString GenericDirectUploadStep::displayName() } } //namespace RemoteLinux + +#include "genericdirectuploadstep.moc" diff --git a/src/plugins/remotelinux/genericdirectuploadstep.h b/src/plugins/remotelinux/genericdirectuploadstep.h index b7a17a2b6533b9b15fb4fd5c98c52e2bbd4671b4..b904cb1c6c12df838fe9c6d6c62e93b60a873a70 100644 --- a/src/plugins/remotelinux/genericdirectuploadstep.h +++ b/src/plugins/remotelinux/genericdirectuploadstep.h @@ -49,13 +49,19 @@ public: GenericDirectUploadStep(ProjectExplorer::BuildStepList *bsl, GenericDirectUploadStep *other); ~GenericDirectUploadStep(); + ProjectExplorer::BuildStepConfigWidget *createConfigWidget(); bool isDeploymentPossible(QString *whyNot = 0) const; + void setIncrementalDeployment(bool incremental); + bool incrementalDeployment() const; + static QString stepId(); static QString displayName(); private: AbstractRemoteLinuxDeployService *deployService() const; + bool fromMap(const QVariantMap &map); + QVariantMap toMap() const; void ctor(); diff --git a/src/plugins/remotelinux/remotelinuxdeploystepwidget.h b/src/plugins/remotelinux/remotelinuxdeploystepwidget.h index 12fb907929648178e191adeec9c0d1c17fba3bf3..a4f0b68de2426fe121405edeb6908d4873876459 100644 --- a/src/plugins/remotelinux/remotelinuxdeploystepwidget.h +++ b/src/plugins/remotelinux/remotelinuxdeploystepwidget.h @@ -51,6 +51,8 @@ public: QString summaryText() const; QString displayName() const { return QString(); } + AbstractRemoteLinuxDeployStep *step() const { return m_step; } + private: Q_SLOT void handleStepToBeRemoved(int step);