summaryrefslogtreecommitdiffstats
path: root/urpm.pm
diff options
context:
space:
mode:
authorFrancois Pons <fpons@mandriva.com>2002-02-19 15:10:20 +0000
committerFrancois Pons <fpons@mandriva.com>2002-02-19 15:10:20 +0000
commit5c3d9f08441d13a1ff3282cbb0e26385f53e62a0 (patch)
treeccb53bd2079fee3e3b4b85a8a10d9c80edb8ba4b /urpm.pm
parent8b8a7da92df3761c5592fbf0b698b068dc8b744f (diff)
downloadurpmi-5c3d9f08441d13a1ff3282cbb0e26385f53e62a0.tar
urpmi-5c3d9f08441d13a1ff3282cbb0e26385f53e62a0.tar.gz
urpmi-5c3d9f08441d13a1ff3282cbb0e26385f53e62a0.tar.bz2
urpmi-5c3d9f08441d13a1ff3282cbb0e26385f53e62a0.tar.xz
urpmi-5c3d9f08441d13a1ff3282cbb0e26385f53e62a0.zip
3.3-11mdk
Diffstat (limited to 'urpm.pm')
-rw-r--r--urpm.pm71
1 files changed, 53 insertions, 18 deletions
diff --git a/urpm.pm b/urpm.pm
index 0126d55d..82c2fab9 100644
--- a/urpm.pm
+++ b/urpm.pm
@@ -1492,7 +1492,7 @@ sub parse_synthesis {
#- all additional package selected have a true value.
sub filter_packages_to_upgrade {
my ($urpm, $packages, $select_choices, %options) = @_;
- my ($id, %installed, %selected, %conflicts);
+ my ($id, %track, %track_requires, %installed, %selected, %conflicts);
my ($db, @packages) = (rpmtools::db_open(''), keys %$packages);
my $sig_handler = sub { rpmtools::db_close($db); exit 3 };
local $SIG{INT} = $sig_handler;
@@ -1560,16 +1560,28 @@ sub filter_packages_to_upgrade {
my (%diff_provides, %provides);
if ($pkg->{arch} ne 'src') {
- rpmtools::db_traverse_tag($db,
- 'name', [ $pkg->{name}, @{$pkg->{obsoletes} || []} ],
- [ qw(name version release sense provides) ], sub {
- my ($p) = @_;
- foreach (@{$p->{provides}}) {
- s/\[\*\]//;
- s/\[([^\]]*)\]/ $1/;
- $diff_provides{$_} = "$p->{name}-$p->{version}-$p->{release}";
- }
- });
+ my @upgraded;
+
+ foreach ($pkg->{name}, @{$pkg->{obsoletes} || []}) {
+ if (my ($n, $o, $v, $r) = /^([^\s\[]*)(?:\[\*\])?(?:\s+|\[)?([^\s\]]*)\s*([^\s\-\]]*)-?([^\s\]]*)/) {
+ rpmtools::db_traverse_tag($db, 'name', [ $n ],
+ [ qw(name version release sense provides),
+ $options{track} ? qw(arch requires serial) : () ],
+ sub {
+ my ($p) = @_;
+ (!$v || eval(rpmtools::version_compare($p->{version}, $v) . $o . 0)) &&
+ (!$r || rpmtools::version_compare($p->{version}, $v) != 0 ||
+ eval(rpmtools::version_compare($p->{release}, $r) . $o . 0)) or return;
+ $options{track} and push @upgraded, $p;
+ foreach (@{$p->{provides}}) {
+ s/\[\*\]//;
+ s/\[([^\]]*)\]/ $1/;
+ $diff_provides{$_} = "$p->{name}-$p->{version}-$p->{release}";
+ }
+ });
+ }
+ }
+ $options{track} and $track{$pkg->{id}}{upgraded} = \@upgraded;
foreach (@{$pkg->{provides} || []}) {
s/\[\*\]//;
@@ -1597,13 +1609,18 @@ sub filter_packages_to_upgrade {
}
#- check if the package need to be updated because it
#- losts some of its requires regarding the current diff_provides.
- $needed > $satisfied and $selected{$p->{name}} ||= undef;
+ if ($needed > $satisfied) {
+ $selected{$p->{name}} ||= undef;
+ $options{track} and push @{$track{$pkg->{id}}{diff_provides} ||= []}, $p;
+ }
};
- rpmtools::db_traverse_tag($db, 'whatrequires', [ $n ], [ qw(name version release sense requires) ], $check);
+ rpmtools::db_traverse_tag($db, 'whatrequires', [ $n ],
+ [ qw(name version release sense requires),
+ $options{track} ? qw(arch provides serial) : () ], $check);
}
}
- $selected{$pkg->{name}} = undef;
+ $selected{$pkg->{name}} ||= undef;
}
#- iterate over requires of the packages, register them.
@@ -1624,8 +1641,10 @@ sub filter_packages_to_upgrade {
$provides{$_} = "$p->{name}-$p->{version}-$p->{release}";
};
rpmtools::db_traverse_tag($db, $n =~ m|^/| ? 'path' : 'whatprovides', [ $n ],
- [ qw (name version release) ], $check_pkg);
+ [ qw (name version release),
+ $options{track} ? qw(arch sense requires provides serial) : () ], $check_pkg);
}
+ $options{track} and $track_requires{$_}{$pkg->{id}} = $_;
}
}
@@ -1641,10 +1660,12 @@ sub filter_packages_to_upgrade {
(!$r || rpmtools::version_compare($p->{version}, $v) != 0 ||
eval(rpmtools::version_compare($p->{release}, $r) . $o . 0)) or return;
$conflicts{"$p->{name}-$p->{version}-$p->{release}.$p->{arch}"} = 1;
- $selected{$_[0]{name}} ||= undef;
+ $selected{$p->{name}} ||= undef;
+ $options{track} and push @{$track{$pkg->{id}}{conflicts} ||= []}, $p;
};
rpmtools::db_traverse_tag($db, $n =~ m|^/| ? 'path' : 'whatprovides', [ $n ],
- [ qw (name version release arch) ], $check_pkg);
+ [ qw (name version release arch),
+ $options{track} ? qw(sense requires provides serial) : () ], $check_pkg);
foreach my $fullname (keys %{$urpm->{params}{provides}{$n} || {}}) {
my $p = $urpm->{params}{info}{$fullname};
$p->{arch} eq 'src' and next;
@@ -1732,15 +1753,29 @@ sub filter_packages_to_upgrade {
if (keys(%choices_id) == 1) {
my ($id) = keys(%choices_id);
$selected{$choices_id{$id}{name}} = 1;
- exists $packages->{$id} or $packages->{$id} = 1;
+ unless ($packages->{$id}) {
+ $packages->{$id} = 1;
+ if ($options{track} && $track_requires{$_}) {
+ foreach my $deps (keys %{$track_requires{$_}}) {
+ $track{$deps}{requires}{$id} = $_;
+ }
+ }
+ }
unshift @packages, $id;
} elsif (keys(%choices_id) > 1) {
push @packages, [ sort { $a <=> $b } keys %choices_id ];
+ if ($options{track} && $track_requires{$_}) {
+ foreach my $deps (keys %{$track_requires{$_}}) {
+ $track{$deps}{requires}{join '|', sort { $a <=> $b } keys %choices_id} = $_;
+ }
+ }
}
}
}
rpmtools::db_close($db);
+
+ \%track;
}
#- get out of package that should not be upgraded.