{
if (Pkg.end() == true)
return 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;
}
/*}}}*/
// Write out the package actions in order.
for (vector<Item>::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());
*/
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;
'processing: install: pkg'
'processing: configure: pkg'
'processing: remove: pkg'
+ 'processing: purge: pkg' - but for apt is it a ignored "unknown" action
'processing: trigproc: trigger'
*/
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 char *, const char *> * 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);
<< 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;
}
<< 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)
<< 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<struct DpkgState> &states = PackageOps[pkg];
+ vector<struct DpkgState> const &states = PackageOps[pkg];
const char *next_action = NULL;
if(PackageOpsDone[pkg] < states.size())
next_action = states[PackageOpsDone[pkg]].state;
<< 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 /*{{{*/
// ---------------------------------------------------------------------
/*
*/
dpkgbuf_pos = dpkgbuf+dpkgbuf_pos-p;
}
/*}}}*/
-
+// DPkgPM::OpenLog /*{{{*/
bool pkgDPkgPM::OpenLog()
{
string logdir = _config->FindDir("Dir::Log");
}
return true;
}
-
+ /*}}}*/
+// DPkg::CloseLog /*{{{*/
bool pkgDPkgPM::CloseLog()
{
if(term_out)
term_out = NULL;
return true;
}
-
+ /*}}}*/
/*{{{*/
// This implements a racy version of pselect for those architectures
// that don't have a working implementation.
return retval;
}
/*}}}*/
-
// DPkgPM::Go - Run the sequence /*{{{*/
// ---------------------------------------------------------------------
/* This globs the operations and calls dpkg
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;
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
+ 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)
static const struct DpkgState DpkgStatesOpMap[][7] = {
// 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<Item>::iterator I = List.begin(); I != List.end();I++)
+ for (vector<Item>::const_iterator I = List.begin(); I != List.end();I++)
{
- string name = (*I).Pkg.Name();
+ 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++)
{
PackageOps[name].push_back(DpkgStatesOpMap[(*I).Op][i]);
PackagesTotal++;
}
- }
+ }
stdin_is_dev_null = false;
OpenLog();
// this loop is runs once per operation
- for (vector<Item>::iterator I = List.begin(); I != List.end();)
+ for (vector<Item>::const_iterator I = List.begin(); I != List.end();)
{
- vector<Item>::iterator J = I;
+ vector<Item>::const_iterator J = I;
for (; J != List.end() && J->Op == I->Op; J++)
/* nothing */;
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]);
case Item::Configure:
Args[n++] = "--configure";
- if (NoTriggers)
- 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::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]);
Size += strlen(Args[n-1]);
break;
}
-
+
+ if (NoTriggers == true && I->Op != Item::TriggersPending &&
+ 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)
{
{
for (;I != J && Size < MaxArgBytes; I++)
{
+ if((*I).Pkg.end() == true)
+ continue;
Args[n++] = I->Pkg.Name();
Size += strlen(Args[n-1]);
}
struct termios tt;
struct winsize win;
- int master;
- int slave;
+ int master = -1;
+ int slave = -1;
- // FIXME: setup sensible signal handling (*ick*)
- tcgetattr(0, &tt);
- ioctl(0, TIOCGWINSZ, (char *)&win);
- if (openpty(&master, &slave, NULL, &tt, &win) < 0)
+ // if tcgetattr does not return zero there was a error
+ // and we do not do any pty magic
+ if (tcgetattr(0, &tt) == 0)
{
- const char *s = _("Can not write log, openpty() "
- "failed (/dev/pts not mounted?)\n");
- fprintf(stderr, "%s",s);
- fprintf(term_out, "%s",s);
- master = slave = -1;
- } else {
- struct termios rtt;
- rtt = tt;
- cfmakeraw(&rtt);
- rtt.c_lflag &= ~ECHO;
- // block SIGTTOU during tcsetattr to prevent a hang if
- // the process is a member of the background process group
- // http://www.opengroup.org/onlinepubs/000095399/functions/tcsetattr.html
- sigemptyset(&sigmask);
- sigaddset(&sigmask, SIGTTOU);
- sigprocmask(SIG_BLOCK,&sigmask, &original_sigmask);
- tcsetattr(0, TCSAFLUSH, &rtt);
- sigprocmask(SIG_SETMASK, &original_sigmask, 0);
+ ioctl(0, TIOCGWINSZ, (char *)&win);
+ if (openpty(&master, &slave, NULL, &tt, &win) < 0)
+ {
+ const char *s = _("Can not write log, openpty() "
+ "failed (/dev/pts not mounted?)\n");
+ fprintf(stderr, "%s",s);
+ fprintf(term_out, "%s",s);
+ master = slave = -1;
+ } else {
+ struct termios rtt;
+ rtt = tt;
+ cfmakeraw(&rtt);
+ rtt.c_lflag &= ~ECHO;
+ // block SIGTTOU during tcsetattr to prevent a hang if
+ // the process is a member of the background process group
+ // http://www.opengroup.org/onlinepubs/000095399/functions/tcsetattr.html
+ sigemptyset(&sigmask);
+ sigaddset(&sigmask, SIGTTOU);
+ sigprocmask(SIG_BLOCK,&sigmask, &original_sigmask);
+ tcsetattr(0, TCSAFLUSH, &rtt);
+ sigprocmask(SIG_SETMASK, &original_sigmask, 0);
+ }
}
// Fork dpkg
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);
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) {
// 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");
-apt (0.7.22.4) unstable; urgency=low
+apt (0.7.24) UNRELEASED; urgency=low
- -- Michael Vogt <michael.vogt@ubuntu.com> Mon, 31 Aug 2009 11:08:03 +0200
+ [ Nicolas François ]
+ * Cleaned up the first patch draft from KURASAWA Nozomu to finally
+ get po4a support for translating the man pages.
+ Many thanks to both for this excellent work! (Closes: #441608)
+ * doc/ja/*, doc/po/ja.po:
+ - remove the old ja man page translation and replace it with
+ the new po4a-powered translation by KURASAWA Nozomu.
+ * doc/*.?.xml (manpages):
+ - add contrib to author tags and also add refmiscinfo to fix warnings
+ * doc/style.txt, buildlib/defaults.mak, buildlib/manpage.mak:
+ - fix a few typos in the comments of this files
+
++ [ Michael Vogt ]
+ * apt-pkg/deb/dpkgpm.cc:
+ - when tcgetattr() returns non-zero skip all pty magic
+ (thanks to Simon Richter, closes: #509866)
+ * apt-inst/contrib/arfile.cc:
+ - show propper error message for Invalid archive members
+
+ [ David Kalnischkies ]
+ * doc/Doxyfile.in:
+ - update file with doxygen 1.6.1 (current unstable)
+ - activate DOT_MULTI_TARGETS, it is default on since doxygen 1.5.9
+ * buildlib/po4a_manpage.mak, doc/makefile, configure:
+ - simplify the makefiles needed for po4a manpages
+ * apt-pkg/contrib/configuration.cc:
+ - add a helper to easily get a vector of strings from the config
+ * apt-pkg/contrib/strutl.cc:
+ - replace unknown multibytes with ? in UTF8ToCharset (Closes: #545208)
+ * doc/apt-get.8.xml:
+ - fix two little typos in the --simulate description.
+ * apt-pkg/aptconfiguration.cc, doc/apt.conf.5.xml:
+ - add an order subgroup to the compression types to simplify reordering
+ a bit and improve the documentation for this option group.
+ * doc/apt.ent, all man pages:
+ - move the description of files to globally usable entities
+ * doc/apt_preferences.5.xml:
+ - document the new preferences.d folder (Closes: #544017)
+ * methods/rred.cc:
+ - add at the top without failing (by Bernhard R. Link, Closes: #545694)
+ * buildlib/sizetable:
+ - add amd64 for cross building (by Mikhail Gusarov, Closes: #513058)
+ * debian/prerm:
+ - remove file as nobody will upgrade from 0.4.10 anymore
+ * debian/control:
+ - remove gnome-apt suggestion as it was removed from debian
+ * apt-pkg/deb/dpkgpm.cc, apt-pkg/packagemanager.cc, apt-pkg/orderlist.cc:
+ - add and document _experimental_ options to make (aggressive)
+ use of dpkg's trigger and configuration handling (Closes: #473461)
+
+ [ Christian Perrier ]
+ * doc/fr/*, doc/po/fr.po:
+ - remove the old fr man page translation and replace it with
+ the new po4a-powered translation
+ * doc/pl, doc/de: dropped (pl translation is useless as the translated
+ document is not provideed anymore and the de translation is too
+ incomplete to be used)
+
+ -- David Kalnischkies <kalnischkies@gmail.com> Fri, 28 Aug 2009 09:40:08 +0200
+
+apt (0.7.23.1) unstable; urgency=low
+
+ [ Michael Vogt ]
+ * apt-pkg/pkgcache.cc:
+ - do not set internel "needs-configure" state for packages in
+ triggers-pending state. dpkg will deal with the trigger and
+ it if does it before we trigger it, dpkg will error out
+ (LP: #414631)
+ * apt-pkg/acquire-item.cc:
+ - do not segfault on invalid items (closes: #544080)
-apt (0.7.22.3) UNRELEASED; urgency=low
+ -- Michael Vogt <mvo@debian.org> Fri, 28 Aug 2009 21:53:20 +0200
+
+apt (0.7.23) unstable; urgency=low
[ Eugene V. Lyubimkin ]
* methods/{http,https,ftp}, doc/apt.conf.5.xml:
mentioned above are not specified.
(Closes: #445985, #157759, #320184, #365880, #479617)
- [ Michael Vogt ]
- * apt-pkg/pkgcache.cc:
- - do not set internel "needs-configure" state for packages in
- triggers-pending state. dpkg will deal with the trigger and
- it if does it before we trigger it, dpkg will error out
- (LP: #414631)
+ [ David Kalnischkies ]
+ * cmdline/apt-get.cc:
+ - add APT::Get::HideAutoRemove=small to display only a short line
+ instead of the full package list. (Closes: #537450)
+ - ShowBroken() in build-dep (by Mike O'Connor, Closes: #145916)
+ - check for statfs.f_type (by Robert Millan, Closes: #509313)
+ - correct the order of picked package binary vs source in source
+ - use SourceVersion instead of the BinaryVersion to get the source
+ Patch by Matt Kraai, thanks! (Closes: #382826)
+ - add pkg/archive and codename in source (Closes: #414105, #441178)
+ * apt-pkg/contrib/strutl.cc:
+ - enable thousand separator according to the current locale
+ (by Luca Bruno, Closes: #223712)
+ * doc/apt.conf.5.xml:
+ - mention the apt.conf.d dir (by Vincent McIntyre, Closes: #520831)
+ * apt-inst/contrib/arfile.cc:
+ - use sizeof instead strlen (by Marius Vollmer, Closes: #504325)
+ * doc/apt-mark.8.xml:
+ - improve manpage based on patch by Carl Chenet (Closes: #510286)
+ * apt-pkg/acquire-item.cc:
+ - use configsettings for dynamic compression type use and order.
+ Based on a patch by Jyrki Muukkonen, thanks! (LP: #71746)
+ * apt-pkg/aptconfiguration.cc:
+ - add default configuration for compression types and add lzma
+ support. Order is now bzip2, lzma, gzip, none (Closes: #510526)
+ * ftparchive/writer.cc:
+ - add lzma support also here, patch for this (and inspiration for
+ the one above) by Robert Millan, thanks!
+ * apt-pkg/depcache.cc:
+ - restore the --ignore-hold effect in the Is{Delete,Install}Ok hooks
+ * doc/apt-get.8.xml:
+ - update the source description to reflect what it actually does
+ and how it can be used. (Closes: #413021)
+ * methods/http.cc:
+ - allow empty Reason-Phase in Status-Line to please squid,
+ thanks Modestas Vainius for noticing! (Closes: #531157, LP: #411435)
+
+ [ George Danchev ]
+ * cmdline/apt-cache.cc:
+ - fix a memory leak in the xvcg method (Closes: #511557)
+ * apt-pkg/indexcopy.cc:
+ - fix a memory leak then the Release file not exists (Closes: #511556)
- -- Michael Vogt <mvo@debian.org> Wed, 19 Aug 2009 11:14:15 +0200
+ -- Michael Vogt <mvo@debian.org> Thu, 27 Aug 2009 14:44:39 +0200
apt (0.7.22.2) unstable; urgency=low
(off by default)
- send "dpkg-exec" message on the status fd when dpkg is run
- provide DPkg::Chroot-Directory config option (useful for testing)
- - fix potential hang when in a backgroud process group
+ - fix potential hang when in a background process group
* apt-pkg/algorithms.cc:
- consider recommends when making the scores for the problem
resolver
* apt-pkg/deb/debsystem.cc:
- make strings i18n able
* fix problematic use of tolower() when calculating the version
- hash by using locale independant tolower_ascii() function.
+ hash by using locale independent tolower_ascii() function.
Thanks to M. Vefa Bicakci (LP: #80248)
* build fixes for g++-4.4
* cmdline/apt-mark: