diff options
Diffstat (limited to 'lib/chef/mixin/which.rb')
-rw-r--r-- | lib/chef/mixin/which.rb | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/lib/chef/mixin/which.rb b/lib/chef/mixin/which.rb index 4fa79eeccb..fd386241a0 100644 --- a/lib/chef/mixin/which.rb +++ b/lib/chef/mixin/which.rb @@ -1,6 +1,6 @@ #-- # Author:: Lamont Granquist <lamont@chef.io> -# Copyright:: Copyright 2010-2016, Chef Software Inc. +# Copyright:: Copyright 2010-2017, Chef Software Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,15 +18,32 @@ class Chef module Mixin module Which - def which(cmd, extra_path: nil) + def which(*cmds, extra_path: nil, &block) + where(*cmds, extra_path: extra_path, &block).first || false + end + + def where(*cmds, extra_path: nil, &block) # NOTE: unnecessarily duplicates function of path_sanity extra_path ||= [ "/bin", "/usr/bin", "/sbin", "/usr/sbin" ] - paths = ENV["PATH"].split(File::PATH_SEPARATOR) + extra_path - paths.each do |path| - filename = Chef.path_to(File.join(path, cmd)) - return filename if File.executable?(filename) - end - false + paths = env_path.split(File::PATH_SEPARATOR) + extra_path + cmds.map do |cmd| + paths.map do |path| + filename = Chef.path_to(File.join(path, cmd)) + filename if valid_executable?(filename, &block) + end.compact + end.flatten + end + + private + + # for test stubbing + def env_path + ENV["PATH"] + end + + def valid_executable?(filename, &block) + return false unless File.executable?(filename) && !File.directory?(filename) + block ? yield(filename) : true end end end |