tags 588818 + patch
thanks

On Mon, Jul 12, 2010 at 05:46:50PM +0200, Cyril Brulebois wrote:
> as mentioned earlier, DEBIAN_FRONTEND doesn't get set to noninteractive
> when using the aptitude resolver. The internal one uses run_apt, which
> takes care of setting a sane(r) environment, while the aptitude one
> calls aptitude directly, w/o setting DEBIAN_FRONTEND=noninteractive in
> the environment.
> 
> That broke building a package pulling some debconf-using
> build-dependencies, and interrupting the build broke the chroots,
> meaning manual cleanup. Hence the severity.

I've attached a proof of concept patch to fix this.  Please could
you give it a try?  It's possible it needs a bit of tweaking; I'm
afraid I'm pushed for time so it's untested tonight.

Essentially, we add explicit support for Aptitude to Sbuild::Chroot
so that there are pipe_aptitude_command etc. methods just like
pipe_apt_command.  These take care of setting up common aptitude
options and work just as for apt-get.  Note I'm not sure if it
respects all of the apt-get options such as Dir::State, DPkg::Options
and DPkg::Run-Directory which are essential for $chroot_mode="split".
If you could verify that works too, I would appreciate it.


Regards,
Roger

-- 
  .''`.  Roger Leigh
 : :' :  Debian GNU/Linux             http://people.debian.org/~rleigh/
 `. `'   Printing on GNU/Linux?       http://gutenprint.sourceforge.net/
   `-    GPG Public Key: 0x25BFB848   Please GPG sign your mail.
diff --git a/configure.ac b/configure.ac
index 8214a5d..0ac8d48 100644
--- a/configure.ac
+++ b/configure.ac
@@ -85,6 +85,7 @@ fi
 
 # Checks for programs.
 AC_PATH_PROG([APT_CACHE], [apt-cache])
+AC_PATH_PROG([APTITUDE], [aptitude])
 AC_PATH_PROG([APT_GET], [apt-get])
 AC_PATH_PROG([CHMOD], [chmod])
 AC_PATH_PROG([DATE], [date])
diff --git a/debian/rules b/debian/rules
index aee0b55..55561ff 100755
--- a/debian/rules
+++ b/debian/rules
@@ -16,7 +16,8 @@ debian/build/config.status: configure
 	  DCMD=/usr/bin/dcmd \
 	  SCHROOT=/usr/bin/schroot \
 	  SSH=/usr/bin/ssh \
-	  SUDO=/usr/bin/sudo
+	  SUDO=/usr/bin/sudo \
+	  APTITUDE=/usr/bin/aptitude
 
 build: debian/build/config.status debian/build-stamp
 debian/build-stamp:  debian/build/config.status
diff --git a/lib/Sbuild/AptitudeBuildDepSatisfier.pm b/lib/Sbuild/AptitudeBuildDepSatisfier.pm
index e1c68f9..0685c00 100644
--- a/lib/Sbuild/AptitudeBuildDepSatisfier.pm
+++ b/lib/Sbuild/AptitudeBuildDepSatisfier.pm
@@ -149,11 +149,11 @@ EOF
     my @non_default_deps = $self->get_non_default_deps($dep, {});
 
     my @aptitude_install_command = (
-	'aptitude', 
-	'-y', 
-	'--without-recommends', 
-	'-o', 'APT::Install-Recommends=false', 
-	'-o', 'Aptitude::ProblemResolver::StepScore=100', 
+	$self->get_conf('APTITUDE'),
+	'-y',
+	'--without-recommends',
+	'-o', 'APT::Install-Recommends=false',
+	'-o', 'Aptitude::ProblemResolver::StepScore=100',
 	'-o', "Aptitude::ProblemResolver::Hints::KeepDummy=reject $dummy_pkg_name :UNINST",
 	'-o', 'Aptitude::ProblemResolver::Keep-All-Tier=55000',
 	'-o', 'Aptitude::ProblemResolver::Remove-Essential-Tier=maximum',
@@ -164,8 +164,9 @@ EOF
 
     $builder->log(join(" ", @aptitude_install_command), "\n");
 
-    my $pipe = $session->pipe_command(
+    my $pipe = $session->pipe_aptitude_command(
 	    { COMMAND => \...@aptitude_install_command,
+	      ENV => {'DEBIAN_FRONTEND' => 'noninteractive'},
 	      PIPE => 'in',
 	      USER => 'root',
 	      CHROOT => 1,
diff --git a/lib/Sbuild/Chroot.pm b/lib/Sbuild/Chroot.pm
index b27c6de..5f06986 100644
--- a/lib/Sbuild/Chroot.pm
+++ b/lib/Sbuild/Chroot.pm
@@ -132,11 +132,17 @@ sub _setup_options {
 		    '-o', "DPkg::Options::=--root=$chroot_dir",
 		    '-o', "DPkg::Run-Directory=$chroot_dir"]);
 
+	$self->set('Aptitude Options',
+		   ['-o', "Dir::State::status=$chroot_dir/var/lib/dpkg/status",
+		    '-o', "DPkg::Options::=--root=$chroot_dir",
+		    '-o', "DPkg::Run-Directory=$chroot_dir"]);
+
 	# sudo uses an absolute path on the host system.
 	$self->get('Defaults')->{'ENV'}->{'APT_CONFIG'} =
 	    $self->get('Chroot APT Conf');
     } else { # no split
 	$self->set('APT Options', []);
+	$self->set('Aptitude Options', []);
 	$self->get('Defaults')->{'ENV'}->{'APT_CONFIG'} =
 	    $self->get('APT Conf');
     }
@@ -404,6 +410,55 @@ sub pipe_apt_command {
     return $self->pipe_command_internal($options);
 }
 
+sub get_aptitude_command_internal {
+    my $self = shift;
+    my $options = shift;
+
+    my $command = $options->{'COMMAND'};
+    my $apt_options = $self->get('Aptitude Options');
+
+    debug("Aptitude Options: ", join(" ", @$apt_options), "\n")
+	if defined($apt_options);
+
+    my @aptcommand = ();
+    if (defined($apt_options)) {
+	push(@aptcommand, @{$command}[0]);
+	push(@aptcommand, @$apt_options);
+	if ($#$command > 0) {
+	    push(@aptcommand, @{$command}[1 .. $#$command]);
+	}
+    } else {
+	@aptcommand = @$command;
+    }
+
+    debug("APT Command: ", join(" ", @aptcommand), "\n");
+
+    $options->{'CHROOT'} = $self->apt_chroot();
+    $options->{'CHDIR_CHROOT'} = !$options->{'CHROOT'};
+
+    $options->{'INTCOMMAND'} = \...@aptcommand;
+}
+
+sub run_aptitude_command {
+    my $self = shift;
+    my $options = shift;
+
+    # Set modfied command
+    $self->get_aptitude_command_internal($options);
+
+    return $self->run_command_internal($options);
+}
+
+sub pipe_aptitude_command {
+    my $self = shift;
+    my $options = shift;
+
+    # Set modfied command
+    $self->get_aptitude_command_internal($options);
+
+    return $self->pipe_command_internal($options);
+}
+
 sub apt_chroot {
     my $self = shift;
 
diff --git a/lib/Sbuild/Conf.pm b/lib/Sbuild/Conf.pm
index c3f895e..3003290 100644
--- a/lib/Sbuild/Conf.pm
+++ b/lib/Sbuild/Conf.pm
@@ -166,6 +166,10 @@ sub init_allowed_keys {
 	    CHECK => $validate_program,
 	    DEFAULT => $Sbuild::Sysconfig::programs{'APT_CACHE'}
 	},
+	'APTITUDE'				=> {
+	    CHECK => $validate_program,
+	    DEFAULT => $Sbuild::Sysconfig::programs{'APTITUDE'}
+	},
 	'DPKG_BUILDPACKAGE_USER_OPTIONS'	=> {
 	    DEFAULT => []
 	},
@@ -505,6 +509,7 @@ sub read_config {
     my $fakeroot = undef;
     my $apt_get = undef;
     my $apt_cache = undef;
+    my $aptitude = undef;
     my $dpkg_source = undef;
     my $dcmd = undef;
     my $md5sum = undef;
@@ -592,6 +597,7 @@ sub read_config {
     $self->set('FAKEROOT', $fakeroot);
     $self->set('APT_GET', $apt_get);
     $self->set('APT_CACHE', $apt_cache);
+    $self->set('APTITUDE', $aptitude);
     $self->set('DPKG_SOURCE', $dpkg_source);
     $self->set('DCMD', $dcmd);
     $self->set('MD5SUM', $md5sum);
diff --git a/lib/Sbuild/Sysconfig.pm.in b/lib/Sbuild/Sysconfig.pm.in
index d78f9ba..720a639 100644
--- a/lib/Sbuild/Sysconfig.pm.in
+++ b/lib/Sbuild/Sysconfig.pm.in
@@ -85,6 +85,7 @@ our %paths = (
 # Programs:
 our %programs = (
     'APT_CACHE' => '@APT_CACHE@',
+    'APTITUDE' => '@APTITUDE@',
     'APT_GET' => '@APT_GET@',
     'CHMOD' => '@CHMOD@',
     'DATE' => '@DATE@',

Attachment: signature.asc
Description: Digital signature

Reply via email to