ptxd_ipkg_rev_smaller doesn't work properly for many packages. This patch replaces it with a perl script that handles everything correctly.
Signed-off-by: George McCollister <[email protected]> --- scripts/ipkg_version_compare.pl | 104 +++++++++++++++++++++++++++++++++++++++ scripts/libptxdist.sh | 31 +++--------- 2 files changed, 112 insertions(+), 23 deletions(-) create mode 100644 scripts/ipkg_version_compare.pl diff --git a/scripts/ipkg_version_compare.pl b/scripts/ipkg_version_compare.pl new file mode 100644 index 0000000..63fbcce --- /dev/null +++ b/scripts/ipkg_version_compare.pl @@ -0,0 +1,104 @@ +#!/usr/bin/perl -w + +use strict; + +die("Invalid syntax.\n") unless $ARGV[0] and $ARGV[1]; + +my $package1 = $ARGV[0]; +my $package2 = $ARGV[1]; + +#print "Comparing $package1 to $package2.\n"; + +my ($package1_name, $package1_version, $package1_arch) = SplitPackage($package1); +my ($package2_name, $package2_version, $package2_arch) = SplitPackage($package2); + +my @package1_verion_array = GetVersionArray($package1_version); +my @package2_verion_array = GetVersionArray($package2_version); + +#print "$package1_name: " . join(',', @package1_verion_array) . "\n"; +#print "$package2_name: " . join(',', @package2_verion_array) . "\n"; + +my $maxlen = $#package1_verion_array; +$maxlen = $#package2_verion_array if $#package2_verion_array > $maxlen; + +for(my $i=0; $i <= $maxlen; $i++) +{ + #printf "comparing %s to %s\n", $package1_verion_array[$i], $package2_verion_array[$i]; + + VersionResult(0) if !defined($package1_verion_array[$i]) and defined($package2_verion_array[$i]); + VersionResult(1) if defined($package1_verion_array[$i]) and !defined($package2_verion_array[$i]); + + if( $package1_verion_array[$i] =~ /^\d+$/ and $package2_verion_array[$i] =~ /^\d+$/ ) + { + VersionResult(0) if $package1_verion_array[$i] < $package2_verion_array[$i]; + VersionResult(1) if $package1_verion_array[$i] > $package2_verion_array[$i]; + } + elsif( $package1_verion_array[$i] =~ /^[a-zA-Z]+$/ and $package2_verion_array[$i] =~ /^[a-zA-Z]+$/ ) + { + VersionResult(0) if $package1_verion_array[$i] lt $package2_verion_array[$i]; + VersionResult(1) if $package1_verion_array[$i] gt $package2_verion_array[$i]; + } + else + { + die( $package1_verion_array[$i] . " can't be compared with " . $package2_verion_array[$i] . " one is numeric one is alpha.\n"); + } +} + + +VersionResult(0) if GetPacketRev($package1_version) < GetPacketRev($package2_version); +VersionResult(1) if GetPacketRev($package1_version) > GetPacketRev($package2_version); + +die("packets $package1 and $package2 have the same revision\n"); + +sub VersionResult { + my $result = $_[0]; + #print("Exiting with $result\n"); + exit($result); +} + +sub SplitPackage { + my $package = $_[0]; + + die("invalid package string\n") unless $package =~ /(.*)_(.*)_(.*)\.ipk/; + return ($1, $2, $3); +} + +sub GetVersionArray { + my $version = $_[0]; + + my @versionarray; + + while( length($version) > 0 ) + { + if( $version =~ s/^([a-zA-Z]+)\.*// ) + { + push(@versionarray, $1); + } + elsif( $version =~ s/^(\d+)\.*// ) + { + push(@versionarray, $1); + } + elsif( $version =~ s/^-(\d+)$// ) + { + #push(@versionarray, $1); + } + else + { + die("Can't parse version\n"); + } + } + + return @versionarray; +} + +sub GetPacketRev { + my $version = $_[0]; + if( $version =~ /-(\d+)$/ ) + { + return $1; + } + else + { + return 0; + } +} diff --git a/scripts/libptxdist.sh b/scripts/libptxdist.sh index 76c3791..aeab271 100644 --- a/scripts/libptxdist.sh +++ b/scripts/libptxdist.sh @@ -697,28 +697,13 @@ ptxd_ipkg_arch() { # # ptxd_ipkg_rev_smaller() { + SCRIPTS=`dirname $0` + ERRORMSG=`perl ${SCRIPTS}/ipkg_version_compare.pl $1 $2` + RESULT=$? - local first=`ptxd_ipkg_split $1` - local first_rev_upstream=`ptxd_ipkg_rev_upstream $first` - local first_rev_packet=`ptxd_ipkg_rev_package $first` - local second=`ptxd_ipkg_split $2` - local second_rev_upstream=`ptxd_ipkg_rev_upstream $second` - local second_rev_packet=`ptxd_ipkg_rev_package $second` - local first_major=`echo $first_rev_upstream | awk -F. '{print $1}'` - local first_minor=`echo $first_rev_upstream | awk -F. '{print $2}'` - local first_micro=`echo $first_rev_upstream | awk -F. '{print $3}'` - local second_major=`echo $second_rev_upstream | awk -F. '{print $1}'` - local second_minor=`echo $second_rev_upstream | awk -F. '{print $2}'` - local second_micro=`echo $second_rev_upstream | awk -F. '{print $3}'` - - [ $first_major -lt $second_major ] && return 0 - [ $first_major -gt $second_major ] && return 1 - [ $first_minor -lt $second_minor ] && return 0 - [ $first_minor -gt $second_minor ] && return 1 - [ $first_micro -lt $second_micro ] && return 0 - [ $first_micro -gt $second_micro ] && return 1 - [ $first_rev_packet -lt $second_rev_packet ] && return 0 - [ $first_rev_packet -gt $second_rev_packet ] && return 1 - - ptxd_error "packets $1 and $2 have the same revision" + if [ "$RESULT" = "0" -o "$RESULT" = "1" ]; then + return $RESULT + fi + + ptxd_error "$ERRORMSG" } -- 1.7.1 -- ptxdist mailing list [email protected]
