diff --git a/lib/puppet/util/package.rb b/lib/puppet/util/package.rb index 00e04f64a..613aa6b1e 100644 --- a/lib/puppet/util/package.rb +++ b/lib/puppet/util/package.rb @@ -1,31 +1,33 @@ require 'puppet' module Puppet::Util::Package def versioncmp(version_a, version_b) vre = /[-.]|\d+|[^-.\d]+/ ax = version_a.scan(vre) bx = version_b.scan(vre) while (ax.length>0 && bx.length>0) do a = ax.shift b = bx.shift if( a == b ) then next elsif (a == '-' && b == '-') then next elsif (a == '-') then return -1 elsif (b == '-') then return 1 elsif (a == '.' && b == '.') then next elsif (a == '.' ) then return -1 elsif (b == '.' ) then return 1 elsif (a =~ /^\d+$/ && b =~ /^\d+$/) then if( a =~ /^0/ or b =~ /^0/ ) then return a.to_s.upcase <=> b.to_s.upcase end return a.to_i <=> b.to_i else return a.upcase <=> b.upcase end end return version_a <=> version_b; end + + module_function :versioncmp end diff --git a/spec/unit/util/package.rb b/spec/unit/util/package.rb new file mode 100644 index 000000000..7d956efb5 --- /dev/null +++ b/spec/unit/util/package.rb @@ -0,0 +1,21 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../../spec_helper' + +require 'puppet/util/package' + +describe Puppet::Util::Package, " versioncmp" do + + it "should be able to be used as a module function" do + Puppet::Util::Package.should respond_to(:versioncmp) + end + + it "should be able to sort a long set of various unordered versions" do + ary = %w{ 1.1.6 2.3 1.1a 3.0 1.5 1 2.4 1.1-4 2.3.1 1.2 2.3.0 1.1-3 2.4b 2.4 2.40.2 2.3a.1 3.1 0002 1.1-5 1.1.a 1.06} + + newary = ary.sort { |a, b| Puppet::Util::Package.versioncmp(a,b) } + + newary.should == ["0002", "1", "1.06", "1.1-3", "1.1-4", "1.1-5", "1.1.6", "1.1.a", "1.1a", "1.2", "1.5", "2.3", "2.3.0", "2.3.1", "2.3a.1", "2.4", "2.4", "2.4b", "2.40.2", "3.0", "3.1"] + end + +end