Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/ruby
- require 'rubygems'
- require 'rubygems/commands/fetch_command'
- class Gem::Commands::FetchCommand
- def add_version_option_with_fetch_depends
- add_version_option_without_fetch_depends
- add_option('-y', '--[no-]dependencies',
- "Fetch dependent gems") do |value, options|
- options[:dependencies] = value
- end
- end
- def get_all_gem_names_with_fetch_depends
- @dependent_gem_names || get_all_gem_names_without_fetch_depends
- end
- def execute_with_fetch_depends
- execute_without_fetch_depends
- if options[:dependencies] then
- @dependent_gem_names = get_dependent_gem_names
- options[:version] = nil
- execute_without_fetch_depends
- end
- end
- [:add_version_option, :get_all_gem_names, :execute].each do |target|
- feature = "fetch_depends"
- alias_method "#{target}_without_#{feature}", target
- alias_method target, "#{target}_with_#{feature}"
- end
- private
- def get_dependent_gem_names
- version = options[:version] || Gem::Requirement.default
- request_gem_names = get_all_gem_names_without_fetch_depends.uniq
- to_do = fetch_specs_by_names_and_version(request_gem_names, version)
- seen = {}
- until to_do.empty? do
- spec = to_do.shift
- next if spec.nil? or seen[spec.name]
- seen[spec.name] = true
- deps = spec.runtime_dependencies
- deps.each do |dep|
- requirements = dep.requirement.requirements.map { |req,| req }
- all = !dep.prerelease? and
- (requirements.length > 1 or
- (requirements.first != ">=" and requirements.first != ">"))
- result = fetch_spec(dep, all)
- to_do.push(result)
- end
- end
- gem_names = seen.map { |name,| name }
- gem_names.reject { |name| request_gem_names.include? name }
- end
- def fetch_specs_by_names_and_version(gem_names, version)
- all = Gem::Requirement.default != version
- specs = gem_names.map do |gem_name|
- dep = Gem::Dependency.new(gem_name, version)
- dep.prerelease = options[:prerelease]
- fetch_spec(dep, all)
- end
- specs.compact
- end
- def fetch_spec(dep, all)
- specs_and_sources, errors =
- Gem::SpecFetcher.fetcher.fetch_with_errors(dep, all, true,
- dep.prerelease?)
- if platform = Gem.platforms.last then
- filtered = specs_and_sources.select { |s,| s.platform == platform }
- specs_and_sources = filtered unless filtered.empty?
- end
- spec, source_uri = specs_and_sources.sort_by { |s,| s.version }.last
- spec
- end
- end
- load `which gem`.rstrip
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement