[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [buildd-tools-devel] apt-get option to keep dummy packages



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


Reply to: