diff --git a/owners.py b/owners.py index 602fd31149..b8578023cf 100644 --- a/owners.py +++ b/owners.py @@ -610,3 +610,12 @@ class Database(object): lambda owner: total_costs_by_owner[owner] == lowest_cost, total_costs_by_owner) return random.Random().choice(lowest_cost_owners) + + def owners_rooted_at_file(self, filename): + """Returns a set of all owners transitively listed in filename. + + This function returns a set of all the owners either listed in filename, or + in a file transitively included by filename. Lines that are not plain owners + (i.e. per-file owners) are ignored. + """ + return self._read_just_the_owners(filename) diff --git a/tests/owners_unittest.py b/tests/owners_unittest.py index 5998c46d92..bc84786984 100755 --- a/tests/owners_unittest.py +++ b/tests/owners_unittest.py @@ -388,6 +388,14 @@ class OwnersDatabaseTest(_BaseTestCase): john: {'': 'comment preceeded by empty line'}, peter: {'': 'comment in the middle'}}) + def test_owners_rooted_at_file(self): + self.files['/foo/OWNERS'] = owners_file(darin, file='//bar/OWNERS') + self.files['/bar/OWNERS'] = owners_file(john, + lines=['per-file nope.cc=' + ben]) + db = self.db() + self.assertEqual(db.owners_rooted_at_file('foo/OWNERS'), + set([john, darin])) + class ReviewersForTest(_BaseTestCase): def assert_reviewers_for(self, files, potential_suggested_reviewers,