From 50c409c42a971c6e8a25cb32a87992474247834b Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Fri, 4 Sep 2009 19:32:45 +0200 Subject: add a helper to easily get a vector of strings from the configuration --- apt-pkg/contrib/configuration.cc | 19 +++++++++++++++++++ apt-pkg/contrib/configuration.h | 3 +++ 2 files changed, 22 insertions(+) (limited to 'apt-pkg') diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc index 48a5f0bff..b83ece3e4 100644 --- a/apt-pkg/contrib/configuration.cc +++ b/apt-pkg/contrib/configuration.cc @@ -223,6 +223,25 @@ string Configuration::FindDir(const char *Name,const char *Default) const return Res; } /*}}}*/ +// Configuration::FindVector - Find a vector of values /*{{{*/ +// --------------------------------------------------------------------- +/* Returns a vector of config values under the given item */ +vector Configuration::FindVector(const char *Name) const +{ + vector Vec; + const Item *Top = Lookup(Name); + if (Top == NULL) + return Vec; + + Item *I = Top->Child; + while(I != NULL) + { + Vec.push_back(I->Value); + I = I->Next; + } + return Vec; +} + /*}}}*/ // Configuration::FindI - Find an integer value /*{{{*/ // --------------------------------------------------------------------- /* */ diff --git a/apt-pkg/contrib/configuration.h b/apt-pkg/contrib/configuration.h index 2534692a3..e2da83f5b 100644 --- a/apt-pkg/contrib/configuration.h +++ b/apt-pkg/contrib/configuration.h @@ -31,6 +31,7 @@ #include +#include #include using std::string; @@ -70,6 +71,8 @@ class Configuration string Find(const string Name,const char *Default = 0) const {return Find(Name.c_str(),Default);}; string FindFile(const char *Name,const char *Default = 0) const; string FindDir(const char *Name,const char *Default = 0) const; + std::vector FindVector(const string &Name) const; + std::vector FindVector(const char *Name) const; int FindI(const char *Name,int Default = 0) const; int FindI(const string Name,int Default = 0) const {return FindI(Name.c_str(),Default);}; bool FindB(const char *Name,bool Default = false) const; -- cgit v1.2.3 From c914647fb05653878a14ae391f52b5e94cc73b26 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Mon, 7 Sep 2009 14:59:19 +0200 Subject: reintroduce #clear and #include in the config files, they there broken since 0.7.21 with the introduction of #-comments --- apt-pkg/contrib/configuration.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc index b83ece3e4..4e8586e83 100644 --- a/apt-pkg/contrib/configuration.cc +++ b/apt-pkg/contrib/configuration.cc @@ -601,9 +601,11 @@ bool ReadConfigFile(Configuration &Conf,const string &FName,bool AsSectional, InQuote = !InQuote; if (InQuote == true) continue; - - if ((*I == '/' && I + 1 != End && I[1] == '/') || *I == '#') - { + + if ((*I == '/' && I + 1 != End && I[1] == '/') || + (*I == '#' && strcmp(string(I,I+6).c_str(),"#clear") != 0 && + strcmp(string(I,I+8).c_str(),"#include") != 0)) + { End = I; break; } -- cgit v1.2.3 From 1f99b6d338186efe80e314268db44600d3c94a1e Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 8 Sep 2009 09:47:12 +0200 Subject: replace unknown multibytes with ? in UTF8ToCharset (Closes: #545208) instead of ignoring the returncode and truncating the string on error --- apt-pkg/contrib/strutl.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc index 1683868c8..4c05f2df8 100644 --- a/apt-pkg/contrib/strutl.cc +++ b/apt-pkg/contrib/strutl.cc @@ -67,9 +67,20 @@ bool UTF8ToCodeset(const char *codeset, const string &orig, string *dest) outbuf = new char[insize+1]; outptr = outbuf; - iconv(cd, &inptr, &insize, &outptr, &outsize); - *outptr = '\0'; + while (insize != 0) + { + size_t const err = iconv(cd, &inptr, &insize, &outptr, &outsize); + if (err == (size_t)(-1)) + { + insize--; + outsize++; + inptr++; + *outptr = '?'; + outptr++; + } + } + *outptr = '\0'; *dest = outbuf; delete[] outbuf; -- cgit v1.2.3 From 8bd02d8bd6bc46bc38924635afc09fdde50b6bf5 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 8 Sep 2009 15:02:15 +0200 Subject: Rework the CompressionTypes system by adding an Order subgroup to simplify customisation of the order and improve the documentation about this setting group. --- apt-pkg/aptconfiguration.cc | 56 +++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 22 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/aptconfiguration.cc b/apt-pkg/aptconfiguration.cc index 1a8e8262f..45ae9bed5 100644 --- a/apt-pkg/aptconfiguration.cc +++ b/apt-pkg/aptconfiguration.cc @@ -14,6 +14,7 @@ #include #include +#include /*}}}*/ namespace APT { // getCompressionTypes - Return Vector of usbale compressiontypes /*{{{*/ @@ -29,41 +30,52 @@ const Configuration::getCompressionTypes(bool const &Cached) { types.clear(); } + // setup the defaults for the compressiontypes => method mapping + _config->CndSet("Acquire::CompressionTypes::bz2","bzip2"); + _config->CndSet("Acquire::CompressionTypes::lzma","lzma"); + _config->CndSet("Acquire::CompressionTypes::gz","gzip"); + // Set default application paths to check for optional compression types _config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma"); _config->CndSet("Dir::Bin::bzip2", "/bin/bzip2"); - ::Configuration::Item const *Opts = _config->Tree("Acquire::CompressionTypes"); - if (Opts != 0) - Opts = Opts->Child; + // accept non-list order as override setting for config settings on commandline + std::string const overrideOrder = _config->Find("Acquire::CompressionTypes::Order",""); + if (overrideOrder.empty() == false) + types.push_back(overrideOrder); - // at first, move over the options to setup at least the default options - bool foundLzma=false, foundBzip2=false, foundGzip=false; - for (; Opts != 0; Opts = Opts->Next) { - if (Opts->Value == "lzma") - foundLzma = true; - else if (Opts->Value == "bz2") - foundBzip2 = true; - else if (Opts->Value == "gz") - foundGzip = true; + // load the order setting into our vector + std::vector const order = _config->FindVector("Acquire::CompressionTypes::Order"); + for (std::vector::const_iterator o = order.begin(); + o != order.end(); o++) { + if ((*o).empty() == true) + continue; + // ignore types we have no method ready to use + if (_config->Exists(string("Acquire::CompressionTypes::").append(*o)) == false) + continue; + // ignore types we have no app ready to use + string const appsetting = string("Dir::Bin::").append(*o); + if (_config->Exists(appsetting) == true) { + std::string const app = _config->FindFile(appsetting.c_str(), ""); + if (app.empty() == false && FileExists(app) == false) + continue; + } + types.push_back(*o); } - // setup the defaults now - if (!foundBzip2) - _config->Set("Acquire::CompressionTypes::bz2","bzip2"); - if (!foundLzma) - _config->Set("Acquire::CompressionTypes::lzma","lzma"); - if (!foundGzip) - _config->Set("Acquire::CompressionTypes::gz","gzip"); - - // move again over the option tree to finially calculate our result + // move again over the option tree to add all missing compression types ::Configuration::Item const *Types = _config->Tree("Acquire::CompressionTypes"); if (Types != 0) Types = Types->Child; for (; Types != 0; Types = Types->Next) { + if (Types->Tag == "Order" || Types->Tag.empty() == true) + continue; + // ignore types we already have in the vector + if (std::find(types.begin(),types.end(),Types->Tag) != types.end()) + continue; + // ignore types we have no app ready to use string const appsetting = string("Dir::Bin::").append(Types->Value); - // ignore compression types we have no app ready to use if (appsetting.empty() == false && _config->Exists(appsetting) == true) { std::string const app = _config->FindFile(appsetting.c_str(), ""); if (app.empty() == false && FileExists(app) == false) -- cgit v1.2.3 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') 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 +++++++++++++++++++++++++++++++++------ apt-pkg/deb/dpkgpm.h | 2 +- 2 files changed, 34 insertions(+), 7 deletions(-) (limited to 'apt-pkg') 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]); } diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h index ebc7e32bf..0c266605a 100644 --- a/apt-pkg/deb/dpkgpm.h +++ b/apt-pkg/deb/dpkgpm.h @@ -53,7 +53,7 @@ class pkgDPkgPM : public pkgPackageManager struct Item { - enum Ops {Install, Configure, Remove, Purge} Op; + enum Ops {Install, Configure, Remove, Purge, ConfigurePending} Op; string File; PkgIterator Pkg; Item(Ops Op,PkgIterator Pkg,string File = "") : Op(Op), -- 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 +++++++++++++----- apt-pkg/deb/dpkgpm.h | 2 +- apt-pkg/orderlist.cc | 74 ++++++++++++++++++++++++++++++++--------------- apt-pkg/packagemanager.cc | 37 ++++++++++++++++-------- 4 files changed, 97 insertions(+), 44 deletions(-) (limited to 'apt-pkg') 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]); diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h index 0c266605a..43e5c7d45 100644 --- a/apt-pkg/deb/dpkgpm.h +++ b/apt-pkg/deb/dpkgpm.h @@ -53,7 +53,7 @@ class pkgDPkgPM : public pkgPackageManager struct Item { - enum Ops {Install, Configure, Remove, Purge, ConfigurePending} Op; + enum Ops {Install, Configure, Remove, Purge, ConfigurePending, TriggersPending} Op; string File; PkgIterator Pkg; Item(Ops Op,PkgIterator Pkg,string File = "") : Op(Op), diff --git a/apt-pkg/orderlist.cc b/apt-pkg/orderlist.cc index 01b150722..e5bd8247d 100644 --- a/apt-pkg/orderlist.cc +++ b/apt-pkg/orderlist.cc @@ -174,22 +174,35 @@ bool pkgOrderList::DoRun() bool pkgOrderList::OrderCritical() { FileList = 0; - + Primary = &pkgOrderList::DepUnPackPre; Secondary = 0; RevDepends = 0; Remove = 0; LoopCount = 0; - + // Sort Me = this; - qsort(List,End - List,sizeof(*List),&OrderCompareB); - + qsort(List,End - List,sizeof(*List),&OrderCompareB); + if (DoRun() == false) return false; - + if (LoopCount != 0) return _error->Error("Fatal, predepends looping detected"); + + if (Debug == true) + { + clog << "** Critical Unpack ordering done" << endl; + + for (iterator I = List; I != End; I++) + { + PkgIterator P(Cache,*I); + if (IsNow(P) == true) + clog << " " << P.Name() << ' ' << IsMissing(P) << ',' << IsFlag(P,After) << endl; + } + } + return true; } /*}}}*/ @@ -205,7 +218,7 @@ bool pkgOrderList::OrderUnpack(string *FileList) if (FileList != 0) { WipeFlags(After); - + // Set the inlist flag for (iterator I = List; I != End; I++) { @@ -214,7 +227,7 @@ bool pkgOrderList::OrderUnpack(string *FileList) Flag(*I,After); } } - + Primary = &pkgOrderList::DepUnPackCrit; Secondary = &pkgOrderList::DepConfigure; RevDepends = &pkgOrderList::DepUnPackDep; @@ -225,11 +238,16 @@ bool pkgOrderList::OrderUnpack(string *FileList) Me = this; qsort(List,End - List,sizeof(*List),&OrderCompareA); - if (Debug == true) - clog << "** Pass A" << endl; - if (DoRun() == false) - return false; - + if (_config->Find("PackageManager::Configure","all") == "all") + { + if (Debug == true) + clog << "** Pass A" << endl; + if (DoRun() == false) + return false; + } + else if (Debug == true) + clog << "** Skip A (same as B for non-all Configure)" << endl; + if (Debug == true) clog << "** Pass B" << endl; Secondary = 0; @@ -243,7 +261,7 @@ bool pkgOrderList::OrderUnpack(string *FileList) Remove = 0; // Otherwise the libreadline remove problem occures if (DoRun() == false) return false; - + if (Debug == true) clog << "** Pass D" << endl; LoopCount = 0; @@ -259,9 +277,9 @@ bool pkgOrderList::OrderUnpack(string *FileList) { PkgIterator P(Cache,*I); if (IsNow(P) == true) - clog << P.Name() << ' ' << IsMissing(P) << ',' << IsFlag(P,After) << endl; + clog << " " << P.Name() << ' ' << IsMissing(P) << ',' << IsFlag(P,After) << endl; } - } + } return true; } @@ -286,29 +304,35 @@ bool pkgOrderList::OrderConfigure() /* Higher scores order earlier */ int pkgOrderList::Score(PkgIterator Pkg) { + static int const ScoreDelete = _config->FindI("OrderList::Score::Delete", 500); + // Removal is always done first if (Cache[Pkg].Delete() == true) - return 200; - + return ScoreDelete; + // This should never happen.. if (Cache[Pkg].InstVerIter(Cache).end() == true) return -1; - + + static int const ScoreEssential = _config->FindI("OrderList::Score::Essential", 200); + static int const ScoreImmediate = _config->FindI("OrderList::Score::Immediate", 10); + static int const ScorePreDepends = _config->FindI("OrderList::Score::PreDepends", 50); + int Score = 0; if ((Pkg->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential) - Score += 100; + Score += ScoreEssential; if (IsFlag(Pkg,Immediate) == true) - Score += 10; - - for (DepIterator D = Cache[Pkg].InstVerIter(Cache).DependsList(); + Score += ScoreImmediate; + + for (DepIterator D = Cache[Pkg].InstVerIter(Cache).DependsList(); D.end() == false; D++) if (D->Type == pkgCache::Dep::PreDepends) { - Score += 50; + Score += ScorePreDepends; break; } - + // Important Required Standard Optional Extra signed short PrioMap[] = {0,5,4,3,1,0}; if (Cache[Pkg].InstVerIter(Cache)->Priority <= 5) @@ -386,6 +410,7 @@ int pkgOrderList::OrderCompareA(const void *a, const void *b) int ScoreA = Me->Score(A); int ScoreB = Me->Score(B); + if (ScoreA > ScoreB) return -1; @@ -422,6 +447,7 @@ int pkgOrderList::OrderCompareB(const void *a, const void *b) int ScoreA = Me->Score(A); int ScoreB = Me->Score(B); + if (ScoreA > ScoreB) return -1; diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc index cc9ce21c7..442143516 100644 --- a/apt-pkg/packagemanager.cc +++ b/apt-pkg/packagemanager.cc @@ -57,7 +57,10 @@ bool pkgPackageManager::GetArchives(pkgAcquire *Owner,pkgSourceList *Sources, if (CreateOrderList() == false) return false; - if (List->OrderUnpack() == false) + bool const ordering = + _config->FindB("PackageManager::UnpackAll",true) ? + List->OrderUnpack() : List->OrderCritical(); + if (ordering == false) return _error->Error("Internal ordering error"); for (pkgOrderList::iterator I = List->begin(); I != List->end(); I++) @@ -163,7 +166,7 @@ bool pkgPackageManager::CreateOrderList() delete List; List = new pkgOrderList(&Cache); - bool NoImmConfigure = !_config->FindB("APT::Immediate-Configure",true); + static bool const NoImmConfigure = !_config->FindB("APT::Immediate-Configure",true); // Generate the list of affected packages and sort it for (PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) @@ -266,13 +269,16 @@ bool pkgPackageManager::ConfigureAll() if (OList.OrderConfigure() == false) return false; - + + std::string const conf = _config->Find("PackageManager::Configure","all"); + bool const ConfigurePkgs = (conf == "all"); + // Perform the configuring for (pkgOrderList::iterator I = OList.begin(); I != OList.end(); I++) { PkgIterator Pkg(Cache,*I); - if (Configure(Pkg) == false) + if (ConfigurePkgs == true && Configure(Pkg) == false) return false; List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States); @@ -291,16 +297,20 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg) if (DepAdd(OList,Pkg) == false) return false; - - if (OList.OrderConfigure() == false) - return false; - + + static std::string const conf = _config->Find("PackageManager::Configure","all"); + static bool const ConfigurePkgs = (conf == "all" || conf == "smart"); + + if (ConfigurePkgs == true) + if (OList.OrderConfigure() == false) + return false; + // Perform the configuring for (pkgOrderList::iterator I = OList.begin(); I != OList.end(); I++) { PkgIterator Pkg(Cache,*I); - if (Configure(Pkg) == false) + if (ConfigurePkgs == true && Configure(Pkg) == false) return false; List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States); @@ -577,9 +587,12 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall() Reset(); if (Debug == true) - clog << "Begining to order" << endl; + clog << "Beginning to order" << endl; - if (List->OrderUnpack(FileNames) == false) + bool const ordering = + _config->FindB("PackageManager::UnpackAll",true) ? + List->OrderUnpack(FileNames) : List->OrderCritical(); + if (ordering == false) { _error->Error("Internal ordering error"); return Failed; @@ -632,7 +645,7 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall() return Failed; DoneSomething = true; } - + // Final run through the configure phase if (ConfigureAll() == false) return Failed; -- 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 +--- apt-pkg/orderlist.cc | 15 +++++---------- 2 files changed, 6 insertions(+), 13 deletions(-) (limited to 'apt-pkg') 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]); diff --git a/apt-pkg/orderlist.cc b/apt-pkg/orderlist.cc index e5bd8247d..0ee2e2bc8 100644 --- a/apt-pkg/orderlist.cc +++ b/apt-pkg/orderlist.cc @@ -175,7 +175,7 @@ bool pkgOrderList::OrderCritical() { FileList = 0; - Primary = &pkgOrderList::DepUnPackPre; + Primary = &pkgOrderList::DepUnPackPreD; Secondary = 0; RevDepends = 0; Remove = 0; @@ -238,15 +238,10 @@ bool pkgOrderList::OrderUnpack(string *FileList) Me = this; qsort(List,End - List,sizeof(*List),&OrderCompareA); - if (_config->Find("PackageManager::Configure","all") == "all") - { - if (Debug == true) - clog << "** Pass A" << endl; - if (DoRun() == false) - return false; - } - else if (Debug == true) - clog << "** Skip A (same as B for non-all Configure)" << endl; + if (Debug == true) + clog << "** Pass A" << endl; + if (DoRun() == false) + return false; if (Debug == true) clog << "** Pass B" << endl; -- cgit v1.2.3