From b31674d809a71bf17bb621c74e5ba7b3df3cd80a Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Mon, 15 Aug 2022 14:21:36 +0200 Subject: [PATCH] Add view modes "Removable" and "Unneeded" These views show user picked or automatically installed packages which could be safely removed. --- PickView.cc | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++- PickView.h | 2 ++ res/en/res.rc | 12 +++++++++++- res/fr/res.rc | 4 ++++ resource.h | 2 ++ 5 files changed, 71 insertions(+), 2 deletions(-) diff --git a/PickView.cc b/PickView.cc index c961b9f..7d60d8a 100644 --- a/PickView.cc +++ b/PickView.cc @@ -17,6 +17,7 @@ #include "PickPackageLine.h" #include "PickCategoryLine.h" #include +#include #include #include @@ -28,6 +29,39 @@ #include "LogSingleton.h" #include "Exception.h" +// Scan desired packages and collect the names of packages which provide the +// dependencies of other desired packages or are member of category "Base". +static void FindNeededPackages (const packagedb & db, std::set & needed) +{ + std::map providedBy; + for (const auto & p : db.packages) + { + const packagemeta & pkg = *p.second; + if (!pkg.isBinary ()) + continue; + if (!pkg.desired) + continue; + for (const PackageSpecification *s : pkg.desired.provides ()) + providedBy.insert ({s->packageName (), pkg.name}); + } + for (const auto & p : db.packages) + { + const packagemeta & pkg = *p.second; + if (!pkg.isBinary ()) + continue; + if (pkg.categories.count ("Base")) + needed.insert (pkg.name); + if (!pkg.desired) + continue; + for (const PackageSpecification *s : pkg.desired.depends ()) { + const auto i = providedBy.find (s->packageName ()); + if (i == providedBy.end ()) + continue; + needed.insert (i->second); + } + } +} + void PickView::setViewMode (views mode) { @@ -47,6 +81,11 @@ PickView::setViewMode (views mode) } else { + std::set needed; + if (view_mode == PickView::views::PackageRemovable + || view_mode == PickView::views::PackageUnneeded) + FindNeededPackages (db, needed); + // iterate through every package for (packagedb::packagecollection::iterator i = db.packages.begin (); i != db.packages.end (); ++i) @@ -77,7 +116,15 @@ PickView::setViewMode (views mode) // "UserPick" : installed packages that were picked by user || (view_mode == PickView::views::PackageUserPicked && - (pkg.installed && pkg.user_picked))) + (pkg.installed && pkg.user_picked)) + + // "Removable" : user picked packages that could be safely removed + || (view_mode == PickView::views::PackageRemovable && + (pkg.installed && pkg.user_picked && !needed.count (pkg.name))) + + // "Unneeded" : auto installed packages that could be safely removed + || (view_mode == PickView::views::PackageUnneeded && + (pkg.installed && !pkg.user_picked && !needed.count (pkg.name)))) { // Filter by package name if (packageFilterString.empty () @@ -111,6 +158,10 @@ PickView::mode_caption (views mode) return IDS_VIEW_NOTINSTALLED; case views::PackageUserPicked: return IDS_VIEW_PICKED; + case views::PackageRemovable: + return IDS_VIEW_REMOVABLE; + case views::PackageUnneeded: + return IDS_VIEW_UNNEEDED; case views::Category: return IDS_VIEW_CATEGORY; default: diff --git a/PickView.h b/PickView.h index 1e14a74..4833414 100644 --- a/PickView.h +++ b/PickView.h @@ -36,6 +36,8 @@ public: PackageKeeps, PackageSkips, PackageUserPicked, + PackageRemovable, + PackageUnneeded, Category, }; diff --git a/res/en/res.rc b/res/en/res.rc index 644b252..fc61e59 100644 --- a/res/en/res.rc +++ b/res/en/res.rc @@ -537,7 +537,15 @@ BEGIN "and haven't been selected for installation.\n" "\n" "Picked: Show installed packages that were selected, not installed " - "as a dependency." + "as a dependency.\n" + "\n" + "Removable: Show installed packages that were selected and could be " + "safely removed. No other installed or selected packages depend on " + "these packages.\n" + "\n" + "Unneeded: Show automatically installed packages that could now be " + "safely removed. Other installed or selected packages no longer " + "depend on these packages." IDS_HIDEOBS_TOOLTIP "If selected, setup will hide packages in categories " "with names that begin with '_'. Such packages are usually empty " "placeholders for packages that have been removed or renamed, or are " @@ -578,6 +586,8 @@ BEGIN IDS_VIEW_UPTODATE "Up To Date" IDS_VIEW_NOTINSTALLED "Not Installed" IDS_VIEW_PICKED "Picked" + IDS_VIEW_REMOVABLE "Removable" + IDS_VIEW_UNNEEDED "Unneeded" IDS_VIEW_CATEGORY "Category" IDS_COLUMN_PACKAGE "Package" IDS_COLUMN_CURRENT "Current" diff --git a/res/fr/res.rc b/res/fr/res.rc index a0a7909..681aea4 100644 --- a/res/fr/res.rc +++ b/res/fr/res.rc @@ -524,6 +524,8 @@ BEGIN "\n" "Choisi : montre les paquets installés qui ont été sélectionnés, et non installés " "pour résoudre une dépendance." + // "Removable: ... XXX: Missing translation" + // "Unneeded: ... XXX: Missing translation" IDS_HIDEOBS_TOOLTIP "L'assistant cachera les paquets des catégories dont " "le nom commence par '_'. Ces paquets sont vides et sont des emplacements " "pour des paquets éliminés ou renommés, ou encore des paquets " @@ -564,6 +566,8 @@ BEGIN IDS_VIEW_UPTODATE "À jour" IDS_VIEW_NOTINSTALLED "Non installé" IDS_VIEW_PICKED "Sélectionné" + // IDS_VIEW_REMOVABLE "XXX: missing translation" + // IDS_VIEW_UNNEEDED "XXX: missing translation" IDS_VIEW_CATEGORY "Catégorie" IDS_COLUMN_PACKAGE "Paquet" IDS_COLUMN_CURRENT "Actuel" diff --git a/resource.h b/resource.h index 2668dd9..cfe860b 100644 --- a/resource.h +++ b/resource.h @@ -105,6 +105,8 @@ #define IDS_FILE_INUSE_MSG 1208 #define IDS_DEPRECATED_WINDOWS_VERSION 1209 #define IDS_DEPRECATED_WINDOWS_ARCH 1210 +#define IDS_VIEW_REMOVABLE 1211 +#define IDS_VIEW_UNNEEDED 1212 #define IDS_HELPTEXT_COMPACTOS 1500 #define IDS_HELPTEXT_PUBKEY 1501 -- 2.37.1