Commit 8b21456a authored by David Kalnischkies's avatar David Kalnischkies

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.
parent 84255101
......@@ -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);
}
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment