On Thu, Nov 18, 2010 at 03:37:13PM +0100, David Kalnischkies wrote: > On Thu, Nov 18, 2010 at 15:14, Andres Mejia <mcitadel@gmail.com> wrote: > > The way the apt and aptitude resolvers work in sbuild is that a dummy package > > is created which has all Build-Depends and Build-Conflicts listed as Depends > > and Conflicts for the dummy package. This dummy package is then forced to be > > installed using 'dpkg --force-depends --force-conflicts'. Afterwards, at least > > in the case with apt, an 'apt-get -yf install' is run to resolve system > > dependencies. The result that's expected is that all build dependencies are > > installed. > > > > What happens in some situations is that apt removes the dummy package instead. > > We want apt-get to refuse to give a solution resulting in the dummy package > > being removed. > > Have you tried setting the dummy package on hold with dpkg? Interestingly, I've tried this and it breaks! This is the sequence of events: dpkg --force-depends --force-conflicts --install $dummy hold $dummy apt-get -yf install unhold $dummy [then build and revert state] the apt-get command doesn't install or remove any dependencies here; it just says 0 to install 0 to remove etc. However... If the exact same sequence is repeated /with the old dummy package stil installed/, that is, so it's upgraded rather than installed from scratch, it then works! Not entirely sure what's going on here at the moment, but holding the package does seem to make apt behave oddly; maybe it assumes the deps are already met if on hold? Andres, I've attached the patch to enable hold/unhold of the dummy package(s). Regards, Roger diff --git a/bin/sbuild-hold b/bin/sbuild-hold index 329d273..3fe7899 100755 --- a/bin/sbuild-hold +++ b/bin/sbuild-hold @@ -25,7 +25,7 @@ use warnings; use Getopt::Long; use Sbuild qw(help_text version_text usage_error); use Sbuild::Utility qw(setup cleanup shutdown); -use Sbuild::ChrootSetup qw(list_packages set_package_status); +use Sbuild::ChrootSetup qw(hold_packages list_packages); use Sbuild::Conf; use Sbuild::OptionsBase; @@ -48,7 +48,7 @@ foreach (@ARGV) { } print STDOUT ".\n\n"; -my $status = set_package_status($session, $conf, "hold", @ARGV); +my $status = hold_packages($session, $conf, @ARGV); $status >>= 8; list_packages($session, $conf, @ARGV); diff --git a/bin/sbuild-unhold b/bin/sbuild-unhold index 98877f3..0e3ebee 100755 --- a/bin/sbuild-unhold +++ b/bin/sbuild-unhold @@ -25,7 +25,7 @@ use warnings; use Getopt::Long; use Sbuild qw(help_text version_text usage_error); use Sbuild::Utility qw(setup cleanup shutdown); -use Sbuild::ChrootSetup qw(list_packages set_package_status); +use Sbuild::ChrootSetup qw(unhold_packages list_packages); use Sbuild::Conf; use Sbuild::OptionsBase; @@ -48,7 +48,7 @@ foreach (@ARGV) { } print STDOUT ".\n\n"; -my $status = set_package_status($session, $conf, "install", @ARGV); +my $status = unhold_packages($session, $conf, @ARGV); $status >>= 8; list_packages($session, $conf, @ARGV); diff --git a/lib/Sbuild/AptResolver.pm b/lib/Sbuild/AptResolver.pm index 47948bf..1b70746 100644 --- a/lib/Sbuild/AptResolver.pm +++ b/lib/Sbuild/AptResolver.pm @@ -27,6 +27,7 @@ use File::Temp qw(tempdir); use Sbuild::Deps qw(deps_parse); use Sbuild qw(debug copy version_compare); +use Sbuild::ChrootSetup qw(hold_packages unhold_packages); use Sbuild::Base; use Sbuild::ResolverBase; @@ -162,6 +163,8 @@ EOF goto package_cleanup; } + hold_packages($session, $self->get('Config'), $dummy_pkg_name); + my (@instd, @rmvd); $builder->log("Installing build dependencies\n"); if (!$self->run_apt("-yf", \@instd, \@rmvd, 'install')) { @@ -181,6 +184,8 @@ EOF $status = 1; package_cleanup: + unhold_packages($session, $self->get('Config'), $dummy_pkg_name); + if ($status == 0) { if (defined ($session->get('Session Purged')) && $session->get('Session Purged') == 1) { diff --git a/lib/Sbuild/ChrootSetup.pm b/lib/Sbuild/ChrootSetup.pm index ec85c81..9bed145 100644 --- a/lib/Sbuild/ChrootSetup.pm +++ b/lib/Sbuild/ChrootSetup.pm @@ -31,8 +31,9 @@ BEGIN { @ISA = qw(Exporter); - @EXPORT = qw(update upgrade distupgrade clean autoclean autoremove basesetup - shell list_packages set_package_status); + @EXPORT = qw(update upgrade distupgrade clean autoclean autoremove + basesetup shell hold_packages unhold_packages + list_packages set_package_status); } sub update ($$); @@ -246,6 +247,24 @@ sub shell ($$) { return $? } +sub hold_packages ($$@) { + my $session = shift; + my $conf = shift; + + my $status = set_package_status($session, $conf, "hold", @_); + + return $status; +} + +sub unhold_packages ($$@) { + my $session = shift; + my $conf = shift; + + my $status = set_package_status($session, $conf, "install", @_); + + return $status; +} + sub list_packages ($$@) { my $session = shift; my $conf = shift; -- .''`. 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.
Attachment:
signature.asc
Description: Digital signature