From fdb144a3af81fc38ff2c635ccf6969b01f8b1802 Mon Sep 17 00:00:00 2001 From: Xavier-Do Date: Wed, 4 Jan 2023 12:46:22 +0100 Subject: [PATCH] [IMP] runbot: allow to ignore forward-ports for a team --- runbot/models/build_config_codeowner.py | 24 ++++++++++++++++++------ runbot/models/team.py | 1 + runbot/views/dashboard_views.xml | 1 + 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/runbot/models/build_config_codeowner.py b/runbot/models/build_config_codeowner.py index b9a3ae20..79da1cff 100644 --- a/runbot/models/build_config_codeowner.py +++ b/runbot/models/build_config_codeowner.py @@ -112,6 +112,11 @@ class ConfigStep(models.Model): codeowners = build.env['runbot.codeowner'].search([('project_id', '=', bundle.project_id.id)]) regexes = self._codeowners_regexes(codeowners, build.params_id.version_id) modified_files = self._modified_files(build, pr_by_commit.keys()) + + if not modified_files: + return + + skippable_teams = self.env['runbot.team'].search(['|', ('skip_team_pr', '=', True), ('skip_fw_pr', '=', True)]) for commit_link, files in modified_files.items(): build._log('', 'Checking %s codeowner regexed on %s files' % (len(regexes), len(files))) reviewers = set() @@ -128,12 +133,19 @@ class ConfigStep(models.Model): pr = pr_by_commit[commit_link] new_reviewers = reviewers - set((pr.reviewers or '').split(',')) if new_reviewers: - skippable_teams = self.env['runbot.team'].search([('github_team', 'in', list(new_reviewers)), ('skip_team_pr', '=', True)]) - skippable_teams = skippable_teams.filtered(lambda team: pr.pr_author in team._get_members_logins()) - skipped_teams = set(skippable_teams.mapped('github_team')) - if skipped_teams: - new_reviewers = new_reviewers - skipped_teams - build._log('', 'Skipping teams %s since author is part of the team members' % (sorted(skipped_teams),), log_type='markdown') + # todo replace all team by a runbot team and simplify this logic to remove search + author_skippable_teams = skippable_teams.filtered(lambda team: team.skip_team_pr and team.github_team in new_reviewers and pr.pr_author in team._get_members_logins()) + author_skipped_teams = set(author_skippable_teams.mapped('github_team')) + if author_skipped_teams: + new_reviewers = new_reviewers - author_skipped_teams + build._log('', 'Skipping teams %s since author is part of the team members' % (sorted(author_skipped_teams),), log_type='markdown') + + fw_skippable_teams = skippable_teams.filtered(lambda team: team.skip_fw_pr and team.github_team in new_reviewers and pr.pr_author == fw_bot) + fw_skipped_teams = set(fw_skippable_teams.mapped('github_team')) + if fw_skipped_teams: + new_reviewers = new_reviewers - fw_skipped_teams + build._log('', 'Skipping teams %s (ignore forwardport)' % (sorted(fw_skipped_teams),), log_type='markdown') + new_reviewers = sorted(new_reviewers) build._log('', 'Requesting review for pull request [%s](%s): %s' % (pr.dname, pr.branch_url, ', '.join(new_reviewers)), log_type='markdown') diff --git a/runbot/models/team.py b/runbot/models/team.py index 1e438f80..f490367d 100644 --- a/runbot/models/team.py +++ b/runbot/models/team.py @@ -41,6 +41,7 @@ class RunbotTeam(models.Model): github_team = fields.Char('Github team', tracking=True) github_logins = fields.Char('Github logins', help='Additional github logins, prefer adding the login on the member of the team', tracking=True) skip_team_pr = fields.Boolean('Skip team pr', help="Don't add codeowner if pr was created by a member of the team", tracking=True) + skip_fw_pr = fields.Boolean('Skip forward-port pr', help="Don't add codeowner if pr is a forwardport, even when forced pushed", tracking=True) @api.model_create_single def create(self, values): diff --git a/runbot/views/dashboard_views.xml b/runbot/views/dashboard_views.xml index d72d650f..1fd0c4d0 100644 --- a/runbot/views/dashboard_views.xml +++ b/runbot/views/dashboard_views.xml @@ -12,6 +12,7 @@ +