c99b38
#!/usr/bin/ruby
c99b38
c99b38
require 'rubygems/package'
c99b38
c99b38
module RubyGemsReq
c99b38
  module Helpers
c99b38
    # Keep only '!=' requirements.
c99b38
    def self.conflicts(requirements)
c99b38
      conflicts = requirements.select {|r| r.first == '!='}
c99b38
    end
c99b38
c99b38
    # Converts Gem::Requirement into array of requirements strings compatible
c99b38
    # with RPM .spec file.
c99b38
    def self.requirement_versions_to_rpm(requirement)
c99b38
      self.conflicts(requirement.requirements).map do |op, version|
c99b38
        version == Gem::Version.new(0) ? "" : "= #{version}"
c99b38
      end
c99b38
    end
c99b38
  end
c99b38
c99b38
  # Report conflicting gem dependencies including their version.
c99b38
  def self.gem_depenencies(specification)
c99b38
    specification.runtime_dependencies.each do |dependency|
c99b38
      conflict_strings = Helpers::requirement_versions_to_rpm(dependency.requirement).map do |requirement|
c99b38
        requirement_string = "rubygem(#{dependency.name}) #{requirement}"
c99b38
      end
c99b38
      if conflict_strings.length > 0
c99b38
        conflict_string = conflict_strings.join(' with ')
c99b38
        conflict_string.prepend('(').concat(')') if conflict_strings.length > 1
c99b38
        puts conflict_string
c99b38
      end
c99b38
    end
c99b38
  end
c99b38
c99b38
  # Reports all conflicts specified by all provided .gemspec files.
c99b38
  def self.conflicts
c99b38
    while filename = gets
c99b38
      filename.strip!
c99b38
      begin
c99b38
        specification = Gem::Specification.load filename
c99b38
c99b38
        gem_depenencies(specification)
c99b38
      rescue => e
c99b38
        # Ignore all errors.
c99b38
      end
c99b38
    end
c99b38
  end
c99b38
end
c99b38
c99b38
if __FILE__ == $0
c99b38
  RubyGemsReq::conflicts
c99b38
end