diff options
-rwxr-xr-x | genbasefiles | 14 | ||||
-rw-r--r-- | rpmtools.pm | 50 | ||||
-rw-r--r-- | rpmtools.spec | 8 |
3 files changed, 67 insertions, 5 deletions
diff --git a/genbasefiles b/genbasefiles index 5a68704..03411a9 100755 --- a/genbasefiles +++ b/genbasefiles @@ -44,15 +44,27 @@ sub main { my @unresolved = $params->get_unresolved_provides_files(); if (@unresolved > 0) { foreach (@unresolved) { - print STDERR "found requires on file not yet found [$_], forcing a second pass\n"; + print STDERR "found requires on file not yet found [$_], forcing two other linked pass\n"; } #- cleaning. $params->keep_only_cleaned_provides_files(); + #- much more severe cleaning here, so we are sure with 2 pass. + #- else it may happen that a package need an inexistant file, + #- which will be in the provides forever, event after fixing the + #- package. + $params->{provides} = {}; + + #- compute (avoiding depslist computation on first one. foreach (@files) { print STDERR "reading (second pass) $_\n"; /\.rpm$/ ? $params->read_rpms($_) : $params->read_hdlists($_); + } + $params->keep_only_cleaned_provides_files(); + foreach (@files) { + print STDERR "reading (third pass) $_\n"; + /\.rpm$/ ? $params->read_rpms($_) : $params->read_hdlists($_); $params->compute_depslist(); } } diff --git a/rpmtools.pm b/rpmtools.pm index 85a6e12..6ccb303 100644 --- a/rpmtools.pm +++ b/rpmtools.pm @@ -53,10 +53,18 @@ sub compute_depslist { my @info = grep { ! exists $_->{id} } values %{$params->{info}}; #- speed up the search by giving a provide from all packages. + #- and remove all dobles for each one ! foreach (@info) { push @{$params->{provides}{$_->{name}} ||= []}, $_->{name}; } + #- remove all dobles for each provides. + foreach (keys %{$params->{provides}}) { + $params->{provides}{$_} or next; + my %provides; @provides{@{$params->{provides}{$_}}} = (); + $params->{provides}{$_} = [ keys %provides ]; + } + #- search for entries in provides, if such entries are found, #- another pass has to be done. TODO. @@ -231,13 +239,49 @@ sub read_depslist { 1; } +#- relocate depslist array to use only the most recent packages, +#- reorder info hashes too in the same manner. +sub relocate_depslist { + my ($params) = @_; + my $relocated_entries = 0; + + foreach (@{$params->{depslist} || []}) { + if ($params->{info}{$_->{name}} != $_) { + #- at this point, it is sure there is a package that + #- is multiply defined and this should be fixed. + #- first correct info hash, then a second pass on depslist + #- is required to relocate its entries. + my $cmp_version = compare_version($_->{version}, $params->{info}{$_->{name}}); + if ($cmp_version > 0 || $cmp_version == 0 && + compare_version($_->{release}, $params->{info}{$_->{name}}) > 0) { + $params->{info}{$_->{name}} = $_; + ++$relocated_entries; + } + } + } + + if ($relocated_entries) { + my $n = scalar(@{$params->{depslist}}) - 1; + for (0..$n) { + my $pkg = $params->{depslist}[$_]; + $params->{depslist}[$_] = $params->{info}{$pkg->{name}}; + } + } + + $relocated_entries; +} + #- write depslist.ordered file according to info in params. sub write_depslist { my ($params, $FILE, $min, $max) = @_; - foreach (grep { (! defined $min || $_->{id} >= $min) && (! defined $max || $_->{id} <= $max) } - sort { $a->{id} <=> $b->{id} } values %{$params->{info}}) { - printf $FILE "%s-%s-%s %s %s\n", $_->{name}, $_->{version}, $_->{release}, $_->{size}, $_->{deps}; + $min > 0 or $min = 0; + defined $max && $max < scalar(@{$params->{depslist} || []}) or $max = scalar(@{$params->{depslist} || []}) - 1; + $max >= $min or return; + + for ($min..$max) { + my $pkg = $params->{depslist}[$_]; + printf $FILE "%s-%s-%s %s %s\n", $pkg->{name}, $pkg->{version}, $pkg->{release}, $pkg->{size}, $pkg->{deps}; } 1; } diff --git a/rpmtools.spec b/rpmtools.spec index 1f7e4cf..9387569 100644 --- a/rpmtools.spec +++ b/rpmtools.spec @@ -1,5 +1,5 @@ %define name rpmtools -%define release 8mdk +%define release 9mdk # do not modify here, see Makefile in the CVS %define version 1.2 @@ -99,6 +99,12 @@ rm -rf $RPM_BUILD_ROOT %changelog +* Sun Sep 03 2000 François Pons <fpons@mandrakesoft.com> 1.2-9mdk +- fixed write_depslist to avoid resorting, fixes dobles. +- fixed compute_depslist to use only remove dobles in provides. +- fixed genbasefiles to do 3 pass instead of 2, because provides is no more + used in such a case. + * Fri Sep 01 2000 François Pons <fpons@mandrakesoft.com> 1.2-8mdk - fixed read_provides with unresolved dependancies. |