diff options
Diffstat (limited to 'lib/rubygems/resolver/git_set.rb')
-rw-r--r-- | lib/rubygems/resolver/git_set.rb | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/lib/rubygems/resolver/git_set.rb b/lib/rubygems/resolver/git_set.rb new file mode 100644 index 0000000000..3c38d3dca0 --- /dev/null +++ b/lib/rubygems/resolver/git_set.rb @@ -0,0 +1,81 @@ +## +# A GitSet represents gems that are sourced from git repositories. +# +# This is used for gem dependency file support. +# +# Example: +# +# set = Gem::Resolver::GitSet.new +# set.add_git_gem 'rake', 'git://example/rake.git', tag: 'rake-10.1.0' + +class Gem::Resolver::GitSet < Gem::Resolver::Set + + ## + # Contains repositories needing submodules + + attr_reader :need_submodules # :nodoc: + + ## + # A Hash containing git gem names for keys and a Hash of repository and + # git commit reference as values. + + attr_reader :repositories # :nodoc: + + ## + # A hash of gem names to Gem::Resolver::GitSpecifications + + attr_reader :specs # :nodoc: + + def initialize # :nodoc: + @git = ENV['git'] || 'git' + @need_submodules = {} + @repositories = {} + @specs = {} + end + + def add_git_gem name, repository, reference, submodules # :nodoc: + @repositories[name] = [repository, reference] + @need_submodules[repository] = submodules + end + + ## + # Finds all git gems matching +req+ + + def find_all req + @repositories.keys.select do |name| + name == req.name + end.map do |name| + @specs[name] || load_spec(name) + end.select do |spec| + req.matches_spec? spec + end + end + + def load_spec name + repository, reference = @repositories[name] + + source = Gem::Source::Git.new name, repository, reference + + spec = source.load_spec name + + git_spec = + Gem::Resolver::GitSpecification.new self, spec, source + + @specs[name] = git_spec + end + + ## + # Prefetches specifications from the git repositories in this set. + + def prefetch reqs + names = reqs.map { |req| req.name } + + @repositories.each_key do |name| + next unless names.include? name + + load_spec name + end + end + +end + |