diff options
author | Julian Andres Klode <julian.klode@canonical.com> | 2020-03-06 13:10:04 +0100 |
---|---|---|
committer | Julian Andres Klode <julian.klode@canonical.com> | 2020-03-06 13:14:37 +0100 |
commit | 1b81f6bd13bb31e59da3f53cfdc7caab43abf887 (patch) | |
tree | cf511b030725b1a7bb97f3c402ff5df773b84382 | |
parent | 68a83a64cd424385b613f58e23c03e262d840b91 (diff) |
Show absolute time while waiting for lock instead of %, rework message
Showing a percentage for a timeout is pretty non-standard. Rework the
progress class so it can show an absolute progress (currently hardcoded
to use seconds as a unit). If there is a timeout (aka if it's not the
maximum long long unsigned -1llu), then show the timeout, otherwise
just count up seconds, e.g.
Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 33842 (apt)... 1/120s
or
Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 33842 (apt)... 1s
Also improve the error message to use "Waiting for cache lock: %s" instead of "... (%s)", as having
multiple sentences inside parenthesis is super weird, as is having two closing parens.
We pass the information via _config, as that's reasonably easy and avoids
ABI hackage. It also provides an interesting debugging tool for other
kinds of progress.
-rw-r--r-- | apt-pkg/contrib/progress.cc | 16 | ||||
-rw-r--r-- | apt-pkg/contrib/progress.h | 1 | ||||
-rw-r--r-- | apt-pkg/deb/debsystem.cc | 7 | ||||
-rw-r--r-- | doc/examples/configure-index | 2 |
4 files changed, 21 insertions, 5 deletions
diff --git a/apt-pkg/contrib/progress.cc b/apt-pkg/contrib/progress.cc index 971198270..03f88d4ce 100644 --- a/apt-pkg/contrib/progress.cc +++ b/apt-pkg/contrib/progress.cc @@ -91,7 +91,10 @@ void OpProgress::SubProgress(unsigned long long SubTotal,const string &Op, an update the display would be swamped and the system much slower. This provides an upper bound on the update rate. */ bool OpProgress::CheckChange(float Interval) -{ +{ + // For absolute progress, we assume every call is relevant. + if (_config->FindB("APT::Internal::OpProgress::Absolute", false)) + return true; // New major progress indication if (Op != LastOp) { @@ -199,9 +202,14 @@ void OpTextProgress::Update() Write(S); cout << endl; } - - // Print the spinner - snprintf(S,sizeof(S),_("%c%s... %u%%"),'\r',Op.c_str(),(unsigned int)Percent); + + // Print the spinner. Absolute progress shows us a time progress. + if (_config->FindB("APT::Internal::OpProgress::Absolute", false) && Total != -1llu) + snprintf(S, sizeof(S), _("%c%s... %llu/%llus"), '\r', Op.c_str(), Current, Total); + else if (_config->FindB("APT::Internal::OpProgress::Absolute", false)) + snprintf(S, sizeof(S), _("%c%s... %llus"), '\r', Op.c_str(), Current); + else + snprintf(S, sizeof(S), _("%c%s... %u%%"), '\r', Op.c_str(), (unsigned int)Percent); Write(S); OldOp = Op; diff --git a/apt-pkg/contrib/progress.h b/apt-pkg/contrib/progress.h index 4d118ee99..d6a698af3 100644 --- a/apt-pkg/contrib/progress.h +++ b/apt-pkg/contrib/progress.h @@ -28,6 +28,7 @@ class Configuration; class APT_PUBLIC OpProgress { + friend class OpTextProgress; unsigned long long Current; unsigned long long Total; unsigned long long Size; diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc index da7ae2e42..6904879b6 100644 --- a/apt-pkg/deb/debsystem.cc +++ b/apt-pkg/deb/debsystem.cc @@ -79,6 +79,11 @@ debSystem::~debSystem() checking of the updates directory. */ static int GetLockMaybeWait(std::string const &file, OpProgress *Progress, int &timeoutSec) { + struct ScopedAbsoluteProgress + { + ScopedAbsoluteProgress() { _config->Set("APT::Internal::OpProgress::Absolute", true); } + ~ScopedAbsoluteProgress() { _config->Set("APT::Internal::OpProgress::Absolute", false); } + } _scopedAbsoluteProgress; int fd = -1; if (timeoutSec == 0 || Progress == nullptr) return GetLock(file); @@ -102,7 +107,7 @@ static int GetLockMaybeWait(std::string const &file, OpProgress *Progress, int & _error->PopMessage(poppedError); _error->RevertToStack(); - strprintf(completeError, _("Waiting for cache lock (%s)"), poppedError.c_str()); + strprintf(completeError, _("Waiting for cache lock: %s"), poppedError.c_str()); sleep(1); Progress->OverallProgress(i, timeoutSec, 0, completeError); } diff --git a/doc/examples/configure-index b/doc/examples/configure-index index 4e0bd57ae..bf9efc109 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -826,3 +826,5 @@ dir::filelistdir "<STRING>"; dir::dpkg::tupletable "<FILE>"; dir::dpkg::triplettable "<FILE>"; dir::dpkg::cputable "<FILE>"; + +APT::Internal::OpProgress::Absolute "<BOOL>"; |