Bug#601203: debian-cd: Recommended packages should be included recursively for apt to find
I got a working patch, but while testing and trying to get my patch
working, I discovered that the current handling of NORECOMMENDS=0 is
completely broken.
The Perl code in sort_deps to read this value look like this:
my $norecommends = $ENV{'NORECOMMENDS'} || 1;
When one ask for recommended packages to be included, the
$ENV{'NORECOMMENDS'} content resolve to "0" which is false for perl
and thus trigger the '|| 1' part, causing the opposite of the intended
effect.
This patch seem to solve this:
diff -urw debian-cd.unpatched.squeeze/tools/sort_deps debian-cd/tools/sort_deps
--- debian-cd.unpatched.squeeze/tools/sort_deps 2010-10-23 08:48:16.000000000 +02
00
+++ debian-cd/tools/sort_deps 2010-10-26 00:01:04.000000000 +0200
@@ -21,7 +21,7 @@
my $force_firmware = $ENV{'FORCE_FIRMWARE'} || 0;
my $local = $ENV{'LOCAL'} || 0;
my $complete = $ENV{'COMPLETE'} || 0;
-my $norecommends = $ENV{'NORECOMMENDS'} || 1;
+my $norecommends = (defined $ENV{'NORECOMMENDS'} ? $ENV{'NORECOMMENDS'} : 1);
my $nosuggests = $ENV{'NOSUGGESTS'} || 1;
my $apt = "$ENV{'BASEDIR'}/tools/apt-selection";
Here is the complete patch to add recommended packages, including lots
of debug output I added to try to figure out why everything I tried
failed. I'll provide a cleaner patch as soon as possible, but thought
it best to get feedback on the current changes.
diff -urw debian-cd.unpatched.squeeze/tools/sort_deps debian-cd/tools/sort_deps
--- debian-cd.unpatched.squeeze/tools/sort_deps 2010-10-23 08:48:16.000000000 +0200
+++ debian-cd/tools/sort_deps 2010-10-26 00:01:04.000000000 +0200
@@ -21,7 +21,7 @@
my $force_firmware = $ENV{'FORCE_FIRMWARE'} || 0;
my $local = $ENV{'LOCAL'} || 0;
my $complete = $ENV{'COMPLETE'} || 0;
-my $norecommends = $ENV{'NORECOMMENDS'} || 1;
+my $norecommends = (defined $ENV{'NORECOMMENDS'} ? $ENV{'NORECOMMENDS'} : 1);
my $nosuggests = $ENV{'NOSUGGESTS'} || 1;
my $apt = "$ENV{'BASEDIR'}/tools/apt-selection";
@@ -50,7 +50,7 @@
my %excluded;
my %packages;
-msg(0, "Running sort_deps to sort packages for $arch:\n");
+msg(0, "Running sort_deps to sort packages for $arch (edu):\n");
msg(1, "======================================================================
Here are the settings you've chosen for making the list:
Architecture: $arch
@@ -63,6 +63,8 @@
msg(1, yesno($nonfree)."\n");
msg(1, "Force inclusion of firmware packages: ");
msg(1, yesno($force_firmware)."\n");
+msg(1, "Include recommended packages: ");
+msg(1, yesno(!$norecommends)."\n");
msg(1, "======================================================================
");
@@ -449,7 +451,7 @@
}
# Get all dependencies (not yet included) of each package
- my (@dep) = (get_missing ($p));
+ my (@dep) = (get_missing ($p, $add_rec));
# Stop here if apt failed
if (not scalar(@dep)) {
@@ -477,7 +479,7 @@
if ($add_rec) {
#TODO: Look for recommends (not yet included !!)
- add_recommends (\@dep);
+ add_recommends (\@dep, $add_rec);
# Check again but doesn't fail if one of the package cannot be
# installed, just ignore it (it will be removed from @dep)
($ok, $reasons) = check_list (\@dep, 0);
@@ -520,30 +522,38 @@
my @copy = @{$list}; # A copy is needed since I'll modify the array
foreach $p (@copy) {
- add_missing($list, $packages{$p}{"Suggests"}, $p);
+ add_missing($list, $packages{$p}{"Suggests"}, $p, 0);
}
}
sub add_recommends {
my $list = shift;
+ my $add_rec = shift; # Do we look for recommends
my $p; # = shift;
my @copy = @{$list}; # A copy is needed since I'll modify the array
foreach $p (@copy) {
- add_missing($list, $packages{$p}{"Recommends"}, $p);
+ add_missing($list, $packages{$p}{"Recommends"}, $p, $add_rec);
}
}
sub get_missing {
my $p = shift;
+ my $add_rec = shift; # Do we look for recommends
my @list = ();
- if (not add_missing (\@list, $packages{$p}{"Depends"}, $p)) {
+ msg(0, "Looking for Depends for $p (add-rec = $add_rec)\n");
+ if (not add_missing (\@list, $packages{$p}{"Depends"}, $p, $add_rec)) {
return ();
}
+ if ($add_rec) {
+ msg(0, "Looking for Recommends for $p\n");
+ add_missing (\@list, $packages{$p}{"Recommends"}, $p, $add_rec);
+ }
+
remove_entry($p, \@list);
push @list, $p;
return (@list);
@@ -554,6 +564,7 @@
my $list = shift;
my $new = shift;
my $pkgin = shift;
+ my $add_rec = shift; # Do we look for recommends
my @backup = @{$list};
my $ok = 1;
@@ -596,7 +607,7 @@
# Stop after the first package that is
# added successfully
push (@{$list}, $pkg);
- if (add_missing ($list, $packages{$pkg}{"Depends"}, $pkg)) {
+ if (add_missing ($list, $packages{$pkg}{"Depends"}, $pkg, $add_rec)) {
$or_ok = 1;
remove_entry($pkg, $list);
push @{$list}, $pkg;
@@ -622,11 +633,16 @@
next if $included{lc $_}; # Already included, don't worry
next if is_in (lc $_, $list);
push @{$list}, lc $_;
- if (not add_missing ($list, $packages{lc $_}{"Depends"}, lc $_)) {
+ if (not add_missing ($list, $packages{lc $_}{"Depends"}, lc $_, $add_rec)) {
msg(1, "couldn't add $_ ...\n");
msg(1, "$pkgin failed, couldn't satisfy dep on $_\n");
pop @{$list};
$ok = 0;
+ } elsif ($add_rec) {
+ my $reclist = $packages{lc $_}{"Recommends"};
+ msg(0, "trying to add recommends $reclist ...\n");
+ # depends added successfully, add recommends too
+ add_missing ($list, $reclist, lc $_, $add_rec);
}
remove_entry(lc $_, $list);
push @{$list}, lc $_;
Happy hacking,
--
Petter Reinholdtsen
Reply to: