]> TLD Linux GIT Repositories - packages/rpm-tld-macros.git/blob - rubygems.rb
- merged 2.029 from PLD
[packages/rpm-tld-macros.git] / rubygems.rb
1 #!/usr/bin/ruby
2 #--
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).
6 #
7 # FIXME: Someone with actual ruby skills should really clean up and sanitize
8 #        this! fugliness obvious...
9 #++
10
11 require 'optparse'
12 require 'rbconfig'
13
14 provides = false
15 requires = false
16
17 opts = OptionParser.new("#{$0} <--provides|--requires>")
18 opts.on("-P", "--provides", "Print provides") do |val|
19   provides = true
20 end
21 opts.on("-R", "--requires", "Print requires") do |val|
22   requires= true
23 end
24
25 rest = opts.permute(ARGV)
26
27 if rest.size != 0 or (!provides and !requires) or (provides and requires)
28   $stderr.puts "Use either --provides OR --requires"
29   $stderr.puts opts
30   exit(1)
31 end
32
33 require 'rubygems'
34 gem_dir = Gem.respond_to?(:default_dirs) ? Gem.default_dirs[:system][:gem_dir] : Gem.path.first
35 specpatt = "#{gem_dir}/specifications/.*\.gemspec$"
36 gems = []
37 ruby_versioned = false
38 abi_provide = 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"]
41
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")
47      abi_provide = true
48      ruby_versioned = true
49   elsif path.match(specpatt)
50     gems.push(path.chomp)
51   # this is quite ugly and lame, but the assumption made is that if any files
52   # found in any of these directories specific to this ruby version, the
53   # package is dependent on this specific version.
54   # FIXME: only supports current ruby version
55   elsif not ruby_versioned
56     if path.match(RbConfig::CONFIG["rubylibdir"])
57       ruby_versioned = true
58     elsif path.match(RbConfig::CONFIG["archdir"])
59       ruby_versioned = true
60     elsif path.match(RbConfig::CONFIG["sitelibdir"])
61       ruby_versioned = !RbConfig::CONFIG["ruby_version"].empty?
62     elsif path.match(RbConfig::CONFIG["sitearchdir"])
63       ruby_versioned = true
64     elsif path.match(RbConfig::CONFIG["vendorlibdir"])
65       ruby_versioned = !RbConfig::CONFIG["ruby_version"].empty?
66     elsif path.match(RbConfig::CONFIG["vendorarchdir"])
67       ruby_versioned = true
68     end
69   end
70 end
71
72 if requires or abi_provide
73   abidep = "ruby(abi)"
74   if ruby_versioned
75     abidep += " = %s" % ruby_version
76   end
77   print abidep + "\n"
78 end
79
80 if gems.length > 0
81   require 'rubygems'
82
83   if requires
84
85     module Gem
86       class Requirement
87         def rpm_dependency_transform(name, version)
88           pessimistic = ""
89           if version == "> 0.0.0" or version == ">= 0"
90             version = ""
91           else
92             if version[0..1] == "~>"
93               pessimistic = "rubygem(%s) < %s\n" % [name, Gem::Version.create(version[3..-1]).bump]
94               version = version.gsub(/\~>/, '=>')
95             end
96             if version[0..1] == "!="
97               version = version.gsub(/\!=/, '>')
98             end
99             version = version.sub(/^/, ' ')
100           end
101           version = "rubygem(%s)%s\n%s" % [name, version, pessimistic]
102         end
103
104         def to_rpm(name)
105           result = as_list
106           return result.map { |version| rpm_dependency_transform(name, version) }
107         end
108
109       end
110     end
111   end
112
113   for gem in gems
114     data = File.read(gem)
115     spec = eval(data)
116     if provides
117       print "rubygem(%s) = %s\n" % [spec.name, spec.version]
118     end
119     if requires
120       for d in spec.dependencies
121         print d.requirement.to_rpm(d.name)[0] unless d.type != :runtime
122       end
123       for d in spec.required_rubygems_version.to_rpm("rubygems")
124         print d.gsub(/(rubygem\()|(\))/, "")
125       end
126     end
127   end
128 end