@@ -74,36 +74,48 @@ def owner_for_codeowners_file(codeowners_file)
74
74
)
75
75
end
76
76
77
- # takes a file and finds the relevant `.codeowner` file by walking up the directory
77
+ # Takes a file and finds the relevant `.codeowner` file by walking up the directory
78
78
# structure. Example, given `a/b/c.rb`, this looks for `a/b/.codeowner`, `a/.codeowner`,
79
79
# and `.codeowner` in that order, stopping at the first file to actually exist.
80
+ # If the parovided file is a directory, it will look for `.codeowner` in that directory.
80
81
# We do additional caching so that we don't have to check for file existence every time
81
82
sig { params ( file : String ) . returns ( T . nilable ( CodeTeams ::Team ) ) }
82
83
def map_file_to_relevant_owner ( file )
83
84
file_path = Pathname . new ( file )
84
- path_components = file_path . each_filename . to_a . map { | path | Pathname . new ( path ) }
85
+ team = T . let ( nil , T . nilable ( CodeTeams :: Team ) )
85
86
86
- ( path_components . length - 1 ) . downto ( 0 ) . each do |i |
87
- potential_relative_path_name = T . must ( path_components [ 0 ...i ] ) . reduce ( Pathname . new ( '' ) ) { |built_path , path | built_path . join ( path ) }
88
- potential_codeowners_file = potential_relative_path_name . join ( CODEOWNERS_DIRECTORY_FILE_NAME )
87
+ if File . directory? ( file )
88
+ team = get_team_from_codeowners_file_within_directory ( file_path )
89
+ return team unless team . nil?
90
+ end
91
+
92
+ while file_path != Pathname ( '.' ) && file_path != Pathname ( '/' )
93
+ file_path = file_path . parent
94
+ team = get_team_from_codeowners_file_within_directory ( file_path )
95
+ return team unless team . nil?
96
+ end
89
97
90
- potential_codeowners_file_name = potential_codeowners_file . to_s
98
+ nil
99
+ end
91
100
92
- team = nil
93
- if @@directory_cache . key? ( potential_codeowners_file_name )
94
- team = @@directory_cache [ potential_codeowners_file_name ]
95
- elsif potential_codeowners_file . exist?
96
- team = owner_for_codeowners_file ( potential_codeowners_file )
101
+ sig { params ( directory : Pathname ) . returns ( T . nilable ( CodeTeams ::Team ) ) }
102
+ def get_team_from_codeowners_file_within_directory ( directory )
103
+ potential_codeowners_file = directory . join ( CODEOWNERS_DIRECTORY_FILE_NAME )
97
104
98
- @@directory_cache [ potential_codeowners_file_name ] = team
99
- else
100
- @@directory_cache [ potential_codeowners_file_name ] = nil
101
- end
105
+ potential_codeowners_file_name = potential_codeowners_file . to_s
102
106
103
- return team unless team . nil?
107
+ team = nil
108
+ if @@directory_cache . key? ( potential_codeowners_file_name )
109
+ team = @@directory_cache [ potential_codeowners_file_name ]
110
+ elsif potential_codeowners_file . exist?
111
+ team = owner_for_codeowners_file ( potential_codeowners_file )
112
+
113
+ @@directory_cache [ potential_codeowners_file_name ] = team
114
+ else
115
+ @@directory_cache [ potential_codeowners_file_name ] = nil
104
116
end
105
117
106
- nil
118
+ return team
107
119
end
108
120
end
109
121
end
0 commit comments