summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--tasks/mrbgem_spec.rake36
1 files changed, 24 insertions, 12 deletions
diff --git a/tasks/mrbgem_spec.rake b/tasks/mrbgem_spec.rake
index 4d4189818..5adba5fed 100644
--- a/tasks/mrbgem_spec.rake
+++ b/tasks/mrbgem_spec.rake
@@ -1,5 +1,6 @@
require 'pathname'
require 'forwardable'
+require 'tsort'
module MRuby
module Gem
@@ -288,28 +289,39 @@ module MRuby
end
def check
+ gem_table = @ary.reduce({}) { |res,v| res[v.name] = v; res }
+
each do |g|
g.dependencies.each do |dep|
name = dep[:gem]
req_versions = dep[:requirements]
+ dep_g = gem_table[name]
# check each GEM dependency against all available GEMs
- found_dep_gem = false
- each do |dep_g|
- if name == dep_g.name
- unless dep_g.version_ok?(req_versions)
- fail "#{name} version should be #{req_versions.join(' and ')} but was '#{dep_g.version}'"
- end
-
- found_dep_gem = true
- break
- end
+ if dep_g.nil?
+ fail "The GEM '#{g.name}' depends on the GEM '#{name}' but it could not be found"
end
+ unless dep_g.version_ok? req_versions
+ fail "#{name} version should be #{req_versions.join(' and ')} but was '#{dep_g.version}'"
+ end
+ end
+ end
- fail "The GEM '#{g.name}' depends on the GEM '#{name}' but it could not be found" unless found_dep_gem
-
+ class << gem_table
+ include TSort
+ alias tsort_each_node each_key
+ def tsort_each_child(n, &b)
+ fetch(n).dependencies.each do |v|
+ b.call v[:gem]
+ end
end
end
+
+ begin
+ @ary = gem_table.tsort.map { |v| gem_table[v] }
+ rescue TSort::Cyclic => e
+ fail "Circular mrbgem dependency found: #{e.message}"
+ end
end
end # List
end # Gem