aboutsummaryrefslogtreecommitdiffstats
path: root/lib/bundler/spec_set.rb
diff options
context:
space:
mode:
authorCarl Lerche <carllerche@mac.com>2010-06-04 14:18:23 -0700
committerCarl Lerche <carllerche@mac.com>2010-06-04 14:18:23 -0700
commita9b3f285411bcd1b26511a773610007d027ce4bc (patch)
tree93189d3a7fecb16b77a09e4afa3efccb2db8a54f /lib/bundler/spec_set.rb
parent0ccfdd8e49a4641edad0dcde5d4111bad06c8e00 (diff)
downloadbundler-a9b3f285411bcd1b26511a773610007d027ce4bc.tar.gz
Refactor SpecSet#for
Diffstat (limited to 'lib/bundler/spec_set.rb')
-rw-r--r--lib/bundler/spec_set.rb47
1 files changed, 26 insertions, 21 deletions
diff --git a/lib/bundler/spec_set.rb b/lib/bundler/spec_set.rb
index 9d0a771e..d5eccfbb 100644
--- a/lib/bundler/spec_set.rb
+++ b/lib/bundler/spec_set.rb
@@ -18,22 +18,38 @@ module Bundler
# TODO: Handle platform filtering
def for(deps, skip = [])
- specs = {}
- deps.each do |dep|
- name = dep.respond_to?(:name) ? dep.name : dep
- current = lookup[name].first
- append_subgraph(specs, current, skip)
+ handled = {}
+ deps = deps.map { |d| d.respond_to?(:name) ? d.name : d }
+
+ until deps.empty?
+ dep = deps.shift
+ next if handled[dep] || skip.include?(dep)
+ specs = lookup[dep]
+ next if specs.empty?
+ specs.each do |s|
+ handled[s.name] = true
+ s.dependencies.each do |d|
+ next if d.type == :development
+ deps << d.name
+ end
+ end
end
- SpecSet.new(sorted.select { |s| specs[s.name] })
+ SpecSet.new(sorted.select { |s| handled[s.name] })
end
def valid_for?(deps)
deps = deps.dup
+ handled = {}
+
until deps.empty?
- specs = lookup[deps.shift.name]
- return false unless specs.any?
- specs.each { |s| deps.concat s.dependencies }
+ dep = deps.shift
+ unless dep.type == :development || handled[dep.name]
+ specs = lookup[dep.name]
+ return false unless specs.any?
+ handled[dep.name] = true
+ specs.each { |s| deps.concat s.dependencies }
+ end
end
true
end
@@ -48,7 +64,7 @@ module Bundler
@specs.delete_if(&blk)
end
- def __materialize__(type)
+ def materialize(type, deps)
materialized = @specs.map do |s|
next s unless s.is_a?(LazySpecification)
s.__materialize__(s.source.send(type))
@@ -58,17 +74,6 @@ module Bundler
private
- def append_subgraph(specs, current, skip)
- return unless current
- return if specs[current.name] || skip.include?(current.name)
- specs[current.name] = true
- current.dependencies.each do |dep|
- next if dep.type == :development
- s = lookup[dep.name].first
- append_subgraph(specs, s, skip)
- end
- end
-
def sorted
rake = @specs.find { |s| s.name == 'rake' }
@sorted ||= ([rake] + tsort).compact.uniq