diff options
Diffstat (limited to 'chef-helpers/lib/chef-helpers/which.rb')
-rw-r--r-- | chef-helpers/lib/chef-helpers/which.rb | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/chef-helpers/lib/chef-helpers/which.rb b/chef-helpers/lib/chef-helpers/which.rb new file mode 100644 index 0000000000..e0a48f564c --- /dev/null +++ b/chef-helpers/lib/chef-helpers/which.rb @@ -0,0 +1,47 @@ +# +# Copyright:: Copyright 2018-2018, Chef Software Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require 'chef-helpers/internal' +require 'chef-helpers/which' + +module ChefHelpers + module Which + extend self + + def which(*cmds, extra_path: nil, &block) + where(*cmds, extra_path: extra_path, &block).first || false + end + + def where(*cmds, extra_path: nil, &block) + extra_path ||= PathSanity.sanitized_path + paths = Internal.env_path.split(::File::PATH_SEPARATOR) + Array(extra_path) + cmds.map do |cmd| + paths.map do |path| + filename = ::File.join(path, cmd) + filename if Which.valid_executable?(filename, &block) + end.compact + end.flatten + end + + class << self + def valid_executable?(filename, &block) + return false unless ::File.executable?(filename) && !::File.directory?(filename) + block ? yield(filename) : true + end + end + end +end |