Преглед на файлове

don't explicitly configure the last round of packages

We end our operation by calling "dpkg --configure -a", so instead of
running a (big) configure run with all packages mentioned explicitly
before this, we simply skip them and let them be handled by this call
implicitly.

There isn't really an observeable gain to be had here from a speed
point, but it helps in avoiding an (uncommon) problem of having a too
long commandline passed to dpkg, which we would split up (probably
incorrectly).
David Kalnischkies преди 10 години
родител
ревизия
b4450f1dd6

+ 14 - 1
apt-pkg/deb/dpkgpm.cc

@@ -1248,15 +1248,28 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
    if (RunScriptsWithPkgs("DPkg::Pre-Install-Pkgs") == false)
    if (RunScriptsWithPkgs("DPkg::Pre-Install-Pkgs") == false)
       return false;
       return false;
 
 
+   decltype(List)::const_iterator::difference_type const notconfidx =
+      _config->FindB("Dpkg::ExplicitLastConfigure", false) ? std::numeric_limits<decltype(notconfidx)>::max() :
+      std::distance(List.cbegin(), std::find_if_not(List.crbegin(), List.crend(), [](Item const &i) { return i.Op == Item::Configure; }).base());
+
    // support subpressing of triggers processing for special
    // support subpressing of triggers processing for special
    // cases like d-i that runs the triggers handling manually
    // cases like d-i that runs the triggers handling manually
    bool const TriggersPending = _config->FindB("DPkg::TriggersPending", false);
    bool const TriggersPending = _config->FindB("DPkg::TriggersPending", false);
-   if (_config->FindB("DPkg::ConfigurePending", true) == true)
+   bool const ConfigurePending = _config->FindB("DPkg::ConfigurePending", true);
+   if (ConfigurePending)
       List.push_back(Item(Item::ConfigurePending, PkgIterator()));
       List.push_back(Item(Item::ConfigurePending, PkgIterator()));
 
 
    // for the progress
    // for the progress
    BuildPackagesProgressMap();
    BuildPackagesProgressMap();
 
 
+   if (notconfidx != std::numeric_limits<decltype(notconfidx)>::max())
+   {
+      if (ConfigurePending)
+	 List.erase(std::next(List.cbegin(), notconfidx), std::prev(List.cend()));
+      else
+	 List.erase(std::next(List.cbegin(), notconfidx), List.cend());
+   }
+
    d->stdin_is_dev_null = false;
    d->stdin_is_dev_null = false;
 
 
    // create log
    // create log

+ 4 - 8
test/integration/test-apt-progress-fd

@@ -25,8 +25,7 @@ pmstatus:testing:50.0000:Preparing to configure testing (amd64)
 pmstatus:dpkg-exec:50.0000:Running dpkg
 pmstatus:dpkg-exec:50.0000:Running dpkg
 pmstatus:testing:50.0000:Configuring testing (amd64)
 pmstatus:testing:50.0000:Configuring testing (amd64)
 pmstatus:testing:66.6667:Configuring testing (amd64)
 pmstatus:testing:66.6667:Configuring testing (amd64)
-pmstatus:testing:83.3333:Installed testing (amd64)
-pmstatus:dpkg-exec:83.3333:Running dpkg'
+pmstatus:testing:83.3333:Installed testing (amd64)'
 
 
 # upgrade
 # upgrade
 exec 3> apt-progress.log
 exec 3> apt-progress.log
@@ -41,8 +40,7 @@ pmstatus:testing:50.0000:Preparing to configure testing (amd64)
 pmstatus:dpkg-exec:50.0000:Running dpkg
 pmstatus:dpkg-exec:50.0000:Running dpkg
 pmstatus:testing:50.0000:Configuring testing (amd64)
 pmstatus:testing:50.0000:Configuring testing (amd64)
 pmstatus:testing:66.6667:Configuring testing (amd64)
 pmstatus:testing:66.6667:Configuring testing (amd64)
-pmstatus:testing:83.3333:Installed testing (amd64)
-pmstatus:dpkg-exec:83.3333:Running dpkg'
+pmstatus:testing:83.3333:Installed testing (amd64)'
 
 
 # reinstall
 # reinstall
 exec 3> apt-progress.log
 exec 3> apt-progress.log
@@ -57,8 +55,7 @@ pmstatus:testing:50.0000:Preparing to configure testing (amd64)
 pmstatus:dpkg-exec:50.0000:Running dpkg
 pmstatus:dpkg-exec:50.0000:Running dpkg
 pmstatus:testing:50.0000:Configuring testing (amd64)
 pmstatus:testing:50.0000:Configuring testing (amd64)
 pmstatus:testing:66.6667:Configuring testing (amd64)
 pmstatus:testing:66.6667:Configuring testing (amd64)
-pmstatus:testing:83.3333:Installed testing (amd64)
-pmstatus:dpkg-exec:83.3333:Running dpkg'
+pmstatus:testing:83.3333:Installed testing (amd64)'
 
 
 # and remove
 # and remove
 exec 3> apt-progress.log
 exec 3> apt-progress.log
@@ -83,7 +80,6 @@ pmstatus:testing2:50.0000:Preparing to configure testing2 (i386)
 pmstatus:dpkg-exec:50.0000:Running dpkg
 pmstatus:dpkg-exec:50.0000:Running dpkg
 pmstatus:testing2:50.0000:Configuring testing2 (i386)
 pmstatus:testing2:50.0000:Configuring testing2 (i386)
 pmstatus:testing2:66.6667:Configuring testing2 (i386)
 pmstatus:testing2:66.6667:Configuring testing2 (i386)
-pmstatus:testing2:83.3333:Installed testing2 (i386)
-pmstatus:dpkg-exec:83.3333:Running dpkg'
+pmstatus:testing2:83.3333:Installed testing2 (i386)'
 
 
 rm -f apt-progress*.log
 rm -f apt-progress*.log

+ 0 - 4
test/integration/test-apt-progress-fd-deb822

@@ -58,10 +58,6 @@ Status: progress
 Package: testing:amd64
 Package: testing:amd64
 Percent: 83.3333
 Percent: 83.3333
 Message: Installed testing (amd64)
 Message: Installed testing (amd64)
-
-Status: progress
-Percent: 83.3333
-Message: Running dpkg
 '
 '
 
 
 rm -f apt-progress*.log
 rm -f apt-progress*.log

+ 6 - 3
test/integration/test-dpkg-assert-multi-arch

@@ -16,12 +16,15 @@ setupaptarchive
 
 
 testqualifier() {
 testqualifier() {
 	msgtest 'Test with' $1 'for correct qualifier mode' $2
 	msgtest 'Test with' $1 'for correct qualifier mode' $2
-	GIVEN="$(aptget install $1 -qq -o Debug::pkgDPkgPM=1 2>&1 | grep -v -- '--unpack' | sed -e 's/^.*--[^u][^ ]* \([^ ]*\).*$/\1/')"
+	#aptget install $1 -qq -o Debug::pkgDPkgPM=1 || true
+	aptget install $1 -qq -o Debug::pkgDPkgPM=1 -o Dpkg::ExplicitLastConfigure=1 > testqualifier.output 2>&1 || true
+	GIVEN="$(grep -v -- '--unpack' testqualifier.output | sed -e 's/^.*--[^u][^ ]* \([^ ]*\).*$/\1/')"
 	if [ "$GIVEN" = "$2" ]; then
 	if [ "$GIVEN" = "$2" ]; then
 		msgpass
 		msgpass
 	else
 	else
-		echo
-		echo "$GIVEN"
+		cat >&2 testqualifier.output
+		echo >&2
+		echo >&2 "$GIVEN"
 		msgfail
 		msgfail
 	fi
 	fi
 }
 }

+ 1 - 2
test/integration/test-no-fds-leaked-to-maintainer-scripts

@@ -59,8 +59,7 @@ startup packages configure
 configure $PKGNAME 1.0 <none>
 configure $PKGNAME 1.0 <none>
 status unpacked $PKGNAME 1.0
 status unpacked $PKGNAME 1.0
 status half-configured $PKGNAME 1.0
 status half-configured $PKGNAME 1.0
-status installed $PKGNAME 1.0
-startup packages configure" cut -f 3- -d' ' rootdir/var/log/dpkg.log
+status installed $PKGNAME 1.0" cut -f 3- -d' ' rootdir/var/log/dpkg.log
 }
 }
 checkinstall
 checkinstall