Commit a0771d2a authored by Michael Kozono's avatar Michael Kozono

Merge branch 'mk-cleanroom-which' into 'master'

Rewrite Gitlab::Utils.which function

See merge request gitlab-org/gitlab!76083
parents 678f0d51 5315a2e6
...@@ -120,18 +120,14 @@ module Gitlab ...@@ -120,18 +120,14 @@ module Gitlab
Random.rand(Float::MAX.to_i).to_s(36) Random.rand(Float::MAX.to_i).to_s(36)
end end
# See: http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby # Behaves like `which` on Linux machines: given PATH, try to resolve the given
# Cross-platform way of finding an executable in the $PATH. # executable name to an absolute path, or return nil.
# #
# which('ruby') #=> /usr/bin/ruby # which('ruby') #=> /usr/bin/ruby
def which(cmd, env = ENV) def which(filename)
exts = env['PATHEXT'] ? env['PATHEXT'].split(';') : [''] ENV['PATH']&.split(File::PATH_SEPARATOR)&.each do |path|
full_path = File.join(path, filename)
env['PATH'].split(File::PATH_SEPARATOR).each do |path| return full_path if File.executable?(full_path)
exts.each do |ext|
exe = File.join(path, "#{cmd}#{ext}")
return exe if File.executable?(exe) && !File.directory?(exe)
end
end end
nil nil
......
...@@ -249,10 +249,16 @@ RSpec.describe Gitlab::Utils do ...@@ -249,10 +249,16 @@ RSpec.describe Gitlab::Utils do
end end
describe '.which' do describe '.which' do
it 'finds the full path to an executable binary' do before do
expect(File).to receive(:executable?).with('/bin/sh').and_return(true) stub_env('PATH', '/sbin:/usr/bin:/home/joe/bin')
end
it 'finds the full path to an executable binary in order of appearance' do
expect(File).to receive(:executable?).with('/sbin/tool').ordered.and_return(false)
expect(File).to receive(:executable?).with('/usr/bin/tool').ordered.and_return(true)
expect(File).not_to receive(:executable?).with('/home/joe/bin/tool')
expect(which('sh', 'PATH' => '/bin')).to eq('/bin/sh') expect(which('tool')).to eq('/usr/bin/tool')
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment