Bug#473461: apt-get should also have a --no-triggers option
On Wed, May 21, 2008 at 09:10:19PM -0400, Joey Hess wrote:
> When you're implementing this, please add a --no-triggers option (or
> something like that) to apt. This will be useful for things like d-i
> that call apt multiple times. Then triggers can be skipped during the
> multiple apt runs, and run once at the end.
The attached patch should implement supression of triggers with -o
DPkg::NoTriggers=true. It also adds --no-triggers to all but the
latest dpkg run as outlined in the triggers.txt dpkg documentation.
I'm a bit nervos adding it to the debian-sid apt branch right now, I
would like to do some more testing first to see if it does not
break. Feedback is very welcome of course.
Cheers,
Michael
=== modified file 'apt-pkg/deb/dpkgpm.cc'
--- apt-pkg/deb/dpkgpm.cc 2008-01-31 09:06:00 +0000
+++ apt-pkg/deb/dpkgpm.cc 2008-05-28 12:33:24 +0000
@@ -526,6 +526,11 @@
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::NoTriggers",false) == false)
+ List.push_back(Item(Item::Triggers,PkgIterator()));
// map the dpkg states to the operations that are performed
// (this is sorted in the same way as Item::Ops)
@@ -572,6 +577,8 @@
// and the PackageOpsTranslations (human readable strings)
for (vector<Item>::iterator I = List.begin(); I != List.end();I++)
{
+ if((*I).Pkg.end())
+ continue;
string name = (*I).Pkg.Name();
PackageOpsDone[name] = 0;
for(int i=0; (DpkgStatesOpMap[(*I).Op][i]).state != NULL; i++)
@@ -649,6 +656,7 @@
case Item::Configure:
Args[n++] = "--configure";
+ Args[n++] = "--no-triggers";
Size += strlen(Args[n-1]);
break;
@@ -658,6 +666,11 @@
Args[n++] = "--auto-deconfigure";
Size += strlen(Args[n-1]);
break;
+
+ case Item::Triggers:
+ Args[n++] = "--configure";
+ Args[n++] = "--pending";
+ break;
}
// Write in the file or package names
@@ -675,6 +688,8 @@
{
for (;I != J && Size < MaxArgBytes; I++)
{
+ if(I->Pkg.end())
+ continue;
Args[n++] = I->Pkg.Name();
Size += strlen(Args[n-1]);
}
=== modified file 'apt-pkg/deb/dpkgpm.h'
--- apt-pkg/deb/dpkgpm.h 2008-01-04 20:33:09 +0000
+++ apt-pkg/deb/dpkgpm.h 2008-05-28 12:21:50 +0000
@@ -53,7 +53,7 @@
struct Item
{
- enum Ops {Install, Configure, Remove, Purge} Op;
+ enum Ops {Install, Configure, Remove, Purge, Triggers} Op;
string File;
PkgIterator Pkg;
Item(Ops Op,PkgIterator Pkg,string File = "") : Op(Op),
Reply to: