in lib/taste_tester/commands.rb [308:389]
def self._find_roles(changes)
if TasteTester::Config.relative_cookbook_dirs.length > 1
logger.error('Knife deps does not support multiple cookbook paths.')
logger.error('Please flatten the cookbooks into a single directory' +
' or define the find_impact method in a local plugin.')
exit(1)
end
cookbooks = Set.new(changes.cookbooks)
roles = Set.new(changes.roles)
databags = Set.new(changes.databags)
if cookbooks.empty? && roles.empty?
unless TasteTester::Config.json
logger.warn('No cookbooks or roles have been modified.')
end
return Set.new
end
unless cookbooks.empty?
logger.info('Modified Cookbooks:')
cookbooks.each { |cb| logger.info("\t#{cb}") }
end
unless roles.empty?
logger.info('Modified Roles:')
roles.each { |r| logger.info("\t#{r}") }
end
unless databags.empty?
logger.info('Modified Databags:')
databags.each { |db| logger.info("\t#{db}") }
end
logger.info('Finding dependencies (this may take a minute or two)...')
knife = Mixlib::ShellOut.new(
"knife deps /#{TasteTester::Config.role_dir}/*.rb" +
" --config #{TasteTester::Config.knife_config}" +
" --chef-repo-path #{TasteTester::Config.absolute_base_dir}" +
' --tree --recurse',
)
knife.run_command
knife.error!
logger.info('Processing Dependencies...')
deps_hash = {}
curr_role = nil
knife.stdout.each_line do |line|
elem = line.rstrip
if elem.length == elem.lstrip.length
curr_role = elem
deps_hash[curr_role] = Set.new
else
deps_hash[curr_role].add(File.basename(elem, File.extname(elem)))
end
end
impacted_roles = Set.new(roles.map(&:name))
deps_hash.each do |role, deplist|
cookbooks.each do |cb|
if deplist.include?(cb.name)
impacted_roles.add(role)
logger.info("\tFound dependency: #{role} --> #{cb.name}")
break
end
end
end
return impacted_roles
end