From c573ce94e92b603f26a31451943920b830514a8b Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Mon, 24 Aug 2020 10:28:38 +0000 Subject: Revert "Modify repository category functionality" This reverts commit 99cbbd439ea1f572b4242d77035b0da3a27c79ec. Reason for revert: The speed benefit gained by converting existing online repositories to use unified metadata does not offset the penalty of fetching all categorized repositories. This is especially bad on Windows where install script evaluation takes long time. Change-Id: I03f4ab41f21e139b40c82baf741b2459966d6d43 Reviewed-by: Katja Marttila --- src/libs/installer/componentselectionpage_p.cpp | 65 +++++++++---------------- src/libs/installer/componentselectionpage_p.h | 5 +- src/libs/installer/metadatajob.cpp | 32 ++++++------ src/libs/installer/repositorycategory.cpp | 14 +----- src/libs/installer/repositorycategory.h | 4 +- src/libs/installer/settings.cpp | 10 ---- src/libs/installer/settings.h | 1 - 7 files changed, 46 insertions(+), 85 deletions(-) (limited to 'src') diff --git a/src/libs/installer/componentselectionpage_p.cpp b/src/libs/installer/componentselectionpage_p.cpp index d0603844c..cb8f321d0 100644 --- a/src/libs/installer/componentselectionpage_p.cpp +++ b/src/libs/installer/componentselectionpage_p.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -216,24 +216,26 @@ 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("Filter")); + fetchCategoryButton->setObjectName(QLatin1String("FetchCategoryButton")); + connect(fetchCategoryButton, &QPushButton::clicked, this, + &ComponentSelectionPagePrivate::fetchRepositoryCategories); foreach (RepositoryCategory repository, m_core->settings().organizedRepositoryCategories()) { QCheckBox *checkBox = new QCheckBox; checkBox->setObjectName(repository.displayname()); checkBox->setChecked(repository.isEnabled()); connect(checkBox, &QCheckBox::stateChanged, this, - &ComponentSelectionPagePrivate::updateRepositoryCategories, Qt::QueuedConnection); + &ComponentSelectionPagePrivate::checkboxStateChanged); checkBox->setText(repository.displayname()); checkBox->setToolTip(repository.tooltip()); categoryLayout->addWidget(checkBox); } + categoryLayout->addWidget(fetchCategoryButton); vLayout->addWidget(m_categoryGroupBox); vLayout->addStretch(); m_mainGLayout->addWidget(m_categoryWidget, 1, 0); - - // Apply default enabled categories as initial component filters - QMetaObject::invokeMethod(this, "updateRepositoryCategories", Qt::QueuedConnection); } void ComponentSelectionPagePrivate::showCategoryLayout(bool show) @@ -342,6 +344,18 @@ void ComponentSelectionPagePrivate::deselectAll() m_currentModel->setCheckedState(ComponentModel::AllUnchecked); } +void ComponentSelectionPagePrivate::checkboxStateChanged() +{ + QList checkboxes = m_categoryGroupBox->findChildren(); + bool enableFetchButton = false; + foreach (QCheckBox *checkbox, checkboxes) { + if (checkbox->isChecked()) { + enableFetchButton = true; + break; + } + } +} + void ComponentSelectionPagePrivate::enableRepositoryCategory(const QString &repositoryName, bool enable) { QMap organizedRepositoryCategories = m_core->settings().organizedRepositoryCategories(); @@ -379,7 +393,7 @@ void ComponentSelectionPagePrivate::updateWidgetVisibility(bool show) #endif } -void ComponentSelectionPagePrivate::updateRepositoryCategories() +void ComponentSelectionPagePrivate::fetchRepositoryCategories() { updateWidgetVisibility(true); @@ -390,43 +404,10 @@ void ComponentSelectionPagePrivate::updateRepositoryCategories() enableRepositoryCategory(checkbox->objectName(), checkbox->isChecked()); } - // < name, visible > - QHash componentVisibleHash; - // Prepare a QHash dictionary for repository urls, so we don't have to get - // copies of Repository objects later by value when iterating over categories. - const QHash > repoUrlsForCategories = m_core->settings().repositoryUrlsForCategories(); - const QSet repoCategories = m_core->settings().repositoryCategories(); - const QList components = m_core->components(PackageManagerCore::ComponentType::All); - foreach (const Component *component, components) { - bool hasRepoCategory = false; - bool hasEnabledCategory = false; - - foreach (const RepositoryCategory &repoCategory, repoCategories) { - const QSet repoUrls = repoUrlsForCategories.value(repoCategory.displayname()); - foreach (const QUrl &url, repoUrls) { - if (component->repositoryUrl() == url) { - hasRepoCategory = true; - hasEnabledCategory = repoCategory.isEnabled(); - break; - } - } - if (hasEnabledCategory) - break; - } - const QString componentName = component->name(); - const QModelIndex &idx = m_currentModel->indexFromComponentName(componentName); - if (idx.isValid()) { - // Same component name can appear in multiple repositories, only one enabled - // category or non-categorized repo is required to show the component in view. - if (componentVisibleHash.value(componentName)) - continue; - - const bool show = (!hasRepoCategory || hasEnabledCategory); - m_treeView->setRowHidden(idx.row(), idx.parent(), !show); - componentVisibleHash.insert(componentName, show); - } + if (!m_core->fetchRemotePackagesTree()) { + MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(), + QLatin1String("FailToFetchPackages"), tr("Error"), m_core->error()); } - updateWidgetVisibility(false); } diff --git a/src/libs/installer/componentselectionpage_p.h b/src/libs/installer/componentselectionpage_p.h index 0ed00152e..bce13246b 100644 --- a/src/libs/installer/componentselectionpage_p.h +++ b/src/libs/installer/componentselectionpage_p.h @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -74,9 +74,10 @@ public slots: void currentSelectedChanged(const QModelIndex ¤t); void selectAll(); void deselectAll(); + void checkboxStateChanged(); void enableRepositoryCategory(const QString &repositoryName, bool enable); void updateWidgetVisibility(bool show); - void updateRepositoryCategories(); + void fetchRepositoryCategories(); void customButtonClicked(int which); void onProgressChanged(int progress); void setMessage(const QString &msg); diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp index 1f375f56b..55379c358 100644 --- a/src/libs/installer/metadatajob.cpp +++ b/src/libs/installer/metadatajob.cpp @@ -88,9 +88,11 @@ QList MetadataJob::metadata() const { QList metadata = m_metaFromDefaultRepositories.values(); foreach (RepositoryCategory repositoryCategory, m_core->settings().repositoryCategories()) { - QList archiveMetaList = m_fetchedArchive.values(repositoryCategory.displayname()); - foreach (ArchiveMetadata archiveMeta, archiveMetaList) { - metadata.append(archiveMeta.metaData); + if (m_core->isUpdater() || (repositoryCategory.isEnabled() && m_fetchedArchive.contains(repositoryCategory.displayname()))) { + QList archiveMetaList = m_fetchedArchive.values(repositoryCategory.displayname()); + foreach (ArchiveMetadata archiveMeta, archiveMetaList) { + metadata.append(archiveMeta.metaData); + } } } return metadata; @@ -688,18 +690,20 @@ QSet 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()) { - foreach (Repository repository, repositoryCategory.repositories()) { - QHashIterator 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 (m_core->isUpdater() || (repositoryCategory.isEnabled())) { + foreach (Repository repository, repositoryCategory.repositories()) { + QHashIterator 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); + } } - if (fetch) - repositories.insert(repository); - } } return repositories; } diff --git a/src/libs/installer/repositorycategory.cpp b/src/libs/installer/repositorycategory.cpp index d1a51e8b0..79b1cc6a8 100644 --- a/src/libs/installer/repositorycategory.cpp +++ b/src/libs/installer/repositorycategory.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -112,18 +112,6 @@ QSet RepositoryCategory::repositories() const return variantListToSet(m_data.values(scRepositories)); } -/*! - Returns the list of repository URLs the category has. -*/ -QSet RepositoryCategory::repositoryUrls() const -{ - QSet repositoryUrls; - foreach (const Repository &repository, repositories()) - repositoryUrls.insert(repository.url()); - - return repositoryUrls; -} - /*! Inserts a set of \a repositories to the category. Removes old \a repositories if \a replace is set to \c true. diff --git a/src/libs/installer/repositorycategory.h b/src/libs/installer/repositorycategory.h index 0f950d577..faa8d252b 100644 --- a/src/libs/installer/repositorycategory.h +++ b/src/libs/installer/repositorycategory.h @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -54,8 +54,6 @@ public: void setTooltip(const QString &tooltip); QSet repositories() const; - QSet repositoryUrls() const; - void setRepositories(const QSet repositories, const bool replace = false); void addRepository(const Repository repository); diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp index a8c0eece3..347449dcc 100644 --- a/src/libs/installer/settings.cpp +++ b/src/libs/installer/settings.cpp @@ -641,16 +641,6 @@ QMap Settings::organizedRepositoryCategories() cons return map; } -QHash > Settings::repositoryUrlsForCategories() const -{ - // < category displayname, repo urls > - QHash > repoUrlsForCategories; - foreach (const RepositoryCategory &repoCategory, repositoryCategories()) - repoUrlsForCategories.insert(repoCategory.displayname(), repoCategory.repositoryUrls()); - - return repoUrlsForCategories; -} - void Settings::setDefaultRepositories(const QSet &repositories) { d->m_data.remove(scRepositories); diff --git a/src/libs/installer/settings.h b/src/libs/installer/settings.h index 1e372d1f3..6927c54a0 100644 --- a/src/libs/installer/settings.h +++ b/src/libs/installer/settings.h @@ -124,7 +124,6 @@ public: QSet repositoryCategories() const; QMap organizedRepositoryCategories() const; - QHash > repositoryUrlsForCategories() const; void setRepositoryCategories(const QSet &repositories); void addRepositoryCategories(const QSet &repositories); Settings::Update updateRepositoryCategories(const RepoHash &updates); -- cgit v1.2.3