From cc793a71634288014d5ada65e83380bcd6f1b529 Mon Sep 17 00:00:00 2001 From: kh1 Date: Mon, 23 Jan 2012 16:14:34 +0100 Subject: Fix I247cca06386eee0f1af084ac4c15a813e38c3f02. We need to update the repositories during fetch and restart afterwards. Thought we can't add them always, as otherwise we would restart again and again without fetching the actual meta data. Fully untested. Change-Id: I4420bfed56e060c67ce12cb684d422bcd0904bf3 Reviewed-by: Alexander Lenhardt --- .../libinstaller/getrepositoriesmetainfojob.cpp | 58 +++++++++------------- .../libinstaller/getrepositoriesmetainfojob.h | 19 +++---- .../libinstaller/getrepositorymetainfojob.cpp | 35 ++++++------- .../libinstaller/getrepositorymetainfojob.h | 9 ++-- .../libinstaller/packagemanagercore_p.cpp | 14 +----- 5 files changed, 52 insertions(+), 83 deletions(-) diff --git a/installerbuilder/libinstaller/getrepositoriesmetainfojob.cpp b/installerbuilder/libinstaller/getrepositoriesmetainfojob.cpp index c5df1d993..2a6b230c8 100644 --- a/installerbuilder/libinstaller/getrepositoriesmetainfojob.cpp +++ b/installerbuilder/libinstaller/getrepositoriesmetainfojob.cpp @@ -33,6 +33,7 @@ #include "getrepositoriesmetainfojob.h" #include "getrepositorymetainfojob.h" +#include "packagemanagercore_p.h" #include "qinstallerglobal.h" #include @@ -43,35 +44,16 @@ using namespace QInstaller; // -- GetRepositoriesMetaInfoJob -GetRepositoriesMetaInfoJob::GetRepositoriesMetaInfoJob(const QByteArray &publicKey, QObject *parent) - : KDJob(parent), - m_publicKey(publicKey), +GetRepositoriesMetaInfoJob::GetRepositoriesMetaInfoJob(PackageManagerCorePrivate *corePrivate) + : KDJob(corePrivate), m_canceled(false), m_silentRetries(3), - m_haveIgnoredError(false) + m_haveIgnoredError(false), + m_corePrivate(corePrivate) { setCapabilities(Cancelable); } -QSet GetRepositoriesMetaInfoJob::repositories() const -{ - return m_repositories; -} - -void GetRepositoriesMetaInfoJob::setRepositories(const QSet &repos) -{ - m_repositories = repos; - foreach (const Repository &repo, repos) { - if (repo.isEnabled()) - m_tmpRepositories += repo; - } -} - -QHash > GetRepositoriesMetaInfoJob::repositoryUpdates() const -{ - return m_repositoryUpdates; -} - QStringList GetRepositoriesMetaInfoJob::temporaryDirectories() const { return m_repositoryByTemporaryDirectory.keys(); @@ -111,7 +93,6 @@ void GetRepositoriesMetaInfoJob::reset() m_haveIgnoredError = false; m_repositories.clear(); - m_tmpRepositories.clear(); m_tempDirDeleter.releaseAndDeleteAll(); m_repositoryByTemporaryDirectory.clear(); @@ -129,6 +110,14 @@ bool GetRepositoriesMetaInfoJob::isCanceled() const void GetRepositoriesMetaInfoJob::doStart() { + if ((m_corePrivate->isInstaller() && !m_corePrivate->isOfflineOnly()) + || (m_corePrivate->isUpdater() || m_corePrivate->isPackageManager())) { + foreach (const Repository &repo, m_corePrivate->m_settings.repositories()) { + if (repo.isEnabled()) + m_repositories += repo; + } + } + fetchNextRepo(); } @@ -151,7 +140,7 @@ void GetRepositoriesMetaInfoJob::fetchNextRepo() return; } - if (m_tmpRepositories.isEmpty()) { + if (m_repositories.isEmpty()) { if (m_haveIgnoredError) emitFinishedWithError(QInstaller::UserIgnoreError, m_errorString); else @@ -159,12 +148,12 @@ void GetRepositoriesMetaInfoJob::fetchNextRepo() return; } - m_job = new GetRepositoryMetaInfoJob(m_publicKey, this); + m_job = new GetRepositoryMetaInfoJob(m_corePrivate, this); connect(m_job, SIGNAL(finished(KDJob*)), this, SLOT(jobFinished(KDJob*))); connect(m_job, SIGNAL(infoMessage(KDJob*, QString)), this, SIGNAL(infoMessage(KDJob*, QString))); m_job->setSilentRetries(silentRetries()); - m_job->setRepository(m_tmpRepositories.takeLast()); + m_job->setRepository(m_repositories.takeLast()); m_job->start(); } @@ -188,13 +177,6 @@ void GetRepositoriesMetaInfoJob::jobFinished(KDJob *j) return; } - if (job->error() == QInstaller::RepositoryUpdatesReceived) { - qDebug() << job->errorString(); - m_repositoryUpdates = job->repositoryUpdates(); - emitFinishedWithError(job->error(), job->errorString()); - return; - } - if (job->error() == QInstaller::UserIgnoreError) { m_haveIgnoredError = true; m_errorString = job->errorString(); @@ -203,5 +185,11 @@ void GetRepositoriesMetaInfoJob::jobFinished(KDJob *j) job->m_tempDirDeleter.passAndRelease(m_tempDirDeleter, tmpdir); m_repositoryByTemporaryDirectory.insert(tmpdir, job->repository()); } - QMetaObject::invokeMethod(this, "fetchNextRepo", Qt::QueuedConnection); + + if (job->error() == QInstaller::RepositoryUpdatesReceived) { + reset(); + QMetaObject::invokeMethod(this, "doStart", Qt::QueuedConnection); + } else { + QMetaObject::invokeMethod(this, "fetchNextRepo", Qt::QueuedConnection); + } } diff --git a/installerbuilder/libinstaller/getrepositoriesmetainfojob.h b/installerbuilder/libinstaller/getrepositoriesmetainfojob.h index cf6a3b645..e7b403100 100644 --- a/installerbuilder/libinstaller/getrepositoriesmetainfojob.h +++ b/installerbuilder/libinstaller/getrepositoriesmetainfojob.h @@ -45,17 +45,14 @@ namespace KDUpdater { namespace QInstaller { class GetRepositoryMetaInfoJob; +class PackageManagerCorePrivate; class INSTALLER_EXPORT GetRepositoriesMetaInfoJob : public KDJob { Q_OBJECT public: - explicit GetRepositoriesMetaInfoJob(const QByteArray &publicKey, QObject *parent = 0); - - QSet repositories() const; - void setRepositories(const QSet &repositories); - QHash > repositoryUpdates() const; + explicit GetRepositoriesMetaInfoJob(PackageManagerCorePrivate *corePrivate); QStringList temporaryDirectories() const; QStringList releaseTemporaryDirectories() const; @@ -77,18 +74,16 @@ private Q_SLOTS: void jobFinished(KDJob*); private: - QPointer m_job; - const QByteArray m_publicKey; bool m_canceled; int m_silentRetries; - QSet m_repositories; - QList m_tmpRepositories; - QHash m_repositoryByTemporaryDirectory; bool m_haveIgnoredError; + PackageManagerCorePrivate *m_corePrivate; + QString m_errorString; + QList m_repositories; mutable TempDirDeleter m_tempDirDeleter; - - QHash > m_repositoryUpdates; + QPointer m_job; + QHash m_repositoryByTemporaryDirectory; }; } // namespace QInstaller diff --git a/installerbuilder/libinstaller/getrepositorymetainfojob.cpp b/installerbuilder/libinstaller/getrepositorymetainfojob.cpp index 7ccf9eaf7..84d97c372 100644 --- a/installerbuilder/libinstaller/getrepositorymetainfojob.cpp +++ b/installerbuilder/libinstaller/getrepositorymetainfojob.cpp @@ -37,6 +37,7 @@ #include "cryptosignatureverifier.h" #include "lib7z_facade.h" #include "messageboxhandler.h" +#include "packagemanagercore_p.h" #include "qinstallerglobal.h" #include @@ -112,14 +113,15 @@ private: // -- GetRepositoryMetaInfoJob -GetRepositoryMetaInfoJob::GetRepositoryMetaInfoJob(const QByteArray &publicKey, QObject *parent) +GetRepositoryMetaInfoJob::GetRepositoryMetaInfoJob(PackageManagerCorePrivate *corePrivate, QObject *parent) : KDJob(parent), m_canceled(false), m_silentRetries(3), m_retriesLeft(m_silentRetries), - m_publicKey(publicKey), + m_publicKey(corePrivate->m_settings.publicKey()), m_downloader(0), - m_waitForDone(false) + m_waitForDone(false), + m_corePrivate(corePrivate) { setCapabilities(Cancelable); } @@ -151,11 +153,6 @@ void GetRepositoryMetaInfoJob::setSilentRetries(int retries) m_silentRetries = retries; } -QHash > GetRepositoryMetaInfoJob::repositoryUpdates() const -{ - return m_repositoryUpdates; -} - void GetRepositoryMetaInfoJob::doStart() { m_retriesLeft = m_silentRetries; @@ -284,11 +281,10 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished() emit infoMessage(this, tr("Parsing component meta information...")); const QDomElement root = doc.documentElement(); - - m_repositoryUpdates.clear(); // search for additional repositories that we might need to check const QDomNode repositoryUpdate = root.firstChildElement(QLatin1String("RepositoryUpdate")); if (!repositoryUpdate.isNull()) { + QHash > repositoryUpdates; const QDomNodeList children = repositoryUpdate.toElement().childNodes(); for (int i = 0; i < children.count(); ++i) { const QDomElement el = children.at(i).toElement(); @@ -299,13 +295,13 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished() Repository repository(el.attribute(QLatin1String("url")), true); repository.setUsername(el.attribute(QLatin1String("username"))); repository.setPassword(el.attribute(QLatin1String("password"))); - m_repositoryUpdates.insertMulti(action, qMakePair(repository, Repository())); + repositoryUpdates.insertMulti(action, qMakePair(repository, Repository())); - qDebug() << "Added new repository:" << repository.url().toString(); + qDebug() << "Repository to add:" << repository.url().toString(); } else if (action == QLatin1String("remove")) { // remove possible default repositories using the given server url Repository repository(el.attribute(QLatin1String("url")), true); - m_repositoryUpdates.insertMulti(action, qMakePair(repository, Repository())); + repositoryUpdates.insertMulti(action, qMakePair(repository, Repository())); qDebug() << "Repository to remove:" << repository.url().toString(); } else if (action == QLatin1String("replace")) { @@ -316,7 +312,7 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished() newRepository.setPassword(el.attribute(QLatin1String("password"))); // store the new repository and the one old it replaces - m_repositoryUpdates.insertMulti(action, qMakePair(newRepository, oldRepository)); + repositoryUpdates.insertMulti(action, qMakePair(newRepository, oldRepository)); qDebug() << "Replace repository:" << oldRepository.url().toString() << "with:" << newRepository.url().toString(); } else { @@ -326,9 +322,14 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished() } } - if (!m_repositoryUpdates.isEmpty()) { - finished(QInstaller::RepositoryUpdatesReceived, tr("Repository updates received.")); - return; + if (!repositoryUpdates.isEmpty()) { + if (m_corePrivate->m_settings.updateDefaultRepositories(repositoryUpdates) + == Settings::UpdatesApplied) { + if (m_corePrivate->isUpdater() || m_corePrivate->isPackageManager()) + m_corePrivate->writeMaintenanceConfigFiles(); + finished(QInstaller::RepositoryUpdatesReceived, tr("Repository updates received.")); + return; + } } } diff --git a/installerbuilder/libinstaller/getrepositorymetainfojob.h b/installerbuilder/libinstaller/getrepositorymetainfojob.h index 75f8794fd..64467887d 100644 --- a/installerbuilder/libinstaller/getrepositorymetainfojob.h +++ b/installerbuilder/libinstaller/getrepositorymetainfojob.h @@ -28,7 +28,6 @@ #include -#include #include #include #include @@ -46,6 +45,7 @@ namespace KDUpdater { namespace QInstaller { class GetRepositoriesMetaInfoJob; +class PackageManagerCorePrivate; class INSTALLER_EXPORT GetRepositoryMetaInfoJob : public KDJob { @@ -54,7 +54,7 @@ class INSTALLER_EXPORT GetRepositoryMetaInfoJob : public KDJob friend class QInstaller::GetRepositoriesMetaInfoJob; public: - explicit GetRepositoryMetaInfoJob(const QByteArray &publicKey = QByteArray(), QObject *parent = 0); + explicit GetRepositoryMetaInfoJob(PackageManagerCorePrivate *corePrivate, QObject *parent = 0); ~GetRepositoryMetaInfoJob(); Repository repository() const; @@ -66,8 +66,6 @@ public: QString temporaryDirectory() const; QString releaseTemporaryDirectory() const; - QHash > repositoryUpdates() const; - private: /* reimp */ void doStart(); /* reimp */ void doCancel(); @@ -103,8 +101,7 @@ private: bool m_waitForDone; QThreadPool m_threadPool; - - QHash > m_repositoryUpdates; + PackageManagerCorePrivate *m_corePrivate; }; } // namespace QInstaller diff --git a/installerbuilder/libinstaller/packagemanagercore_p.cpp b/installerbuilder/libinstaller/packagemanagercore_p.cpp index 6232de7a8..928c2363e 100644 --- a/installerbuilder/libinstaller/packagemanagercore_p.cpp +++ b/installerbuilder/libinstaller/packagemanagercore_p.cpp @@ -598,7 +598,7 @@ void PackageManagerCorePrivate::initialize() } if (!m_repoMetaInfoJob) { - m_repoMetaInfoJob = new GetRepositoriesMetaInfoJob(m_settings.publicKey(), this); + m_repoMetaInfoJob = new GetRepositoriesMetaInfoJob(this); m_repoMetaInfoJob->setAutoDelete(false); connect(m_repoMetaInfoJob, SIGNAL(infoMessage(KDJob*, QString)), this, SLOT(infoMessage(KDJob*, QString))); @@ -2032,9 +2032,6 @@ bool PackageManagerCorePrivate::fetchMetaInformationFromRepositories() m_updateSourcesAdded = false; m_repoMetaInfoJob->reset(); - if ((isInstaller() && !m_core->isOfflineOnly()) || (isUpdater() || isPackageManager())) - m_repoMetaInfoJob->setRepositories(m_settings.repositories()); - try { m_repoMetaInfoJob->start(); m_repoMetaInfoJob->waitForFinished(); @@ -2047,15 +2044,6 @@ bool PackageManagerCorePrivate::fetchMetaInformationFromRepositories() switch (m_repoMetaInfoJob->error()) { case QInstaller::UserIgnoreError: break; // we can simply ignore this error, the user knows about it - - case QInstaller::RepositoryUpdatesReceived: - if (m_settings.updateDefaultRepositories(m_repoMetaInfoJob->repositoryUpdates()) - == Settings::UpdatesApplied) { - fetchMetaInformationFromRepositories(); // start over, we might have complete new repos - return m_repoFetched; - } - break; - default: setStatus(PackageManagerCore::Failure, m_repoMetaInfoJob->errorString()); return m_repoFetched; -- cgit v1.2.3