From 887f5036c31d6bbbab8fa967d39592617244f3a0 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Fri, 11 Sep 2009 08:42:26 +0200 Subject: apt-pkg/deb/dpkgpm.cc: make some variables constant and add foldmarkers --- apt-pkg/deb/dpkgpm.cc | 74 ++++++++++++++++++++++++++------------------------- 1 file changed, 38 insertions(+), 36 deletions(-) (limited to 'apt-pkg/deb/dpkgpm.cc') diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index f787f365e..b4a2abcb5 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -378,10 +378,11 @@ void pkgDPkgPM::DoTerminalPty(int master) */ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line) { + bool const Debug = _config->FindB("Debug::pkgDPkgProgressReporting",false); // the status we output ostringstream status; - if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + if (Debug == true) std::clog << "got from dpkg '" << line << "'" << std::endl; @@ -396,6 +397,7 @@ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line) 'processing: install: pkg' 'processing: configure: pkg' 'processing: remove: pkg' + 'processing: purge: pkg' - but for apt is it a ignored "unknown" action 'processing: trigproc: trigger' */ @@ -408,28 +410,28 @@ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line) TokSplitString(':', line, list, sizeof(list)/sizeof(list[0])); if( list[0] == NULL || list[1] == NULL || list[2] == NULL) { - if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + if (Debug == true) std::clog << "ignoring line: not enough ':'" << std::endl; return; } - char *pkg = list[1]; - char *action = _strstrip(list[2]); + const char* const pkg = list[1]; + const char* action = _strstrip(list[2]); // 'processing' from dpkg looks like // 'processing: action: pkg' if(strncmp(list[0], "processing", strlen("processing")) == 0) { char s[200]; - char *pkg_or_trigger = _strstrip(list[2]); - action =_strstrip( list[1]); + const char* const pkg_or_trigger = _strstrip(list[2]); + action = _strstrip( list[1]); const std::pair * const iter = std::find_if(PackageProcessingOpsBegin, PackageProcessingOpsEnd, MatchProcessingOp(action)); if(iter == PackageProcessingOpsEnd) { - if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) - std::clog << "ignoring unknwon action: " << action << std::endl; + if (Debug == true) + std::clog << "ignoring unknown action: " << action << std::endl; return; } snprintf(s, sizeof(s), _(iter->second), pkg_or_trigger); @@ -440,7 +442,7 @@ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line) << endl; if(OutStatusFd > 0) write(OutStatusFd, status.str().c_str(), status.str().size()); - if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + if (Debug == true) std::clog << "send: '" << status.str() << "'" << endl; return; } @@ -453,11 +455,11 @@ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line) << endl; if(OutStatusFd > 0) write(OutStatusFd, status.str().c_str(), status.str().size()); - if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + if (Debug == true) std::clog << "send: '" << status.str() << "'" << endl; return; } - if(strncmp(action,"conffile",strlen("conffile")) == 0) + else if(strncmp(action,"conffile",strlen("conffile")) == 0) { status << "pmconffile:" << list[1] << ":" << (PackagesDone/float(PackagesTotal)*100.0) @@ -465,12 +467,12 @@ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line) << endl; if(OutStatusFd > 0) write(OutStatusFd, status.str().c_str(), status.str().size()); - if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + if (Debug == true) std::clog << "send: '" << status.str() << "'" << endl; return; } - vector &states = PackageOps[pkg]; + vector const &states = PackageOps[pkg]; const char *next_action = NULL; if(PackageOpsDone[pkg] < states.size()) next_action = states[PackageOpsDone[pkg]].state; @@ -493,15 +495,15 @@ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line) << endl; if(OutStatusFd > 0) write(OutStatusFd, status.str().c_str(), status.str().size()); - if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + if (Debug == true) std::clog << "send: '" << status.str() << "'" << endl; } - if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) + if (Debug == true) std::clog << "(parsed from dpkg) pkg: " << pkg << " action: " << action << endl; } - -// DPkgPM::DoDpkgStatusFd /*{{{*/ + /*}}}*/ +// DPkgPM::DoDpkgStatusFd /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -538,7 +540,7 @@ void pkgDPkgPM::DoDpkgStatusFd(int statusfd, int OutStatusFd) dpkgbuf_pos = dpkgbuf+dpkgbuf_pos-p; } /*}}}*/ - +// DPkgPM::OpenLog /*{{{*/ bool pkgDPkgPM::OpenLog() { string logdir = _config->FindDir("Dir::Log"); @@ -561,7 +563,8 @@ bool pkgDPkgPM::OpenLog() } return true; } - + /*}}}*/ +// DPkg::CloseLog /*{{{*/ bool pkgDPkgPM::CloseLog() { if(term_out) @@ -578,7 +581,7 @@ bool pkgDPkgPM::CloseLog() term_out = NULL; return true; } - + /*}}}*/ /*{{{*/ // This implements a racy version of pselect for those architectures // that don't have a working implementation. @@ -600,7 +603,6 @@ static int racy_pselect(int nfds, fd_set *readfds, fd_set *writefds, return retval; } /*}}}*/ - // DPkgPM::Go - Run the sequence /*{{{*/ // --------------------------------------------------------------------- /* This globs the operations and calls dpkg @@ -617,9 +619,9 @@ bool pkgDPkgPM::Go(int OutStatusFd) sigset_t sigmask; sigset_t original_sigmask; - unsigned int MaxArgs = _config->FindI("Dpkg::MaxArgs",8*1024); - unsigned int MaxArgBytes = _config->FindI("Dpkg::MaxArgBytes",32*1024); - bool NoTriggers = _config->FindB("DPkg::NoTriggers",false); + unsigned int const MaxArgs = _config->FindI("Dpkg::MaxArgs",8*1024); + unsigned int const MaxArgBytes = _config->FindI("Dpkg::MaxArgBytes",32*1024); + bool const NoTriggers = _config->FindB("DPkg::NoTriggers",false); if (RunScripts("DPkg::Pre-Invoke") == false) return false; @@ -662,16 +664,16 @@ bool pkgDPkgPM::Go(int OutStatusFd) // that will be [installed|configured|removed|purged] and add // them to the PackageOps map (the dpkg states it goes through) // and the PackageOpsTranslations (human readable strings) - for (vector::iterator I = List.begin(); I != List.end();I++) + for (vector::const_iterator I = List.begin(); I != List.end();I++) { - string name = (*I).Pkg.Name(); + string const name = (*I).Pkg.Name(); PackageOpsDone[name] = 0; for(int i=0; (DpkgStatesOpMap[(*I).Op][i]).state != NULL; i++) { PackageOps[name].push_back(DpkgStatesOpMap[(*I).Op][i]); PackagesTotal++; } - } + } stdin_is_dev_null = false; @@ -679,9 +681,9 @@ bool pkgDPkgPM::Go(int OutStatusFd) OpenLog(); // this loop is runs once per operation - for (vector::iterator I = List.begin(); I != List.end();) + for (vector::const_iterator I = List.begin(); I != List.end();) { - vector::iterator J = I; + vector::const_iterator J = I; for (; J != List.end() && J->Op == I->Op; J++) /* nothing */; @@ -700,7 +702,7 @@ bool pkgDPkgPM::Go(int OutStatusFd) unsigned int n = 0; unsigned long Size = 0; - string Tmp = _config->Find("Dir::Bin::dpkg","dpkg"); + string const Tmp = _config->Find("Dir::Bin::dpkg","dpkg"); Args[n++] = Tmp.c_str(); Size += strlen(Args[n-1]); @@ -750,11 +752,11 @@ bool pkgDPkgPM::Go(int OutStatusFd) case Item::Configure: Args[n++] = "--configure"; - if (NoTriggers) + if (NoTriggers == true) Args[n++] = "--no-triggers"; Size += strlen(Args[n-1]); break; - + case Item::Install: Args[n++] = "--unpack"; Size += strlen(Args[n-1]); @@ -913,11 +915,9 @@ bool pkgDPkgPM::Go(int OutStatusFd) int Status = 0; // we read from dpkg here - int _dpkgin = fd[0]; + int const _dpkgin = fd[0]; close(fd[1]); // close the write end of the pipe - // the result of the waitpid call - int res; if(slave > 0) close(slave); @@ -925,6 +925,8 @@ bool pkgDPkgPM::Go(int OutStatusFd) sigemptyset(&sigmask); sigprocmask(SIG_BLOCK,&sigmask,&original_sigmask); + // the result of the waitpid call + int res; int select_ret; while ((res=waitpid(Child,&Status, WNOHANG)) != Child) { if(res < 0) { @@ -991,7 +993,7 @@ bool pkgDPkgPM::Go(int OutStatusFd) // if it was set to "keep-dpkg-runing" then we won't return // here but keep the loop going and just report it as a error // for later - bool stopOnError = _config->FindB("Dpkg::StopOnError",true); + bool const stopOnError = _config->FindB("Dpkg::StopOnError",true); if(stopOnError) RunScripts("DPkg::Post-Invoke"); -- cgit v1.2.3 From 3e9c4f702ed45f6201bae44b628c84db69436b05 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sun, 13 Sep 2009 00:32:35 +0200 Subject: add and document experimental options to make aggressive use of dpkg's trigger and configuration handling (Closes: #473461) Add NoTriggers option to add --no-triggers to all dpkg calls, NoConfiguration to prevent apt from trying to configure packages - dpkg should handle this in the last ConfigurePending call. This options are for now deactivated as they require more testing in real world situations, but the plan is to enable them in the near future if anything works well. --- apt-pkg/deb/dpkgpm.cc | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) (limited to 'apt-pkg/deb/dpkgpm.cc') diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index b4a2abcb5..04e257b1b 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -134,8 +134,11 @@ bool pkgDPkgPM::Configure(PkgIterator Pkg) { if (Pkg.end() == true) return false; - - List.push_back(Item(Item::Configure,Pkg)); + + bool static const NoConfigure = _config->FindB("DPkg::NoConfigure",false); + if (NoConfigure == false) + List.push_back(Item(Item::Configure,Pkg)); + return true; } /*}}}*/ @@ -190,6 +193,9 @@ bool pkgDPkgPM::SendV2Pkgs(FILE *F) // Write out the package actions in order. for (vector::iterator I = List.begin(); I != List.end(); I++) { + if(I->Pkg.end() == true) + continue; + pkgDepCache::StateCache &S = Cache[I->Pkg]; fprintf(F,"%s ",I->Pkg.Name()); @@ -629,6 +635,11 @@ bool pkgDPkgPM::Go(int OutStatusFd) if (RunScriptsWithPkgs("DPkg::Pre-Install-Pkgs") == false) return false; + // support subpressing of triggers processing for special + // cases like d-i that runs the triggers handling manually + if(_config->FindB("DPkg::ConfigurePending",_config->FindB("DPkg::NoConfigure",false)) == true) + List.push_back(Item(Item::ConfigurePending,PkgIterator())); + // map the dpkg states to the operations that are performed // (this is sorted in the same way as Item::Ops) static const struct DpkgState DpkgStatesOpMap[][7] = { @@ -666,6 +677,9 @@ bool pkgDPkgPM::Go(int OutStatusFd) // and the PackageOpsTranslations (human readable strings) for (vector::const_iterator I = List.begin(); I != List.end();I++) { + if((*I).Pkg.end() == true) + continue; + string const name = (*I).Pkg.Name(); PackageOpsDone[name] = 0; for(int i=0; (DpkgStatesOpMap[(*I).Op][i]).state != NULL; i++) @@ -752,11 +766,16 @@ bool pkgDPkgPM::Go(int OutStatusFd) case Item::Configure: Args[n++] = "--configure"; - if (NoTriggers == true) - Args[n++] = "--no-triggers"; Size += strlen(Args[n-1]); break; - + + case Item::ConfigurePending: + Args[n++] = "--configure"; + Size += strlen(Args[n-1]); + Args[n++] = "--pending"; + Size += strlen(Args[n-1]); + break; + case Item::Install: Args[n++] = "--unpack"; Size += strlen(Args[n-1]); @@ -764,7 +783,13 @@ bool pkgDPkgPM::Go(int OutStatusFd) Size += strlen(Args[n-1]); break; } - + + if (NoTriggers == true && I->Op != Item::ConfigurePending) + { + Args[n++] = "--no-triggers"; + Size += strlen(Args[n-1]); + } + // Write in the file or package names if (I->Op == Item::Install) { @@ -780,6 +805,8 @@ bool pkgDPkgPM::Go(int OutStatusFd) { for (;I != J && Size < MaxArgBytes; I++) { + if((*I).Pkg.end() == true) + continue; Args[n++] = I->Pkg.Name(); Size += strlen(Args[n-1]); } -- cgit v1.2.3 From 5e312de78360736fa3ef505909ef84da211362ca Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 15 Sep 2009 23:52:04 +0200 Subject: Add even more config options and try to handle configuration problems arising if we upgrade essential or predependencies which need to be configured before even unpacking packages depending on them. --- apt-pkg/deb/dpkgpm.cc | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'apt-pkg/deb/dpkgpm.cc') diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 04e257b1b..5edab5ac7 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -135,9 +135,12 @@ bool pkgDPkgPM::Configure(PkgIterator Pkg) if (Pkg.end() == true) return false; - bool static const NoConfigure = _config->FindB("DPkg::NoConfigure",false); - if (NoConfigure == false) - List.push_back(Item(Item::Configure,Pkg)); + List.push_back(Item(Item::Configure, Pkg)); + + // Use triggers for config calls if we configure "smart" + // as otherwise Pre-Depends will not be satisfied, see #526774 + if (_config->FindB("DPkg::TriggersPending", false) == true) + List.push_back(Item(Item::TriggersPending, PkgIterator())); return true; } @@ -627,7 +630,8 @@ bool pkgDPkgPM::Go(int OutStatusFd) unsigned int const MaxArgs = _config->FindI("Dpkg::MaxArgs",8*1024); unsigned int const MaxArgBytes = _config->FindI("Dpkg::MaxArgBytes",32*1024); - bool const NoTriggers = _config->FindB("DPkg::NoTriggers",false); + bool const NoTriggers = _config->FindB("DPkg::NoTriggers", false); + bool const NoConfTriggers = _config->FindB("DPkg::NoConfTriggers", NoTriggers); if (RunScripts("DPkg::Pre-Invoke") == false) return false; @@ -637,8 +641,9 @@ bool pkgDPkgPM::Go(int OutStatusFd) // support subpressing of triggers processing for special // cases like d-i that runs the triggers handling manually - if(_config->FindB("DPkg::ConfigurePending",_config->FindB("DPkg::NoConfigure",false)) == true) - List.push_back(Item(Item::ConfigurePending,PkgIterator())); + bool const SmartConf = (_config->Find("PackageManager::Configure", "all") != "all"); + if (_config->FindB("DPkg::ConfigurePending", SmartConf) == true) + List.push_back(Item(Item::ConfigurePending, PkgIterator())); // map the dpkg states to the operations that are performed // (this is sorted in the same way as Item::Ops) @@ -776,6 +781,13 @@ bool pkgDPkgPM::Go(int OutStatusFd) Size += strlen(Args[n-1]); break; + case Item::TriggersPending: + Args[n++] = "--triggers-only"; + Size += strlen(Args[n-1]); + Args[n++] = "--pending"; + Size += strlen(Args[n-1]); + break; + case Item::Install: Args[n++] = "--unpack"; Size += strlen(Args[n-1]); @@ -784,7 +796,9 @@ bool pkgDPkgPM::Go(int OutStatusFd) break; } - if (NoTriggers == true && I->Op != Item::ConfigurePending) + if (NoTriggers == true && I->Op != Item::TriggersPending && + I->Op != Item::ConfigurePending && + (I->Op != Item::Configure || NoConfTriggers == true)) { Args[n++] = "--no-triggers"; Size += strlen(Args[n-1]); -- cgit v1.2.3 From d5081aeeb0a1bf4098e3a0d8395e4c7b84f4ac9e Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Fri, 18 Sep 2009 16:54:48 +0200 Subject: cleanup commit for trigger processing: - remove the DPkg::NoConfTriggers - absolutely useless as we need TriggersPending already so we can use --no-triggers. - remove the Immediate-option from the example, it doesn't help much. - UnpackCritical uses DepUnPackPre with a D (on simple letter...) - the "smart" optimisation to skip A was not so smart - revert. --- apt-pkg/deb/dpkgpm.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'apt-pkg/deb/dpkgpm.cc') diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 5edab5ac7..aec4edc49 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -631,7 +631,6 @@ bool pkgDPkgPM::Go(int OutStatusFd) unsigned int const MaxArgs = _config->FindI("Dpkg::MaxArgs",8*1024); unsigned int const MaxArgBytes = _config->FindI("Dpkg::MaxArgBytes",32*1024); bool const NoTriggers = _config->FindB("DPkg::NoTriggers", false); - bool const NoConfTriggers = _config->FindB("DPkg::NoConfTriggers", NoTriggers); if (RunScripts("DPkg::Pre-Invoke") == false) return false; @@ -797,8 +796,7 @@ bool pkgDPkgPM::Go(int OutStatusFd) } if (NoTriggers == true && I->Op != Item::TriggersPending && - I->Op != Item::ConfigurePending && - (I->Op != Item::Configure || NoConfTriggers == true)) + I->Op != Item::ConfigurePending) { Args[n++] = "--no-triggers"; Size += strlen(Args[n-1]); -- cgit v1.2.3 From 5c23dbcc3f056ab0ff5838595a85c4e514e5b57a Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Thu, 24 Sep 2009 18:01:52 +0200 Subject: Ignore TriggerPendings between multiple --configure calls --- apt-pkg/deb/dpkgpm.cc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'apt-pkg/deb/dpkgpm.cc') diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index aec4edc49..bb0469752 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -641,6 +641,7 @@ bool pkgDPkgPM::Go(int OutStatusFd) // support subpressing of triggers processing for special // cases like d-i that runs the triggers handling manually bool const SmartConf = (_config->Find("PackageManager::Configure", "all") != "all"); + bool const TriggersPending = _config->FindB("DPkg::TriggersPending", false); if (_config->FindB("DPkg::ConfigurePending", SmartConf) == true) List.push_back(Item(Item::ConfigurePending, PkgIterator())); @@ -701,9 +702,23 @@ bool pkgDPkgPM::Go(int OutStatusFd) // this loop is runs once per operation for (vector::const_iterator I = List.begin(); I != List.end();) { + // Do all actions with the same Op in one run vector::const_iterator J = I; - for (; J != List.end() && J->Op == I->Op; J++) - /* nothing */; + if (TriggersPending == true) + for (; J != List.end(); J++) + { + if (J->Op == I->Op) + continue; + if (J->Op != Item::TriggersPending) + break; + vector::const_iterator T = J + 1; + if (T != List.end() && T->Op == I->Op) + continue; + break; + } + else + for (; J != List.end() && J->Op == I->Op; J++) + /* nothing */; // Generate the argument list const char *Args[MaxArgs + 50]; -- cgit v1.2.3