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