summaryrefslogtreecommitdiff
path: root/lib/rubygems/resolver/git_set.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/resolver/git_set.rb')
-rw-r--r--lib/rubygems/resolver/git_set.rb81
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
+