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 @@
+