summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKatja Marttila <katja.marttila@qt.io>2017-04-10 14:42:15 +0300
committerKatja Marttila <katja.marttila@qt.io>2017-04-24 11:44:38 +0000
commit3925556481327972a25ad40ef4e72dc79dd1cec8 (patch)
tree6ca15020dd0573d1c8bc17508238a606dd5e056a /src
parentd0bca58271a46e670a76bd99c51a2e23f489c692 (diff)
Fix invalid QBSP installer break
Change-Id: I7e0bfc2fb0dc4c5438ec2c5ce59b49eb0f0348ee Task-number: QTIFW-954 Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/libs/installer/metadatajob.cpp112
-rw-r--r--src/libs/installer/metadatajob.h1
-rw-r--r--src/libs/installer/metadatajob_p.h1
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp4
-rw-r--r--src/libs/installer/packagemanagergui.cpp27
5 files changed, 98 insertions, 47 deletions
diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp
index 83f252349..4b13508ec 100644
--- a/src/libs/installer/metadatajob.cpp
+++ b/src/libs/installer/metadatajob.cpp
@@ -34,6 +34,7 @@
#include "proxycredentialsdialog.h"
#include "serverauthenticationdialog.h"
#include "settings.h"
+#include "testrepository.h"
#include <QTemporaryDir>
@@ -60,6 +61,7 @@ MetadataJob::MetadataJob(QObject *parent)
MetadataJob::~MetadataJob()
{
+ resetCompressedFetch();
reset();
}
@@ -118,13 +120,25 @@ void MetadataJob::doStart()
emitFinished();
}
} else {
- m_packages.clear();
+ resetCompressedFetch();
+
bool repositoriesFound = false;
- foreach (const Repository &repo, m_core->settings().repositories()) {
+ foreach (const Repository &repo, m_core->settings().temporaryRepositories()) {
if (repo.isCompressed() && repo.isEnabled() &&
productKeyCheck->isValidRepository(repo)) {
repositoriesFound = true;
startUnzipRepositoryTask(repo);
+
+ //Set the repository disabled so we don't handle it many times
+ Repository replacement = repo;
+ replacement.setEnabled(false);
+ Settings &s = m_core->settings();
+ QSet<Repository> temporaries = s.temporaryRepositories();
+ if (temporaries.contains(repo)) {
+ temporaries.remove(repo);
+ temporaries.insert(replacement);
+ s.setTemporaryRepositories(temporaries, true);
+ }
}
}
if (!repositoriesFound)
@@ -170,8 +184,61 @@ void MetadataJob::startUnzipRepositoryTask(const Repository &repo)
void MetadataJob::unzipRepositoryTaskFinished()
{
QFutureWatcher<void> *watcher = static_cast<QFutureWatcher<void> *>(sender());
+ int error = Job::NoError;
+ QString errorString;
try {
watcher->waitForFinished(); // trigger possible exceptions
+
+ QHashIterator<QFutureWatcher<void> *, QObject*> i(m_unzipRepositoryTasks);
+ while (i.hasNext()) {
+
+ i.next();
+ if (i.key() == watcher) {
+ UnzipArchiveTask *task = qobject_cast<UnzipArchiveTask*> (i.value());
+ QString url = task->target();
+
+ QUrl targetUrl = targetUrl.fromLocalFile(url);
+ Repository repo(targetUrl, false, true);
+ url = repo.url().toString() + QLatin1String("/Updates.xml");
+ TestRepository testJob(m_core);
+ testJob.setRepository(repo);
+ testJob.start();
+ testJob.waitForFinished();
+ error = testJob.error();
+ errorString = testJob.errorString();
+ if (error == Job::NoError) {
+ FileTaskItem item(url);
+ item.insert(TaskRole::UserRole, QVariant::fromValue(repo));
+ m_unzipRepositoryitems.append(item);
+ } else {
+ //Repository is not valid, remove it
+ Repository repository;
+ repository.setUrl(QUrl(task->archive()));
+ Settings &s = m_core->settings();
+ QSet<Repository> temporaries = s.temporaryRepositories();
+ foreach (Repository repository, temporaries) {
+ if (repository.url().toLocalFile() == task->archive()) {
+ temporaries.remove(repository);
+ }
+ }
+ s.setTemporaryRepositories(temporaries, false);
+ }
+ }
+ }
+ delete m_unzipRepositoryTasks.value(watcher);
+ m_unzipRepositoryTasks.remove(watcher);
+ delete watcher;
+
+ //One can specify many zipped repository items at once. As the repositories are
+ //unzipped one by one, we collect here all items before parsing xml files from those.
+ if (m_unzipRepositoryitems.count() > 0 && m_unzipRepositoryTasks.isEmpty()) {
+ startXMLTask(m_unzipRepositoryitems);
+ } else {
+ if (error != Job::NoError) {
+ emitFinishedWithError(QInstaller::DownloadError, errorString);
+ }
+ }
+
} catch (const UnzipArchiveException &e) {
reset();
emitFinishedWithError(QInstaller::ExtractionError, e.message());
@@ -182,31 +249,6 @@ void MetadataJob::unzipRepositoryTaskFinished()
reset();
emitFinishedWithError(QInstaller::DownloadError, tr("Unknown exception during extracting."));
}
-
- QHashIterator<QFutureWatcher<void> *, QObject*> i(m_unzipRepositoryTasks);
- while (i.hasNext()) {
- i.next();
- if (i.key() == watcher) {
- UnzipArchiveTask *task = qobject_cast<UnzipArchiveTask*> (i.value());
- QString url = task->target();
-
- QUrl targetUrl = targetUrl.fromLocalFile(url);
- Repository repo(targetUrl, false, true);
- url = repo.url().toString() + QLatin1String("/Updates.xml");
- FileTaskItem item(url);
- item.insert(TaskRole::UserRole, QVariant::fromValue(repo));
- m_unzipRepositoryitems.append(item);
- }
- }
-
- //One can specify many zipped repository items at once. As the repositories are
- //unzipped one by one, we collect here all items before parsing xml files from those.
- delete m_unzipRepositoryTasks.value(watcher);
- m_unzipRepositoryTasks.remove(watcher);
- delete watcher;
-
- if (m_unzipRepositoryitems.count() > 0 && m_unzipRepositoryTasks.isEmpty())
- startXMLTask(m_unzipRepositoryitems);
}
void MetadataJob::xmlTaskFinished()
@@ -299,13 +341,10 @@ void MetadataJob::unzipTaskFinished()
try {
watcher->waitForFinished(); // trigger possible exceptions
} catch (const UnzipArchiveException &e) {
- reset();
emitFinishedWithError(QInstaller::ExtractionError, e.message());
} catch (const QUnhandledException &e) {
- reset();
emitFinishedWithError(QInstaller::DownloadError, QLatin1String(e.what()));
} catch (...) {
- reset();
emitFinishedWithError(QInstaller::DownloadError, tr("Unknown exception during extracting."));
}
@@ -364,7 +403,6 @@ void MetadataJob::metadataTaskFinished()
void MetadataJob::reset()
{
- m_packages.clear();
m_metadata.clear();
setError(Job::NoError);
@@ -374,6 +412,17 @@ void MetadataJob::reset()
try {
m_xmlTask.cancel();
m_metadataTask.cancel();
+ } catch (...) {}
+ m_tempDirDeleter.releaseAndDeleteAll();
+}
+
+void MetadataJob::resetCompressedFetch()
+{
+ setError(Job::NoError);
+ setErrorString(QString());
+ m_unzipRepositoryitems.clear();
+ m_packages.clear();
+ try {
foreach (QFutureWatcher<void> *const watcher, m_unzipTasks.keys()) {
watcher->cancel();
watcher->deleteLater();
@@ -390,7 +439,6 @@ void MetadataJob::reset()
object->deleteLater();
m_unzipRepositoryTasks.clear();
} catch (...) {}
- m_tempDirDeleter.releaseAndDeleteAll();
}
MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &results)
diff --git a/src/libs/installer/metadatajob.h b/src/libs/installer/metadatajob.h
index 261ae295f..dac92153f 100644
--- a/src/libs/installer/metadatajob.h
+++ b/src/libs/installer/metadatajob.h
@@ -80,6 +80,7 @@ private slots:
private:
void startUnzipRepositoryTask(const Repository &repo);
void reset();
+ void resetCompressedFetch();
Status parseUpdatesXml(const QList<FileTaskResult> &results);
private:
diff --git a/src/libs/installer/metadatajob_p.h b/src/libs/installer/metadatajob_p.h
index 65be0a174..9160f4cc9 100644
--- a/src/libs/installer/metadatajob_p.h
+++ b/src/libs/installer/metadatajob_p.h
@@ -65,6 +65,7 @@ public:
: m_archive(arcive), m_targetDir(target)
{}
QString target() { return m_targetDir; }
+ QString archive() { return m_archive; }
void doTask(QFutureInterface<void> &fi)
{
fi.reportStarted();
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp
index f29b65780..5fa2b0515 100644
--- a/src/libs/installer/packagemanagercore_p.cpp
+++ b/src/libs/installer/packagemanagercore_p.cpp
@@ -2247,7 +2247,9 @@ bool PackageManagerCorePrivate::fetchMetaInformationFromCompressedRepositories()
case QInstaller::UserIgnoreError:
break; // we can simply ignore this error, the user knows about it
default:
- setStatus(PackageManagerCore::Failure, m_metadataJob.errorString());
+ //Do not change core status here, we can recover if there is invalid
+ //compressed repository
+ setStatus(m_core->status(), m_metadataJob.errorString());
return compressedRepoFetched;
}
}
diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp
index b51589c14..ae6057995 100644
--- a/src/libs/installer/packagemanagergui.cpp
+++ b/src/libs/installer/packagemanagergui.cpp
@@ -1946,14 +1946,12 @@ public:
m_vlayout->addSpacing(50);
m_vlayout->addWidget(m_bspLabel);
-
m_progressBar = new QProgressBar();
m_progressBar->setRange(0, 0);
m_progressBar->hide();
m_vlayout->addWidget(m_progressBar);
m_progressBar->setObjectName(QLatin1String("CompressedInstallProgressBar"));
-
m_installCompressButton = new QPushButton;
connect(m_installCompressButton, &QAbstractButton::clicked,
this, &ComponentSelectionPage::Private::selectCompressedPackage);
@@ -2057,21 +2055,26 @@ public slots:
QSet<Repository> set;
foreach (QString fileName, fileNames) {
Repository repository = Repository::fromUserInput(fileName, true);
+ repository.setEnabled(true);
set.insert(repository);
}
if (set.count() > 0) {
m_progressBar->show();
- m_installCompressButton->setEnabled(false);
+ m_installCompressButton->hide();
QPushButton *const b = qobject_cast<QPushButton *>(q->gui()->button(QWizard::NextButton));
b->setEnabled(false);
m_core->settings().addTemporaryRepositories(set, false);
- m_core->fetchCompressedPackagesTree();
- updateTreeView();
+ if (!m_core->fetchCompressedPackagesTree()) {
+ setMessage(m_core->error());
+ }
+ else {
+ updateTreeView();
+ setMessage(ComponentSelectionPage::tr("To install new "\
+ "compressed repository, browse the repositories from your computer"));
+ }
m_progressBar->hide();
- m_bspLabel->setText(ComponentSelectionPage::tr("To install new "\
- "compressed repository, browse the repositories from your computer"));
- m_installCompressButton->setEnabled(true);
+ m_installCompressButton->show();
b->setEnabled(true);
}
}
@@ -2089,13 +2092,9 @@ public slots:
*/
void setMessage(const QString &msg)
{
- if (m_progressBar->isVisible()) {
+ QWizardPage *page = q->gui()->currentPage();
+ if (m_bspLabel && page && page->objectName() == QLatin1String("ComponentSelectionPage"))
m_bspLabel->setText(msg);
- }
- else {
- m_bspLabel->setText(ComponentSelectionPage::tr("To install new "\
- "compressed repository, browse the repositories from your computer"));
- }
}
void selectDefault()