forked from rubocop/rubocop
/
file_finder.rb
42 lines (34 loc) · 1018 Bytes
/
file_finder.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# frozen_string_literal: true
require 'pathname'
module RuboCop
# Common methods for finding files.
module FileFinder
def self.root_level=(level)
@root_level = level
end
def self.root_level?(path, stop_dir)
(@root_level || stop_dir) == path.to_s
end
def find_file_upwards(filename, start_dir, stop_dir = nil)
traverse_files_upwards(filename, start_dir, stop_dir) do |file|
# minimize iteration for performance
return file if file
end
end
def find_last_file_upwards(filename, start_dir, stop_dir = nil)
last_file = nil
traverse_files_upwards(filename, start_dir, stop_dir) do |file|
last_file = file
end
last_file
end
private
def traverse_files_upwards(filename, start_dir, stop_dir)
Pathname.new(start_dir).expand_path.ascend do |dir|
file = dir + filename
yield(file.to_s) if file.exist?
break if FileFinder.root_level?(dir, stop_dir)
end
end
end
end