--- lib/Sys/VirtV2V/GuestOS/RedHat.pm | 42 +++++++++++++++++++++--------------- 1 files changed, 24 insertions(+), 18 deletions(-) diff --git a/lib/Sys/VirtV2V/GuestOS/RedHat.pm b/lib/Sys/VirtV2V/GuestOS/RedHat.pm index a51b082..2fe4640 100644 --- a/lib/Sys/VirtV2V/GuestOS/RedHat.pm +++ b/lib/Sys/VirtV2V/GuestOS/RedHat.pm @@ -853,6 +853,28 @@ sub _get_installed return @installed; } +sub _evr_cmp +{ + my ($e1, $v1, $r1, $e2, $v2, $r2) = @_; + + # Treat epoch as zero if undefined + $e1 ||= 0; + $e2 ||= 0; + + return -1 if ($e1 < $e2); + return 1 if ($e1 > $e2); + + # version must be defined + my $cmp = _rpmvercmp($v1, $v2); + return $cmp if ($cmp != 0); + + # Treat release as the empty string if undefined + $r1 ||= ""; + $r2 ||= ""; + + return _rpmvercmp($r1, $r2); +} + # Return 1 if the requested rpm, or a newer version, is installed # Return 0 otherwise @@ -870,24 +892,8 @@ sub _newer_installed # Search installed rpms matching <name>.<arch> my $found = 0; foreach my $pkg (@installed) { - my $iepoch = $pkg->[0]; - my $iversion = $pkg->[1]; - my $irelease = $pkg->[2]; - - # Skip if installed epoch less than requested version - next if ($iepoch < $epoch); - - if ($iepoch eq $epoch) { - # Skip if installed version less than requested version - next if (_rpmvercmp($iversion, $version) < 0); - - # Skip if install version == requested version, but release less - # than requested release - if ($iversion eq $version) { - next if (_rpmvercmp($irelease, $release) < 0); - } - } - + next if _evr_cmp($pkg->[0], $pkg->[1], $pkg->[2], + $epoch, $version, $release) < 0; $found = 1; } -- 1.6.6.1