summaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/installer/componentselectionpage_p.cpp29
-rw-r--r--src/libs/installer/componentselectionpage_p.h2
-rw-r--r--src/libs/installer/metadatajob.cpp33
-rw-r--r--src/libs/installer/packagemanagercore.cpp22
-rw-r--r--src/libs/installer/packagemanagercore.h3
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp4
-rw-r--r--src/libs/installer/packagemanagercore_p.h1
-rw-r--r--src/libs/installer/packagemanagergui.cpp4
-rw-r--r--src/libs/installer/repository.cpp18
-rw-r--r--src/libs/installer/repository.h6
-rw-r--r--src/libs/installer/settings.cpp4
-rw-r--r--src/libs/kdtools/updatefinder.cpp10
12 files changed, 100 insertions, 36 deletions
diff --git a/src/libs/installer/componentselectionpage_p.cpp b/src/libs/installer/componentselectionpage_p.cpp
index 4e7acc837..88ea86b8a 100644
--- a/src/libs/installer/componentselectionpage_p.cpp
+++ b/src/libs/installer/componentselectionpage_p.cpp
@@ -37,6 +37,7 @@
#include <QTreeView>
#include <QLabel>
+#include <QScrollArea>
#include <QPushButton>
#include <QGroupBox>
#include <QProgressBar>
@@ -69,17 +70,24 @@ ComponentSelectionPagePrivate::ComponentSelectionPagePrivate(ComponentSelectionP
m_descriptionVLayout = new QVBoxLayout;
m_descriptionVLayout->setObjectName(QLatin1String("DescriptionLayout"));
+ m_descriptionScrollArea = new QScrollArea(q);
+ m_descriptionScrollArea->setWidgetResizable(true);
+ m_descriptionScrollArea->setFrameShape(QFrame::NoFrame);
+ m_descriptionScrollArea->setObjectName(QLatin1String("DescriptionScrollArea"));
+
m_descriptionLabel = new QLabel(q);
m_descriptionLabel->setWordWrap(true);
+ m_descriptionLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
+ m_descriptionLabel->setOpenExternalLinks(true);
m_descriptionLabel->setObjectName(QLatin1String("ComponentDescriptionLabel"));
- m_descriptionVLayout->addWidget(m_descriptionLabel);
+ m_descriptionLabel->setAlignment(Qt::AlignTop);
+ m_descriptionScrollArea->setWidget(m_descriptionLabel);
+ m_descriptionVLayout->addWidget(m_descriptionScrollArea);
m_sizeLabel = new QLabel(q);
m_sizeLabel->setWordWrap(true);
m_sizeLabel->setObjectName(QLatin1String("ComponentSizeLabel"));
m_descriptionVLayout->addWidget(m_sizeLabel);
- m_descriptionVLayout->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::MinimumExpanding,
- QSizePolicy::MinimumExpanding));
m_treeViewVLayout = new QVBoxLayout;
m_treeViewVLayout->setObjectName(QLatin1String("TreeviewLayout"));
@@ -193,7 +201,7 @@ void ComponentSelectionPagePrivate::setupCategoryLayout()
m_categoryGroupBox->setTitle(m_core->settings().repositoryCategoryDisplayName());
m_categoryGroupBox->setObjectName(QLatin1String("CategoryGroupBox"));
QVBoxLayout *categoryLayout = new QVBoxLayout(m_categoryGroupBox);
- QPushButton *fetchCategoryButton = new QPushButton(tr("Refresh"));
+ QPushButton *fetchCategoryButton = new QPushButton(tr("Filter"));
fetchCategoryButton->setObjectName(QLatin1String("FetchCategoryButton"));
connect(fetchCategoryButton, &QPushButton::clicked, this,
&ComponentSelectionPagePrivate::fetchRepositoryCategories);
@@ -208,9 +216,9 @@ void ComponentSelectionPagePrivate::setupCategoryLayout()
checkBox->setToolTip(repository.tooltip());
categoryLayout->addWidget(checkBox);
}
+ categoryLayout->addWidget(fetchCategoryButton);
vLayout->addWidget(m_categoryGroupBox);
- vLayout->addWidget(fetchCategoryButton);
vLayout->addStretch();
m_mainHLayout->insertWidget(0, m_categoryWidget);
}
@@ -290,8 +298,15 @@ void ComponentSelectionPagePrivate::currentSelectedChanged(const QModelIndex &cu
return;
m_sizeLabel->setText(QString());
- m_descriptionLabel->setText(m_currentModel->data(m_currentModel->index(current.row(),
- ComponentModelHelper::NameColumn, current.parent()), Qt::ToolTipRole).toString());
+
+ QString description = m_currentModel->data(m_currentModel->index(current.row(),
+ ComponentModelHelper::NameColumn, current.parent()), Qt::ToolTipRole).toString();
+
+ // replace {external-link}='' fields in component description with proper link tags
+ description.replace(QRegularExpression(QLatin1String("{external-link}='(.*?)'")),
+ QLatin1String("<a href=\"\\1\"><span style=\"color:#17a81a;\">\\1</span></a>"));
+
+ m_descriptionLabel->setText(description);
Component *component = m_currentModel->componentFromIndex(current);
if ((m_core->isUninstaller()) || (!component))
diff --git a/src/libs/installer/componentselectionpage_p.h b/src/libs/installer/componentselectionpage_p.h
index 9ebec834a..6169a06f5 100644
--- a/src/libs/installer/componentselectionpage_p.h
+++ b/src/libs/installer/componentselectionpage_p.h
@@ -37,6 +37,7 @@
class QTreeView;
class QLabel;
+class QScrollArea;
class QPushButton;
class QGroupBox;
class QListWidgetItem;
@@ -87,6 +88,7 @@ private:
PackageManagerCore *m_core;
QTreeView *m_treeView;
QLabel *m_sizeLabel;
+ QScrollArea *m_descriptionScrollArea;
QLabel *m_descriptionLabel;
QVBoxLayout *m_descriptionVLayout;
QPushButton *m_checkAll;
diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp
index 3beda7ef2..c69fda3d0 100644
--- a/src/libs/installer/metadatajob.cpp
+++ b/src/libs/installer/metadatajob.cpp
@@ -619,13 +619,25 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re
}
}
}
- if (metadata.repository.archivename().isEmpty()) {
+ if (metadata.repository.categoryname().isEmpty()) {
m_metaFromDefaultRepositories.insert(metadata.directory, metadata);
} else {
//Hash metadata to help checking if meta for repository is already fetched
ArchiveMetadata archiveMetadata;
archiveMetadata.metaData = metadata;
- m_fetchedArchive.insertMulti(metadata.repository.archivename(), archiveMetadata);
+ m_fetchedArchive.insertMulti(metadata.repository.categoryname(), archiveMetadata);
+
+ //Check if other categories have the same url (contains same metadata)
+ //so we can speed up other category fetches
+ foreach (RepositoryCategory category, m_core->settings().repositoryCategories()) {
+ if (category.displayname() != metadata.repository.categoryname()) {
+ foreach (Repository repository, category.repositories()) {
+ if (repository.url() == metadata.repository.url()) {
+ m_fetchedArchive.insertMulti(category.displayname(), archiveMetadata);
+ }
+ }
+ }
+ }
// Hash for faster lookups
m_metaFromArchive.insert(metadata.directory, metadata);
}
@@ -732,11 +744,20 @@ QSet<Repository> MetadataJob::getRepositories()
// If repository is already fetched, do not fetch it again.
// In updater mode, fetch always all archive repositories to get updates
foreach (RepositoryCategory repositoryCategory, m_core->settings().repositoryCategories()) {
- if (m_core->isUpdater() || (repositoryCategory.isEnabled() && !m_fetchedArchive.contains(repositoryCategory.displayname()))) {
- foreach (Repository repository, repositoryCategory.repositories()) {
- repositories.insert(repository);
+ if (m_core->isUpdater() || (repositoryCategory.isEnabled())) {
+ foreach (Repository repository, repositoryCategory.repositories()) {
+ QHashIterator<QString, ArchiveMetadata> i(m_fetchedArchive);
+ bool fetch = true;
+ while (i.hasNext()) {
+ i.next();
+ ArchiveMetadata metaData = i.value();
+ if (repository.url() == metaData.metaData.repository.url())
+ fetch = false;
+ }
+ if (fetch)
+ repositories.insert(repository);
+ }
}
- }
}
return repositories;
}
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp
index 78198156e..4a7f42621 100644
--- a/src/libs/installer/packagemanagercore.cpp
+++ b/src/libs/installer/packagemanagercore.cpp
@@ -665,6 +665,22 @@ int PackageManagerCore::downloadNeededArchives(double partProgressSize)
}
/*!
+ Returns \c true if essential component update is found.
+*/
+bool PackageManagerCore::foundEssentialUpdate() const
+{
+ return d->m_foundEssentialUpdate;
+}
+
+/*!
+ Sets the value of \a foundEssentialUpdate, defaults \c true.
+*/
+void PackageManagerCore::setFoundEssentialUpdate(bool foundEssentialUpdate)
+{
+ d->m_foundEssentialUpdate = foundEssentialUpdate;
+}
+
+/*!
Returns \c true if a hard restart of the application is requested.
*/
bool PackageManagerCore::needsHardRestart() const
@@ -2733,7 +2749,7 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const
data.components = &components;
data.installedPackages = &locals;
- bool foundEssentialUpdate = false;
+ setFoundEssentialUpdate(false);
LocalPackagesHash installedPackages = locals;
QStringList replaceMes;
@@ -2789,7 +2805,7 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const
continue;
if (update->data(scEssential, scFalse).toString().toLower() == scTrue)
- foundEssentialUpdate = true;
+ setFoundEssentialUpdate(true);
// this is not a dependency, it is a real update
components.insert(name, d->m_updaterComponentsDeps.takeLast());
@@ -2840,7 +2856,7 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const
}
}
- if (foundEssentialUpdate) {
+ if (foundEssentialUpdate()) {
foreach (QInstaller::Component *component, components) {
if (d->statusCanceledOrFailed())
return false;
diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h
index 9f8d1a304..4fa2f2554 100644
--- a/src/libs/installer/packagemanagercore.h
+++ b/src/libs/installer/packagemanagercore.h
@@ -266,6 +266,9 @@ public:
int downloadNeededArchives(double partProgressSize);
+ bool foundEssentialUpdate() const;
+ void setFoundEssentialUpdate(bool foundEssentialUpdate = true);
+
bool needsHardRestart() const;
void setNeedsHardRestart(bool needsHardRestart = true);
bool finishedWithSuccess() const;
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp
index c67480737..29c3fb03a 100644
--- a/src/libs/installer/packagemanagercore_p.cpp
+++ b/src/libs/installer/packagemanagercore_p.cpp
@@ -1336,7 +1336,11 @@ void PackageManagerCorePrivate::writeMaintenanceTool(OperationList performedOper
newBinaryWritten = true;
QFile tmp(binaryName);
QInstaller::openForRead(&tmp);
+#ifdef Q_OS_OSX
writeMaintenanceToolBinary(&tmp, tmp.size(), true);
+#else
+ writeMaintenanceToolBinary(&tmp, layout.endOfBinaryContent - layout.binaryContentSize, true);
+#endif
}
}
diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h
index 21ab3fc40..e0817c573 100644
--- a/src/libs/installer/packagemanagercore_p.h
+++ b/src/libs/installer/packagemanagercore_p.h
@@ -247,6 +247,7 @@ private:
bool m_updateSourcesAdded;
qint64 m_magicBinaryMarker;
bool m_componentsToInstallCalculated;
+ bool m_foundEssentialUpdate;
mutable ScriptEngine *m_componentScriptEngine;
mutable ScriptEngine *m_controlScriptEngine;
diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp
index a053e9bff..db1b99d3f 100644
--- a/src/libs/installer/packagemanagergui.cpp
+++ b/src/libs/installer/packagemanagergui.cpp
@@ -1898,7 +1898,8 @@ void ComponentSelectionPage::entering()
QT_TR_NOOP("Please select the components you want to update."),
QT_TR_NOOP("Please select the components you want to install."),
QT_TR_NOOP("Please select the components you want to uninstall."),
- QT_TR_NOOP("Select the components to install. Deselect installed components to uninstall them. Any components already installed will not be updated.")
+ QT_TR_NOOP("Select the components to install. Deselect installed components to uninstall them. Any components already installed will not be updated."),
+ QT_TR_NOOP("Mandatory components need to be updated first before you can select other components to update.")
};
int index = 0;
@@ -1906,6 +1907,7 @@ void ComponentSelectionPage::entering()
if (core->isInstaller()) index = 1;
if (core->isUninstaller()) index = 2;
if (core->isPackageManager()) index = 3;
+ if (core->foundEssentialUpdate() && core->isUpdater()) index = 4;
setColoredSubTitle(tr(strings[index]));
d->updateTreeView();
diff --git a/src/libs/installer/repository.cpp b/src/libs/installer/repository.cpp
index 5e31d81e2..a165b8617 100644
--- a/src/libs/installer/repository.cpp
+++ b/src/libs/installer/repository.cpp
@@ -57,7 +57,7 @@ Repository::Repository(const Repository &other)
, m_password(other.m_password)
, m_displayname(other.m_displayname)
, m_compressed(other.m_compressed)
- , m_archivename(other.m_archivename)
+ , m_categoryname(other.m_categoryname)
{
registerMetaType();
}
@@ -202,17 +202,17 @@ void Repository::setDisplayName(const QString &displayname)
/*!
Returns the archive name if the repository belongs to an archive.
*/
-QString Repository::archivename() const
+QString Repository::categoryname() const
{
- return m_archivename;
+ return m_categoryname;
}
/*!
- Sets the archive name to \a archivename if the repository belongs to an archive.
+ Sets the category name to \a categoryname if the repository belongs to an category.
*/
-void Repository::setArchiveName(const QString &archivename)
+void Repository::setCategoryName(const QString &categoryname)
{
- m_archivename = archivename;
+ m_categoryname = categoryname;
}
/*!
@@ -265,7 +265,7 @@ const Repository &Repository::operator=(const Repository &other)
m_password = other.m_password;
m_displayname = other.m_displayname;
m_compressed = other.m_compressed;
- m_archivename = other.m_archivename;
+ m_categoryname = other.m_categoryname;
return *this;
}
@@ -280,7 +280,7 @@ QDataStream &operator>>(QDataStream &istream, Repository &repository)
{
QByteArray url, username, password, displayname, compressed;
istream >> url >> repository.m_default >> repository.m_enabled >> username >> password
- >> displayname >> repository.m_archivename;
+ >> displayname >> repository.m_categoryname;
repository.setUrl(QUrl::fromEncoded(QByteArray::fromBase64(url)));
repository.setUsername(QString::fromUtf8(QByteArray::fromBase64(username)));
repository.setPassword(QString::fromUtf8(QByteArray::fromBase64(password)));
@@ -292,7 +292,7 @@ QDataStream &operator<<(QDataStream &ostream, const Repository &repository)
{
return ostream << repository.m_url.toEncoded().toBase64() << repository.m_default << repository.m_enabled
<< repository.m_username.toUtf8().toBase64() << repository.m_password.toUtf8().toBase64()
- << repository.m_displayname.toUtf8().toBase64() << repository.m_archivename.toUtf8().toBase64();
+ << repository.m_displayname.toUtf8().toBase64() << repository.m_categoryname.toUtf8().toBase64();
}
}
diff --git a/src/libs/installer/repository.h b/src/libs/installer/repository.h
index 83393ead9..546cddc97 100644
--- a/src/libs/installer/repository.h
+++ b/src/libs/installer/repository.h
@@ -64,8 +64,8 @@ public:
QString displayname() const;
void setDisplayName(const QString &displayname);
- QString archivename() const;
- void setArchiveName(const QString &archivename);
+ QString categoryname() const;
+ void setCategoryName(const QString &categoryname);
bool isCompressed() const;
void setCompressed(bool compressed);
@@ -85,7 +85,7 @@ private:
QString m_username;
QString m_password;
QString m_displayname;
- QString m_archivename;
+ QString m_categoryname;
bool m_compressed;
};
diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp
index 13eb2ce40..e0c9a3970 100644
--- a/src/libs/installer/settings.cpp
+++ b/src/libs/installer/settings.cpp
@@ -168,7 +168,7 @@ static QSet<Repository> readRepositories(QXmlStreamReader &reader, bool isDefaul
}
}
if (displayName && !displayName->isEmpty())
- repo.setArchiveName(*displayName);
+ repo.setCategoryName(*displayName);
set.insert(repo);
} else if (reader.name() == QLatin1String("Tooltip")) {
*tooltip = reader.readElementText();
@@ -832,7 +832,7 @@ void Settings::setSaveDefaultRepositories(bool save)
QString Settings::repositoryCategoryDisplayName() const
{
QString displayName = d->m_data.value(QLatin1String(scRepositoryCategoryDisplayName)).toString();
- return displayName.isEmpty() ? tr("Show package categories") : displayName;
+ return displayName.isEmpty() ? tr("Select Package Categories") : displayName;
}
void Settings::setRepositoryCategoryDisplayName(const QString& name)
diff --git a/src/libs/kdtools/updatefinder.cpp b/src/libs/kdtools/updatefinder.cpp
index b64f922c3..b12ffac99 100644
--- a/src/libs/kdtools/updatefinder.cpp
+++ b/src/libs/kdtools/updatefinder.cpp
@@ -1,7 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
-** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the Qt Installer Framework.
@@ -601,18 +601,18 @@ int KDUpdater::compareVersion(const QString &v1, const QString &v2)
bool v2_ok = false;
if (index == v1_comps.count() && index < v2_comps.count()) {
- v2_comps.at(index).toInt(&v2_ok);
+ v2_comps.at(index).toLongLong(&v2_ok);
return v2_ok ? -1 : +1;
}
if (index < v1_comps.count() && index == v2_comps.count()) {
- v1_comps.at(index).toInt(&v1_ok);
+ v1_comps.at(index).toLongLong(&v1_ok);
return v1_ok ? +1 : -1;
}
if (index >= v1_comps.count() || index >= v2_comps.count())
break;
- int v1_comp = v1_comps.at(index).toInt(&v1_ok);
- int v2_comp = v2_comps.at(index).toInt(&v2_ok);
+ qlonglong v1_comp = v1_comps.at(index).toLongLong(&v1_ok);
+ qlonglong v2_comp = v2_comps.at(index).toLongLong(&v2_ok);
if (!v1_ok) {
if (v1_comps.at(index) == QLatin1String("x"))