diff options
-rw-r--r-- | Perl-RPM/RPM/Header.pm | 63 |
1 files changed, 60 insertions, 3 deletions
diff --git a/Perl-RPM/RPM/Header.pm b/Perl-RPM/RPM/Header.pm index 10a83fc37..3c6d488e2 100644 --- a/Perl-RPM/RPM/Header.pm +++ b/Perl-RPM/RPM/Header.pm @@ -5,7 +5,7 @@ # ############################################################################### # -# $Id: Header.pm,v 1.3 2000/06/10 22:27:30 rjray Exp $ +# $Id: Header.pm,v 1.4 2000/06/14 09:28:38 rjray Exp $ # # Description: The RPM::Header class provides access to the RPM Header # structure as a tied hash, allowing direct access to the @@ -30,10 +30,12 @@ use strict; use vars qw($VERSION $revision); use subs qw(new); -require RPM; +use RPM; +use RPM::Error; +use RPM::Constants ':rpmerr'; $VERSION = $RPM::VERSION; -$revision = do { my @r=(q$Revision: 1.3 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r }; +$revision = do { my @r=(q$Revision: 1.4 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r }; 1; @@ -46,6 +48,61 @@ sub new return (tied %hash); } +############################################################################### +# +# Sub Name: cmpver +# +# Description: Try to reasonably compare two headers by examining their +# version and release fields. +# +# Arguments: NAME IN/OUT TYPE DESCRIPTION +# $self in ref Object of this class +# $cmp_to in ref Another object of this class +# +# Globals: None. +# +# Environment: None. +# +# Returns: Perl-style comparison operation +# +############################################################################### +sub cmpver +{ + my ($self, $cmp_to) = @_; + + # First off, arg 2 must be of or derived from this class + unless ($cmp_to->isa('RPM::Header')) + { + rpm_error(RPMERR_BADARG, + "RPM::Header::cmpver: Argument 2 of wrong type"); + return 0; + } + my @self = $self->NVR; + my @cmp_to = $cmp_to->NVR; + # Secondly, comparison is meaningless if these are not the same package + return 0 unless ($self[0] eq $cmp_to[0]); + + # Now it gets more complicated + my @self_ver = split('.', $self[1]); + my @self_rel = split('.', $self[2]); + my @cmpto_ver = split('.', $cmp_to[1]); + my @cmpto_rel = split('.', $cmp_to[2]); + + # If they do not have the same number of elements, pad the shorter one + if (@self_ver < @cmpto_ver) + { + push(@self_ver, 0) for (1 .. (@cmpto_ver - @self_ver)); + } + elsif (@self_ver > @cmpto_ver) + { + push(@cmpto_ver, 0) for (1 .. (@self_ver - @cmpto_ver)); + } + for (0 .. $#self_ver) + { + return; + } +} + __END__ =head1 NAME |