diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-04 13:52:12 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-04 13:52:12 +0900 |
| commit | 9f6d7d0a428cd35445753e4e3df5418ba4c241f3 (patch) | |
| tree | a47d7bb99cf1e5c81bef3b977a2d2f58a2077f2b /tasks | |
| parent | 5f2817b36c32ff71031c514b2fdf51ba6b74d83c (diff) | |
| parent | 69cc80abbc7be29cc3b04da3371cebbf76afc931 (diff) | |
| download | mruby-9f6d7d0a428cd35445753e4e3df5418ba4c241f3.tar.gz mruby-9f6d7d0a428cd35445753e4e3df5418ba4c241f3.zip | |
Merge pull request #2006 from take-cheeze/tsort_dep
Refactor MRuby::Gem::List#check.
Diffstat (limited to 'tasks')
| -rw-r--r-- | tasks/mrbgem_spec.rake | 36 |
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 |
