diff options
author | David Kalnischkies <david@kalnischkies.de> | 2016-07-10 14:14:43 +0200 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2016-07-22 16:05:10 +0200 |
commit | 8b21456acba3cbbc28f35eba684d8f21b0c290b4 (patch) | |
tree | 2fc663409b3e17027e85ebdb475f0d6ae78968c5 | |
parent | 84255101ee38693aea2fd456cf0da174434afa01 (diff) |
report progress for triggered actions
APT doesn't know which packages will be triggered in the course of
actions, so it can't plan to see them for progress beforehand, but if it
sees that dpkg says that a package was triggered we can add additional
states. This is pretty much magic – after all it sets back the progress
– and there are cornercases in which this will result in incorrect
totals (package in partial states may or may not loose trigger states),
but the worst which can happen is that the progress is slightly
incorrect and doesn't reach 100%, but so be it. Better than being stuck
at 100% for a while as apt isn't realizing that a bunch of triggers
still need to be processed.
-rw-r--r-- | apt-pkg/deb/dpkgpm.cc | 57 |
1 files changed, 42 insertions, 15 deletions
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 0c61a5e36..c1b9a28f4 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -698,28 +698,55 @@ void pkgDPkgPM::ProcessDpkgStatusLine(char *line) if (prefix == "status") { - vector<struct DpkgState> const &states = PackageOps[pkg]; - if(PackageOpsDone[pkg] < states.size()) + std::vector<struct DpkgState> &states = PackageOps[pkg]; + if (action == "triggers-pending") { - char const * const next_action = states[PackageOpsDone[pkg]].state; - if (next_action && Debug == true) + if (Debug == true) std::clog << "(parsed from dpkg) pkg: " << short_pkgname - << " action: " << action << " (expected: '" << next_action << "' " + << " action: " << action << " (prefix 2 to " << PackageOpsDone[pkg] << " of " << states.size() << ")" << endl; - // check if the package moved to the next dpkg state - if(next_action && (action == next_action)) + states.insert(states.begin(), {"installed", N_("Installed %s")}); + states.insert(states.begin(), {"half-configured", N_("Configuring %s")}); + PackagesTotal += 2; + } + else if(PackageOpsDone[pkg] < states.size()) + { + char const * next_action = states[PackageOpsDone[pkg]].state; + if (next_action) { - // only read the translation if there is actually a next action - char const * const translation = _(states[PackageOpsDone[pkg]].str); + /* + if (action == "half-installed" && strcmp("half-configured", next_action) == 0 && + PackageOpsDone[pkg] + 2 < states.size() && action == states[PackageOpsDone[pkg] + 2].state) + { + if (Debug == true) + std::clog << "(parsed from dpkg) pkg: " << short_pkgname << " action: " << action + << " pending trigger defused by unpack" << std::endl; + // unpacking a package defuses the pending trigger + PackageOpsDone[pkg] += 2; + PackagesDone += 2; + next_action = states[PackageOpsDone[pkg]].state; + } + */ + if (Debug == true) + std::clog << "(parsed from dpkg) pkg: " << short_pkgname + << " action: " << action << " (expected: '" << next_action << "' " + << PackageOpsDone[pkg] << " of " << states.size() << ")" << endl; + + // check if the package moved to the next dpkg state + if(action == next_action) + { + // only read the translation if there is actually a next action + char const * const translation = _(states[PackageOpsDone[pkg]].str); - // we moved from one dpkg state to a new one, report that - ++PackageOpsDone[pkg]; - ++PackagesDone; + // we moved from one dpkg state to a new one, report that + ++PackageOpsDone[pkg]; + ++PackagesDone; - std::string msg; - strprintf(msg, translation, i18n_pkgname.c_str()); - d->progress->StatusChanged(pkgname, PackagesDone, PackagesTotal, msg); + std::string msg; + strprintf(msg, translation, i18n_pkgname.c_str()); + d->progress->StatusChanged(pkgname, PackagesDone, PackagesTotal, msg); + } } } } |