summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
authorPieter van de Bruggen <pieter@puppetlabs.com>2011-03-24 15:06:21 -0700
committerPieter van de Bruggen <pieter@puppetlabs.com>2011-03-25 08:59:08 -0700
commit1af9bb232ed73f16789f465e89a0d498c39e1b78 (patch)
tree8b05c277b69412815d203eee0970fb74b19d2a52 /lib/puppet
parent78371a739bcf1b1d76496e9038fa4b076a27032f (diff)
downloadpuppet-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.rb35
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