@@ -10,8 +10,6 @@ class DirectoryOwnership
1010 include Mapper
1111
1212 CODEOWNERS_DIRECTORY_FILE_NAME = '.codeowner'
13- RELATIVE_ROOT = Pathname ( '.' ) . freeze
14- ABSOLUTE_ROOT = Pathname ( '/' ) . freeze
1513
1614 @@directory_cache = T . let ( { } , T ::Hash [ String , T . nilable ( CodeTeams ::Team ) ] ) # rubocop:disable Style/ClassVars
1715
@@ -76,46 +74,36 @@ def owner_for_codeowners_file(codeowners_file)
7674 )
7775 end
7876
79- # 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
8078 # structure. Example, given `a/b/c.rb`, this looks for `a/b/.codeowner`, `a/.codeowner`,
8179 # and `.codeowner` in that order, stopping at the first file to actually exist.
82- # If the parovided file is a directory, it will look for `.codeowner` in that directory and then upwards.
83- # We do additional caching so that we don't have to check for file existence every time.
80+ # We do additional caching so that we don't have to check for file existence every time
8481 sig { params ( file : String ) . returns ( T . nilable ( CodeTeams ::Team ) ) }
8582 def map_file_to_relevant_owner ( file )
8683 file_path = Pathname . new ( file )
87- team = T . let ( nil , T . nilable ( CodeTeams :: Team ) )
84+ path_components = file_path . each_filename . to_a . map { | path | Pathname . new ( path ) }
8885
89- if File . directory? ( file )
90- team = get_team_from_codeowners_file_within_directory ( file_path )
91- end
92-
93- while team . nil? && file_path != RELATIVE_ROOT && file_path != ABSOLUTE_ROOT
94- file_path = file_path . parent
95- team = get_team_from_codeowners_file_within_directory ( file_path )
96- end
97-
98- team
99- end
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 )
10089
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 )
90+ potential_codeowners_file_name = potential_codeowners_file . to_s
10491
105- potential_codeowners_file_name = potential_codeowners_file . to_s
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 )
10697
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 )
98+ @@directory_cache [ potential_codeowners_file_name ] = team
99+ else
100+ @@directory_cache [ potential_codeowners_file_name ] = nil
101+ end
112102
113- @@directory_cache [ potential_codeowners_file_name ] = team
114- else
115- @@directory_cache [ potential_codeowners_file_name ] = nil
103+ return team unless team . nil?
116104 end
117105
118- return team
106+ nil
119107 end
120108 end
121109 end
0 commit comments