summaryrefslogtreecommitdiffstats
path: root/perl-install
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install')
-rw-r--r--perl-install/pkgs.pm107
1 files changed, 62 insertions, 45 deletions
diff --git a/perl-install/pkgs.pm b/perl-install/pkgs.pm
index f4f2a22f7..e51d4f9bf 100644
--- a/perl-install/pkgs.pm
+++ b/perl-install/pkgs.pm
@@ -530,10 +530,11 @@ sub psUsingHdlist {
$m;
}
-sub read_rpmsrate {
- my ($packages, $f) = @_;
+sub read_rpmsrate_raw {
+ my ($f) = @_;
my $line_nb = 0;
my $fatal_error;
+ my (%flags, %rates, @need_to_copy);
my (@l);
local $_;
while (<$f>) {
@@ -559,57 +560,38 @@ sub read_rpmsrate {
)(.*)/x) { #@")) {
($t, $flag, $data) = ($1,$2,$3);
while ($flag =~ s,^\s*(("[^"]*"|[^"\s]*)*)\s+,$1,) {}
- my $ok = 0;
- my ($inv, $p);
- $flag = join('||', grep {
- if (($inv, $p) = /^(!)?HW"(.*)"/) {
- ($inv xor detect_devices::matching_desc__regexp($p)) and $ok = 1;
- 0;
- } elsif (($inv, $p) = /^(!)?DRIVER"(.*)"/) {
- ($inv xor detect_devices::matching_driver__regexp($p)) and $ok = 1;
- 0;
- } elsif (($inv, $p) = /^(!)?TYPE"(.*)"/) {
- ($inv xor detect_devices::matching_type($p)) and $ok = 1;
- 0;
- } else {
- 1;
- }
- } split '\|\|', $flag);
- push @m, $ok ? 'TRUE' : $flag || 'FALSE';
+ push @m, $flag;
push @l2, [ length $indent, [ @m ] ];
$indent .= $t;
}
if ($data) {
# has packages on same line
- my $rate = find { /^\d$/ } @m or die sprintf qq(missing rate for "%s" at line %d (flags are %s)\n), $data, $line_nb, join('&&', @m);
- foreach (split ' ', $data) {
- if ($packages) {
- my $p = packageByName($packages, $_) or next;
- my @m2 = map { if_(/locales-(.*)/, qq(LOCALES"$1")) } $p->requires_nosense;
- my @m3 = ((grep { !/^\d$/ } @m), @m2);
- if (member('INSTALL', @m3)) {
- member('NOCOPY', @m3) or push @{$packages->{needToCopy} ||= []}, $_;
- next; #- do not need to put INSTALL flag for a package.
- }
- if (member('PRINTER', @m3)) {
- push @{$packages->{needToCopy} ||= []}, $_;
- }
- if ($p->rate) {
- my @m4 = $p->rflags;
- if ((@m3 > 1 || @m4 > 1) && "@m3[1..$#m3]" ne "@m4[1..$#m4]") {
- log::l("can not handle complicate flags for packages appearing twice ($_)");
- $fatal_error++;
- }
- log::l("package $_ appearing twice with different rates ($rate != " . $p->rate . ")") if $rate != $p->rate;
- $p->set_rate($rate);
- $p->set_rflags("$m3[0]||$m4[0]");
+ my ($rates, $flags) = partition { /^\d$/ } @m;
+ my ($rate) = @$rates or die sprintf qq(missing rate for "%s" at line %d (flags are %s)\n), $data, $line_nb, join('&&', @m);
+ foreach my $name (split ' ', $data) {
+ if (member('INSTALL', @$flags)) {
+ push @need_to_copy, $name if !member('NOCOPY', @$flags);
+ next; #- do not need to put INSTALL flag for a package.
+ }
+ if (member('PRINTER', @$flags)) {
+ push @need_to_copy, $name;
+ }
+ if (my $previous = $flags{$name}) {
+ my @common = intersection($flags, $previous);
+ my @diff1 = difference2($flags, \@common);
+ my @diff2 = difference2($previous, \@common);
+ if (!@diff1 || !@diff2) {
+ @$flags = @common;
+ } elsif (@diff1 == 1 && @diff2 == 1) {
+ @$flags = (@common, join('||', $diff1[0], $diff2[0]));
} else {
- $p->set_rate($rate);
- $p->set_rflags(@m3);
+ log::l("can not handle complicate flags for packages appearing twice ($name)");
+ $fatal_error++;
}
- } else {
- print "$_ = ", join(" && ", @m), "\n";
+ log::l("package $name appearing twice with different rates ($rate != " . $rates{$name} . ")") if $rate != $rates{$name};
}
+ $rates{$name} = $rate;
+ $flags{$name} = $flags;
}
push @l, @l2;
} else {
@@ -617,6 +599,41 @@ sub read_rpmsrate {
}
}
$fatal_error and die "$fatal_error fatal errors in rpmsrate";
+ \%rates, \%flags, \@need_to_copy;
+}
+
+sub read_rpmsrate {
+ my ($packages, $f) = @_;
+
+ my ($rates, $flags, $need_to_copy) = read_rpmsrate_raw($f);
+
+ foreach (keys %$flags) {
+ my $p = packageByName($packages, $_) or next;
+ my @more_flags = map { if_(/locales-(.*)/, qq(LOCALES"$1")) } $p->requires_nosense;
+
+ my @flags = map {
+ my $ok = 0;
+ my $flag = join('||', grep {
+ if (my ($inv, $p) = /^(!)?HW"(.*)"/) {
+ ($inv xor detect_devices::matching_desc__regexp($p)) and $ok = 1;
+ 0;
+ } elsif (($inv, $p) = /^(!)?DRIVER"(.*)"/) {
+ ($inv xor detect_devices::matching_driver__regexp($p)) and $ok = 1;
+ 0;
+ } elsif (($inv, $p) = /^(!)?TYPE"(.*)"/) {
+ ($inv xor detect_devices::matching_type($p)) and $ok = 1;
+ 0;
+ } else {
+ 1;
+ }
+ } split '\|\|', $_);
+ $ok ? 'TRUE' : $flag || 'FALSE';
+ } @{$flags->{$_}};
+
+ $p->set_rate($rates->{$_});
+ $p->set_rflags(@flags, @more_flags);
+ }
+ $packages->{needToCopy} = $need_to_copy;
}
sub readCompssUsers {