diff --git a/forwardport/models/project.py b/forwardport/models/project.py index ae428299..c39b2ed2 100644 --- a/forwardport/models/project.py +++ b/forwardport/models/project.py @@ -80,6 +80,30 @@ class Project(models.Model): if not project.fp_github_email: raise UserError(_("The forward-port bot needs a primary email set up.")) + def _send_feedback(self): + super()._send_feedback() + ghs = {} + to_remove = [] + for f in self.env['forwardport.tagging'].search([]): + repo = f.repository + key = (repo, f.token_field) + gh = ghs.get(key) + if not gh: + gh = ghs[key] = repo.github(f.token_field) + + try: + gh('POST', 'issues/{}/labels'.format(f.pull_request), json={ + 'labels': json.loads(f.to_add) + }) + except Exception: + _logger.exception( + "Error while trying to add the tags %s to %s#%s", + f.to_add, repo.name, f.pull_request + ) + else: + to_remove.append(f.id) + if to_remove: + self.env['forwardport.tagging'].browse(to_remove).unlink() class Repository(models.Model): _inherit = 'runbot_merge.repository' @@ -480,14 +504,15 @@ class PullRequests(models.Model): (h, out, err) = conflicts.get(pr) or (None, None, None) + title, body = re.match(r'(?P[^\n]+)\n*(?P<body>.*)', message, flags=re.DOTALL).groups() + title = '[FW]' + title + if not body: + body = None + r = requests.post( 'https://api.github.com/repos/{}/pulls'.format(pr.repository.name), json={ - 'title': "Forward Port of #%d to %s%s" % ( - source.number, - target.name, - ' (failed)' if has_conflicts else '' - ), - 'body': message, + 'title': title, + 'body': body, 'head': '%s:%s' % (owner, new_branch), 'base': target.name, #'draft': has_conflicts, draft mode is not supported on private repos so remove it (again) @@ -566,6 +591,15 @@ More info at https://github.com/odoo/odoo/wiki/Mergebot#forward-port 'message': message, 'token_field': 'fp_github_token', }) + labels = ['forwardport'] + if has_conflicts: + labels.append('conflict') + self.env['forwardport.tagging'].create({ + 'repository': new_pr.repository.id, + 'pull_request': new_pr.number, + 'to_add': json.dumps(labels), + 'token_field': 'fp_github_token', + }) # not great but we probably want to avoid the risk of the webhook # creating the PR from under us. There's still a "hole" between # the POST being executed on gh and the commit but... @@ -811,6 +845,17 @@ class Feedback(models.Model): token_field = fields.Selection(selection_add=[('fp_github_token', 'Forwardport Bot')]) +class Tagging(models.Model): + _name = 'forwardport.tagging' + + token_field = fields.Selection([ + ('github_token', 'Mergebot'), + ('fp_github_token', 'Forwardport Bot'), + ], required=True) + repository = fields.Many2one('runbot_merge.repository', required=True) + pull_request = fields.Integer(string="PR number") + to_add = fields.Char(string="JSON-encoded array of labels to add") + def git(directory): return Repo(directory, check=True) class Repo: def __init__(self, directory, **config):