diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-14 19:05:54 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-14 19:05:54 +0000 |
commit | 3fe0849ae10d09c68ddfa60e7007d84a3d2cb09a (patch) | |
tree | 576d93e852d51d18a2d69a62108bc7434c3c3f7d /apt-pkg | |
parent | Adding debian version 2.9.0. (diff) | |
download | apt-3fe0849ae10d09c68ddfa60e7007d84a3d2cb09a.tar.xz apt-3fe0849ae10d09c68ddfa60e7007d84a3d2cb09a.zip |
Merging upstream version 2.9.1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | apt-pkg/depcache.cc | 56 | ||||
-rw-r--r-- | apt-pkg/depcache.h | 4 | ||||
-rw-r--r-- | apt-pkg/init.cc | 2 | ||||
-rw-r--r-- | apt-pkg/install-progress.cc | 12 |
4 files changed, 72 insertions, 2 deletions
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc index e3e8d62..76a5c09 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; +} + /*}}}*/ diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h index 5dd022b..23047b9 100644 --- a/apt-pkg/depcache.h +++ b/apt-pkg/depcache.h @@ -490,7 +490,9 @@ class APT_PUBLIC pkgDepCache : protected pkgCache::Namespace virtual ~pkgDepCache(); bool CheckConsistency(char const *const msgtag = ""); - +#ifdef APT_COMPILING_APT + double BootSize(bool initrdOnly); +#endif protected: // methods call by IsInstallOk bool IsInstallOkMultiArchSameVersionSynced(PkgIterator const &Pkg, diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc index 7593540..487f94f 100644 --- a/apt-pkg/init.cc +++ b/apt-pkg/init.cc @@ -147,6 +147,8 @@ bool pkgInitConfig(Configuration &Cnf) // Configuration Cnf.CndSet("Dir::Etc", &CONF_DIR[1]); + Cnf.CndSet("Dir::Boot", "boot"); + Cnf.CndSet("Dir::Usr", "usr"); Cnf.CndSet("Dir::Etc::sourcelist","sources.list"); Cnf.CndSet("Dir::Etc::sourceparts","sources.list.d"); Cnf.CndSet("Dir::Etc::main","apt.conf"); diff --git a/apt-pkg/install-progress.cc b/apt-pkg/install-progress.cc index 2b0dc21..fe33244 100644 --- a/apt-pkg/install-progress.cc +++ b/apt-pkg/install-progress.cc @@ -13,6 +13,7 @@ #include <sstream> #include <vector> #include <fcntl.h> +#include <langinfo.h> #include <sys/ioctl.h> #include <unistd.h> @@ -344,14 +345,23 @@ void PackageManagerFancy::Stop() std::string PackageManagerFancy::GetTextProgressStr(float Percent, int OutputSize) { + bool Unicode = strcmp(nl_langinfo(CODESET), "UTF-8") == 0; std::string output; if (unlikely(OutputSize < 3)) return output; int const BarSize = OutputSize - 2; // bar without the leading "[" and trailing "]" int const BarDone = std::max(0, std::min(BarSize, static_cast<int>(std::floor(Percent * BarSize)))); + double dummy; + double const BarDoneFractional = std::modf(Percent * BarSize, &dummy); + const char *const BarDoneFractionalChar = (const char *[]){ + " ", "▏", "▎", "▍", "▌", "▋", "▊", "▉"}[static_cast<int>(std::floor(BarDoneFractional * 8))]; output.append("["); - std::fill_n(std::fill_n(std::back_inserter(output), BarDone, '#'), BarSize - BarDone, '.'); + for (int i = 0; i < BarDone; i++) + output.append(Unicode ? "█" : "#"); + if (BarDone + 1 <= BarSize) + output.append(Unicode ? BarDoneFractionalChar : "."); + std::fill_n(std::back_inserter(output), BarSize - BarDone - 1, Unicode ? ' ' : '.'); output.append("]"); return output; } |