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]

Reply via email to