summaryrefslogtreecommitdiff
path: root/apt-pkg/depcache.cc
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2024-04-14 16:44:41 +0000
committerJulian Andres Klode <jak@debian.org>2024-04-14 16:44:41 +0000
commite7f0d39ee9e6ca3de71c4a9bc52be6de26ea18a0 (patch)
tree4c90407406575507180456b4df9f00ef4292366a /apt-pkg/depcache.cc
parentb54308e8545f90928e3fcde5c0df52b22295042f (diff)
parentac8fe4b030754584cda9cb1707fc3d9f0d792366 (diff)
Merge branch 'ui-2.9.1' into 'main'
UI improvements for 2.9.1 See merge request apt-team/apt!338
Diffstat (limited to 'apt-pkg/depcache.cc')
-rw-r--r--apt-pkg/depcache.cc56
1 files changed, 56 insertions, 0 deletions
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index e3e8d627c..76a5c09ba 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -42,6 +42,7 @@
#include <unordered_map>
#include <utility>
#include <vector>
+#include <dirent.h>
#include <sys/stat.h>
@@ -2613,3 +2614,58 @@ bool pkgDepCache::PhasingApplied(pkgCache::PkgIterator Pkg) const
return true;
}
/*}}}*/
+
+// DepCache::BootSize /*{{{*/
+double pkgDepCache::BootSize(bool initrdOnly)
+{
+ double BootSize = 0;
+ int BootCount = 0;
+ auto VirtualKernelPkg = FindPkg("$kernel", "any");
+ if (VirtualKernelPkg.end())
+ return 0;
+
+ for (pkgCache::PrvIterator Prv = VirtualKernelPkg.ProvidesList(); Prv.end() == false; ++Prv)
+ {
+ auto Pkg = Prv.OwnerPkg();
+ if ((*this)[Pkg].NewInstall())
+ BootSize += (*this)[Pkg].InstallVer->InstalledSize, BootCount++;
+ }
+ if (BootCount == 0)
+ return 0;
+ if (initrdOnly)
+ BootSize = 0;
+
+ DIR *boot = opendir(_config->FindDir("Dir::Boot").c_str());
+ struct dirent *ent;
+ if (boot)
+ {
+ double initrdSize = 0;
+ double mapSize = 0;
+ while ((ent = readdir(boot)))
+ {
+ enum
+ {
+ INITRD,
+ MAP
+ } type;
+ if (APT::String::Startswith(ent->d_name, "initrd.img-"))
+ type = INITRD;
+ else if (APT::String::Startswith(ent->d_name, "System.map-"))
+ type = MAP;
+ else
+ continue;
+
+ auto path = _config->FindDir("Dir::Boot") + ent->d_name;
+
+ if (struct stat st; stat(path.c_str(), &st) == 0)
+ {
+ double &targetSize = type == INITRD ? initrdSize : mapSize;
+ targetSize = std::max(targetSize, double(st.st_size));
+ }
+ }
+ closedir(boot);
+ return initrdSize ? BootSize + BootCount * (initrdSize + mapSize) * 1.1 : 0;
+ }
+ return 0;
+}
+ /*}}}*/