Просмотр исходного кода

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
Родитель
Сommit
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)
       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
    // cases like d-i that runs the triggers handling manually
    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()));
 
    // for the progress
    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;
 
    // 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:testing:50.0000: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
 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:testing:50.0000: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
 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:testing:50.0000: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
 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:testing2:50.0000: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

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

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

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

@@ -16,12 +16,15 @@ setupaptarchive
 
 testqualifier() {
 	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
 		msgpass
 	else
-		echo
-		echo "$GIVEN"
+		cat >&2 testqualifier.output
+		echo >&2
+		echo >&2 "$GIVEN"
 		msgfail
 	fi
 }

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

@@ -59,8 +59,7 @@ startup packages configure
 configure $PKGNAME 1.0 <none>
 status unpacked $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