From c8bdd4f31edcaadd48b13439fa697dc650904d8d Mon Sep 17 00:00:00 2001 From: Christophe Monniez Date: Thu, 16 Feb 2023 15:36:20 +0100 Subject: [PATCH] [IMP] runbot: imrpove pseudo markdown --- runbot/common.py | 23 ++++++++++++++++++++++- runbot/models/build_config_codeowner.py | 6 +++--- runbot/tests/test_event.py | 15 ++++++++++++++- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/runbot/common.py b/runbot/common.py index 82ea8926..df088500 100644 --- a/runbot/common.py +++ b/runbot/common.py @@ -133,6 +133,27 @@ def list_local_dbs(additionnal_conditions=None): """ % additionnal_condition_str) return [d[0] for d in local_cr.fetchall()] +def markdown_escape(text): + patterns = { + r'\*\*(.+?)\*\*': '\\*\\*\\g<1>\\*\\*', + r'~~(.+?)~~': '\\~\\~\\g<1>\\~\\~', + r'__(.+?)__': '\\_\\_\\g<1>\\_\\_', + } + + for p, b in patterns.items(): + text = re.sub(p, b, text, flags=re.DOTALL) + return text + +def markdown_unescape(text): + patterns = { + r'\\\*\\\*': '**', + r'\\\~\\\~': '~~', + r'\\\_\\\_': '__', + } + + for p, b in patterns.items(): + text = re.sub(p, b, text, flags=re.DOTALL) + return text def pseudo_markdown(text): text = html_escape(text) @@ -166,7 +187,7 @@ def pseudo_markdown(text): return f'{codes[int(match.group(1))]}' text = Markup(re.sub(r'(\d+)', code_replace, text, flags=re.DOTALL)) - return text + return markdown_unescape(text) def _make_github_session(token): diff --git a/runbot/models/build_config_codeowner.py b/runbot/models/build_config_codeowner.py index 79da1cff..a79f1ed7 100644 --- a/runbot/models/build_config_codeowner.py +++ b/runbot/models/build_config_codeowner.py @@ -1,6 +1,6 @@ import re from odoo import models, fields - +from odoo.addons.runbot.common import markdown_escape class ConfigStep(models.Model): _inherit = 'runbot.build.config.step' @@ -124,10 +124,10 @@ class ConfigStep(models.Model): for file, file_reviewers in reviewer_per_file.items(): href = 'https://%s/blob/%s/%s' % (commit_link.branch_id.remote_id.base_url, commit_link.commit_id.name, file.split('/', 1)[-1]) if file_reviewers: - build._log('', 'Adding %s to reviewers for file [%s](%s)' % (', '.join(sorted(file_reviewers)), file, href), log_type='markdown') + build._log('', 'Adding %s to reviewers for file [%s](%s)' % (', '.join(sorted(file_reviewers)), markdown_escape(file), href), log_type='markdown') reviewers |= file_reviewers else: - build._log('', 'No reviewer for file [%s](%s)' % (file, href), log_type='markdown') + build._log('', 'No reviewer for file [%s](%s)' % (markdown_escape(file), href), log_type='markdown') if reviewers: pr = pr_by_commit[commit_link] diff --git a/runbot/tests/test_event.py b/runbot/tests/test_event.py index a969741b..5761f705 100644 --- a/runbot/tests/test_event.py +++ b/runbot/tests/test_event.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from .common import RunbotCase - +from odoo.addons.runbot.common import markdown_escape class TestIrLogging(RunbotCase): @@ -60,6 +60,19 @@ class TestIrLogging(RunbotCase): 'This link goes to somewhere and this one to nowhere.' ) + # test links with markdown like symbols + log.message = f'Adding validation to reviewers for file [{markdown_escape("foo/__init__.py")}](https://www.nowhere.com/)' + self.assertEqual( + log._markdown(), + 'Adding validation to reviewers for file foo/__init__.py' + ) + + log.message = f'~~{markdown_escape("foo/__init__.py")}~~' + self.assertEqual( + log._markdown(), + 'foo/__init__.py' + ) + # test link with icon log.message = '[@icon-download](https://wwww.somewhere.com) goes to somewhere.' self.assertEqual(