diff options
author | Pieter van de Bruggen <pieter@puppetlabs.com> | 2011-03-24 15:06:21 -0700 |
---|---|---|
committer | Pieter van de Bruggen <pieter@puppetlabs.com> | 2011-03-25 08:59:08 -0700 |
commit | 1af9bb232ed73f16789f465e89a0d498c39e1b78 (patch) | |
tree | 8b05c277b69412815d203eee0970fb74b19d2a52 /lib/puppet | |
parent | 78371a739bcf1b1d76496e9038fa4b076a27032f (diff) | |
download | puppet-1af9bb232ed73f16789f465e89a0d498c39e1b78.tar.gz puppet-1af9bb232ed73f16789f465e89a0d498c39e1b78.tar.xz puppet-1af9bb232ed73f16789f465e89a0d498c39e1b78.zip |
(#6770) Add version lookup and comparison.
Reviewed-By: Jacob Helwig
Diffstat (limited to 'lib/puppet')
-rw-r--r-- | lib/puppet/interface/interface_collection.rb | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/puppet/interface/interface_collection.rb b/lib/puppet/interface/interface_collection.rb index 51b7534a0..115892397 100644 --- a/lib/puppet/interface/interface_collection.rb +++ b/lib/puppet/interface/interface_collection.rb @@ -1,6 +1,8 @@ require 'puppet/interface' module Puppet::Interface::InterfaceCollection + SEMVER_VERSION = /^(\d+)\.(\d+)\.(\d+)([A-Za-z][0-9A-Za-z-]*|)$/ + @interfaces = Hash.new { |hash, key| hash[key] = {} } def self.interfaces @@ -24,6 +26,39 @@ module Puppet::Interface::InterfaceCollection return @interfaces.keys end + def self.versions(name) + versions = [] + $LOAD_PATH.each do |dir| + next unless FileTest.directory?(dir) + v_dir = File.join dir, %w[puppet interface v*] + Dir.glob(File.join v_dir, "#{name}{.rb,/*.rb}").each do |f| + v = f.sub(%r[.*/v([^/]+?)/#{name}(?:(?:/[^/]+)?.rb)$], '\1') + if v =~ SEMVER_VERSION + versions << v + else + warn "'#{v}' (#{f}) is not a valid version string; skipping" + end + end + end + return versions.uniq.sort { |a, b| compare_versions(a, b) } + end + + def self.compare_versions(a, b) + a, b = [a, b].map do |x| + parts = SEMVER_VERSION.match(x).to_a[1..4] + parts[0..2] = parts[0..2].map { |e| e.to_i } + parts + end + + cmp = a[0..2] <=> b[0..2] + if cmp == 0 + cmp = a[3] <=> b[3] + cmp = +1 if a[3].empty? && !b[3].empty? + cmp = -1 if b[3].empty? && !a[3].empty? + end + cmp + end + def self.[](name, version) @interfaces[underscorize(name)][version] if interface?(name, version) end |