3 # Copyright 2010 Per Øyvind Karlsen <peroyvind@mandriva.org>
4 # This program is free software. It may be redistributed and/or modified under
5 # the terms of the LGPL version 2.1 (or later).
7 # FIXME: Someone with actual ruby skills should really clean up and sanitize
8 # this! fugliness obvious...
17 opts = OptionParser.new("#{$0} <--provides|--requires>")
18 opts.on("-P", "--provides", "Print provides") do |val|
21 opts.on("-R", "--requires", "Print requires") do |val|
25 rest = opts.permute(ARGV)
27 if rest.size != 0 or (!provides and !requires) or (provides and requires)
28 $stderr.puts "Use either --provides OR --requires"
34 gem_dir = Gem.respond_to?(:default_dirs) ? Gem.default_dirs[:system][:gem_dir] : Gem.path.first
35 specpatt = "#{gem_dir}/specifications/.*\.gemspec$"
37 ruby_versioned = false
39 # as ruby_version may be empty, take version from basename of archdir
40 ruby_version = RbConfig::CONFIG["ruby_version"].empty? ? File.basename(RbConfig::CONFIG["archdir"]) : RbConfig::CONFIG["ruby_version"]
42 for path in $stdin.readlines
43 # way fugly, but we make the assumption that if the package has
44 # this file, the package is the current ruby version, and should
45 # therefore provide ruby(abi) = version
46 if provides and path.match(RbConfig::CONFIG["archdir"] + "/rbconfig.rb")
49 elsif path.match(specpatt)
52 # this is quite ugly and lame, but the assumption made is that if any files
53 # found in any of these directories specific to this ruby version, the
54 # package is dependent on this specific version.
55 # FIXME: only supports current ruby version
56 elsif not ruby_versioned
57 if path.match(RbConfig::CONFIG["rubylibdir"])
59 elsif path.match(RbConfig::CONFIG["archdir"])
61 elsif path.match(RbConfig::CONFIG["sitelibdir"])
62 ruby_versioned = !RbConfig::CONFIG["ruby_version"].empty?
63 elsif path.match(RbConfig::CONFIG["sitearchdir"])
65 elsif path.match(RbConfig::CONFIG["vendorlibdir"])
66 ruby_versioned = !RbConfig::CONFIG["ruby_version"].empty?
67 elsif path.match(RbConfig::CONFIG["vendorarchdir"])
73 if requires or abi_provide
76 abidep += " = %s" % ruby_version
88 def rpm_dependency_transform(name, version)
90 if version == "> 0.0.0" or version == ">= 0"
93 if version[0..1] == "~>"
94 pessimistic = "rubygem(%s) < %s\n" % [name, Gem::Version.create(version[3..-1]).bump]
95 version = version.gsub(/\~>/, '=>')
97 version = version.gsub(/^/, ' ')
99 version = "rubygem(%s)%s\n%s" % [name, version, pessimistic]
104 return result.map { |version| rpm_dependency_transform(name, version) }
112 data = File.read(gem)
115 print "rubygem(%s) = %s\n" % [spec.name, spec.version]
118 for d in spec.dependencies
119 print d.requirement.to_rpm(d.name)[0] unless d.type != :runtime
121 for d in spec.required_rubygems_version.to_rpm("rubygems")
122 print d.gsub(/(rubygem\()|(\))/, "")