From 8ddfeb2fb65dd45267d8f7abfc540d2b8cb73a5c Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Fri, 12 Apr 2024 12:00:45 +0200 Subject: OpProgress: Erase lines when done It's interesting to the user to see the progress when it happens, but arguably once it's done it is just visual clutter, so let's not write newlines, and when we are done, instead of appending "Done", let's just empty the line. This requires some effort to keep apt-cdrom happy which just writes lines to stdout itself. Bad apt-cdrom. Maybe there is a better fix for it, but this gets us going. --- apt-pkg/contrib/progress.cc | 11 +++++++---- apt-private/private-cmndline.cc | 4 ++++ doc/examples/configure-index | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/apt-pkg/contrib/progress.cc b/apt-pkg/contrib/progress.cc index a2c4332ca..df068e43a 100644 --- a/apt-pkg/contrib/progress.cc +++ b/apt-pkg/contrib/progress.cc @@ -153,13 +153,15 @@ void OpTextProgress::Done() { if (NoUpdate == false && OldOp.empty() == false) { - char S[300]; + char S[300] = {}; if (_error->PendingError() == true) snprintf(S,sizeof(S),_("%c%s... Error!"),'\r',OldOp.c_str()); - else + else if (not _config->FindB("APT::Internal::OpProgress::EraseLines", true)) snprintf(S,sizeof(S),_("%c%s... Done"),'\r',OldOp.c_str()); Write(S); - cout << endl; + // FIXME: apt-cdrom relies on this end of line being printed + if (_error->PendingError() || not _config->FindB("APT::Internal::OpProgress::EraseLines", true)) + cout << endl; OldOp = string(); } @@ -200,7 +202,8 @@ void OpTextProgress::Update() { snprintf(S,sizeof(S),"\r%s",OldOp.c_str()); Write(S); - cout << endl; + if (_config->FindB("APT::Internal::OpProgress::EraseLines", true)) + cout << endl; } // Print the spinner. Absolute progress shows us a time progress. diff --git a/apt-private/private-cmndline.cc b/apt-private/private-cmndline.cc index cbab22031..505f1f2b8 100644 --- a/apt-private/private-cmndline.cc +++ b/apt-private/private-cmndline.cc @@ -481,6 +481,10 @@ static bool ShowCommonHelp(APT_CMD const Binary, CommandLine &CmdL, std::vector< static void BinarySpecificConfiguration(char const * const Binary) /*{{{*/ { std::string const binary = flNotDir(Binary); + if (binary == "apt-cdrom" || binary == "apt-config") + { + _config->CndSet("Binary::apt-cdrom::APT::Internal::OpProgress::EraseLines", false); + } if (binary == "apt" || binary == "apt-config") { if (getenv("NO_COLOR") == nullptr) diff --git a/doc/examples/configure-index b/doc/examples/configure-index index 9a2bcbf1c..a8fc98daa 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -881,6 +881,7 @@ Rred::f ""; Rred::Compress ""; APT::Internal::OpProgress::Absolute ""; +APT::Internal::OpProgress::EraseLines ""; APT::Color ""; update-manager::always-include-phased-updates ""; -- cgit v1.2.3-70-g09d2