Method: Inspec::Resolver#resolve
- Defined in:
- lib/inspec/dependencies/resolver.rb
#resolve(deps, top_level = true, seen_items = {}, path_string = "") ⇒ Object
Here deps is an Array of Inspec::Requirement
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/inspec/dependencies/resolver.rb', line 50 def resolve(deps, top_level = true, seen_items = {}, path_string = "") # rubocop:disable Metrics/AbcSize graph = {} if top_level Inspec::Log.debug("Starting traversal of dependencies #{deps.map(&:to_s)}") else Inspec::Log.debug("Traversing dependency tree of transitive dependency #{deps.map(&:name)}") end detect_duplicates(deps, top_level, path_string) deps.each do |dep| # Calling dep.resolved_source forces a fetch. Handle any airgap chicanery early. if Inspec::Config.cached[:airgap] begin dep.resolved_source rescue Inspec::FetcherFailure Inspec::Log.debug("Failed to fetch #{dep.name}, falling back to archives if possible") retry if fallback_to_archive_on_fetch_failure(dep) end end new_seen_items = seen_items.dup new_path_string = if path_string.empty? dep.name else path_string + " -> #{dep.name}" end raise Inspec::CyclicDependencyError, "Dependency #{dep} would cause a dependency cycle (#{new_path_string})" if new_seen_items.key?(dep.resolved_source) new_seen_items[dep.resolved_source] = true unless dep.source_satisfies_spec? raise Inspec::UnsatisfiedVersionSpecification, "The profile #{dep.name} from #{dep.resolved_source} has a version #{dep.source_version} which doesn't match #{dep.version_constraints}" end Inspec::Log.debug("Adding dependency #{dep.name} (#{dep.resolved_source})") graph[dep.name] = dep unless dep.dependencies.empty? resolve(dep.dependencies, false, new_seen_items.dup, new_path_string) end end Inspec::Log.debug("Dependency traversal complete.") if top_level graph end |