Package: devscripts
Version: 2.14.2
Severity: normal
Hi.
'mk-build-deps -i' attempts to install the build-deps package this tool
builds. It does this by running
dpkg --unpack
apt-get --no-install-recommends just_built.deb
mk-build-deps then looks at the return code of apt-get to determine if
the command succeeded. This apt-get command is interactive, and will ask
the user to confirm. If the user says no, mk-build-deps knows that
apt-get failed. This is fine.
I want to run this non-interactively, so I invoke mk-build-deps with '-t
"apt-get -y --no-install-recommend". With this command, if it's
impossible to install the new package, apt-get will automatically remove
it, and return a SUCCESSFULL error code, even though the action that
mk-build-deps was asked to perform failed.
I'm attaching a patch that explicitly checks if the packages we were
asked to install actually did get installed. If they were not, it
outputs a very explicit error message.
--- /tmp/devscripts/scripts/mk-build-deps.pl Sat Jul 19 02:24:02 2014
+++ /tmp/ediff29490DaW Sat Jul 19 17:37:28 2014
@@ -353,11 +353,25 @@
system @root, 'dpkg', '--unpack', @deb_files;
die("$progname: dpkg --unpack failed\n") if ( ($?>>8) != 0 );
system @root, shellwords($install_tool), '-f', 'install';
- if ( ($?>>8) != 0 ) {
+ my $err = $? >> 8;
+ if ( !$err ) {
+ # APT succeeded. Did the packages get installed? It's possible that they
+ # didn't because APT may have realized that installation was impossible,
+ # and it could have given up, successfully.
+ for my $deb (@deb_files) {
+ system(qw(dpkg -l $deb 2>/dev/null));
+ if($? >> 8) {
+ $err = 1;
+ last;
+ }
+ }
+ }
+
+ if ( $err ) {
# Restore system to previous state, since apt wasn't able to resolve a
# proper way to get the build-dep packages installed
system @root, 'dpkg', '--remove', @pkg_names;
- die("$progname: apt-get install call failed\n");
+ die("ERROR!!! $progname: APT could not install all of these packages: @deb_files\n");
}
if ($opt_remove) {