diff options
Diffstat (limited to 'perl-install/pkgs.pm')
-rw-r--r-- | perl-install/pkgs.pm | 77 |
1 files changed, 64 insertions, 13 deletions
diff --git a/perl-install/pkgs.pm b/perl-install/pkgs.pm index 5407cd045..7795a7f8a 100644 --- a/perl-install/pkgs.pm +++ b/perl-install/pkgs.pm @@ -20,33 +20,32 @@ my @skipThesesPackages = qw(XFree86-8514 XFree86-AGX XFree86-FBDev XFree86-Mach3 sub skipThisPackage { member($_[0], @skipThesesPackages) } - sub Package { my ($packages, $name) = @_; $packages->{$name} or die "unknown package $name"; } -sub select($$) { - my ($packages, $name) = @_; - my $p = Package($packages, $name); + +sub select($$;$) { + my ($packages, $p, $base) = @_; $p->{selected} = -1; # selected by user my @l = @{$p->{deps}}; while (@l) { my $n = shift @l; my $i = Package($packages, $n); + $i->{base} = $base; push @l, @{$i->{deps}} unless $i->{selected}; $i->{selected}++ unless $i->{selected} == -1; } } sub unselect($$) { - my ($packages, $name) = @_; - my $p = Package($packages, $name); - my $set = set_new($name); + my ($packages, $p) = @_; + my $set = set_new($p->{name}); my $l = $set->{list}; # get the list of provided packages foreach my $q (@$l) { my $i = Package($packages, $q); - $i->{selected} or next; + $i->{selected} && !$i->{base} or next; $i->{selected} = 1; # that way, its counter will be zero the first time set_add($set, @{$i->{provides} || []}); } @@ -78,12 +77,12 @@ sub unselect($$) { } } sub toggle($$) { - my ($packages, $name) = @_; - Package($packages, $name)->{selected} ? unselect($packages, $name) : &select($packages, $name); + my ($packages, $p) = @_; + $p->{selected} ? unselect($packages, $p) : &select($packages, $p); } sub set($$$) { - my ($packages, $name, $val) = @_; - $val ? &select($packages, $name) : unselect($packages, $name); + my ($packages, $p, $val) = @_; + $val ? &select($packages, $p) : unselect($packages, $p); } sub addInfosFromHeader($$;$) { @@ -116,7 +115,7 @@ sub getDeps($) { my ($packages) = @_; local *F; - open F, install_any::imageGetFile("depslist"); # or die "can't find dependencies list"; + open F, install_any::imageGetFile("depslist") or die "can't find dependencies list"; foreach (<F>) { my ($name, $size, @deps) = split; $packages->{$name}->{size} = $size; @@ -125,6 +124,58 @@ sub getDeps($) { } } +sub readCompss($) { + my ($packages) = @_; + my (@compss, $ps, $category); + + local *F; + open F, install_any::imageGetFile("compss") or die "can't find compss"; + foreach (<F>) { + /^\s*$/ || /^#/ and next; + s/#.*//; + my ($options, $name) = /^(\S*)\s+(.*?)\s*$/ or die "bad line in compss: $_"; + + if ($name =~ /(.*):$/) { + if ($category) { + push @compss, $category; + $ps = []; + } + $category = { options => $options, name => $1, packages => $ps }; + } else { + my $p = $packages->{$name} or log::l("unknown package $name (in compss)"), next; + $p->{options} = $options; + push @$ps, $p; + } + } + [ @compss, $category ]; +} + +sub setCompssSelected($$$) { + my ($compss, $packages, $install_class, $select) = @_; + + my $l = substr($install_class, 0, 1); + my $L = uc $l; + + my $verif_lang = sub { + $_[0] =~ /-([^-]*)$/; + $1 eq $ENV{LANG} || eval { lang::text2lang($1) eq $ENV{LANG} } && !$@; + }; + + foreach my $c (@$compss) { + $c->{show} = bool($c->{options} =~ /($l|\*)/); + my $nb = 0; + foreach my $p (@{$c->{packages}}) { + local $_ = $p->{options}; + $p->{show} = ! (/$L/); + + &select($packages, $p, $p->{base}), $nb++ + if /$l|\*/ && (!/l/ || &$verif_lang($p->{name})) || + $p->{base}; + } + $c->{selected} = $nb; + } +} + sub psFromHeaderListDesc { my ($fd, $noSeek) = @_; my %packages; |