mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
42 lines
1.1 KiB
Ruby
42 lines
1.1 KiB
Ruby
|
# OptionParser internal utility
|
||
|
|
||
|
class << OptionParser
|
||
|
def show_version(*pkg)
|
||
|
progname = ARGV.options.program_name
|
||
|
show = proc do |klass, version|
|
||
|
version = version.join(".") if Array === version
|
||
|
str = "#{progname}: #{klass} version #{version}"
|
||
|
if klass.const_defined?(:Release)
|
||
|
str << " (#{klass.const_get(:Release)})"
|
||
|
end
|
||
|
puts str
|
||
|
end
|
||
|
if pkg.size == 1 and pkg[0] == "all"
|
||
|
self.search_const(::Object, "Version", &show)
|
||
|
else
|
||
|
pkg.each do |pkg|
|
||
|
/\A[A-Z]\w*((::|\/)[A-Z]\w*)*\z/ni =~ pkg or next
|
||
|
begin
|
||
|
pkg = eval(pkg)
|
||
|
show.call(pkg, pkg.const_defined?(:Version) ? pkg.const_get(:Version) : "unknown")
|
||
|
rescue NameError
|
||
|
puts "#{progname}: #$!"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
exit
|
||
|
end
|
||
|
|
||
|
def search_const(klass, name)
|
||
|
klasses = [klass]
|
||
|
while klass = klasses.shift
|
||
|
klass.constants.each do |cname|
|
||
|
klass.const_defined?(cname) or next
|
||
|
const = klass.const_get(cname)
|
||
|
yield klass, const if cname == name
|
||
|
klasses << const if Module === const and const != ::Object
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|