mirror of
https://github.com/odoo/runbot.git
synced 2025-03-15 23:45:44 +07:00
[IMP] runbot: better support of canonical tags
This commit is contained in:
parent
f37bb26a78
commit
3fc6b5b2b9
@ -100,6 +100,7 @@ class BuildError(models.Model):
|
|||||||
fixing_pr_url = fields.Char('Fixing PR url', related='fixing_pr_id.branch_url')
|
fixing_pr_url = fields.Char('Fixing PR url', related='fixing_pr_id.branch_url')
|
||||||
|
|
||||||
test_tags = fields.Char(string='Test tags', help="Comma separated list of test_tags to use to reproduce/remove this error", tracking=True)
|
test_tags = fields.Char(string='Test tags', help="Comma separated list of test_tags to use to reproduce/remove this error", tracking=True)
|
||||||
|
canonical_tags = fields.Char('Canonical tag', compute='_compute_canonical_tags', store=True)
|
||||||
tags_min_version_excluded_id = fields.Many2one('runbot.version', 'Tag min version (excluded)')
|
tags_min_version_excluded_id = fields.Many2one('runbot.version', 'Tag min version (excluded)')
|
||||||
tags_min_version_id = fields.Many2one('runbot.version', 'Tags Min version', compute="_compute_tags_min_version_id", inverse="_inverse_tags_min_version_id", help="Minimal version where the test tags will be applied.", tracking=True)
|
tags_min_version_id = fields.Many2one('runbot.version', 'Tags Min version', compute="_compute_tags_min_version_id", inverse="_inverse_tags_min_version_id", help="Minimal version where the test tags will be applied.", tracking=True)
|
||||||
tags_max_version_id = fields.Many2one('runbot.version', 'Tags Max version', help="Maximal version where the test tags will be applied.", tracking=True)
|
tags_max_version_id = fields.Many2one('runbot.version', 'Tags Max version', help="Maximal version where the test tags will be applied.", tracking=True)
|
||||||
@ -135,6 +136,11 @@ class BuildError(models.Model):
|
|||||||
if records.tags_min_version_id:
|
if records.tags_min_version_id:
|
||||||
records.tags_min_version_excluded_id = next((version for version in all_versions if version.number < records.tags_min_version_id.number), False)
|
records.tags_min_version_excluded_id = next((version for version in all_versions if version.number < records.tags_min_version_id.number), False)
|
||||||
|
|
||||||
|
@api.depends('error_content_ids.canonical_tag')
|
||||||
|
def _compute_canonical_tags(self):
|
||||||
|
for record in self:
|
||||||
|
record.canonical_tags = ','.join(record.error_content_ids.filtered('canonical_tag').mapped('canonical_tag'))
|
||||||
|
|
||||||
@api.depends('tags_min_version_id')
|
@api.depends('tags_min_version_id')
|
||||||
def _compute_tags_min_version_id(self):
|
def _compute_tags_min_version_id(self):
|
||||||
all_versions = self.env['runbot.version'].search([]).sorted(lambda rec: (rec.sequence, rec.number))
|
all_versions = self.env['runbot.version'].search([]).sorted(lambda rec: (rec.sequence, rec.number))
|
||||||
@ -423,6 +429,12 @@ class BuildError(models.Model):
|
|||||||
record.team_id = team
|
record.team_id = team
|
||||||
break
|
break
|
||||||
|
|
||||||
|
def action_copy_canonical_tag(self):
|
||||||
|
for record in self:
|
||||||
|
if record.canonical_tags:
|
||||||
|
record.test_tags = record.canonical_tags
|
||||||
|
record._onchange_test_tags()
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _parse_logs(self, ir_logs):
|
def _parse_logs(self, ir_logs):
|
||||||
if not ir_logs:
|
if not ir_logs:
|
||||||
@ -506,6 +518,7 @@ class BuildErrorContent(models.Model):
|
|||||||
content = fields.Text('Error message', required=True)
|
content = fields.Text('Error message', required=True)
|
||||||
cleaned_content = fields.Text('Cleaned error message')
|
cleaned_content = fields.Text('Cleaned error message')
|
||||||
metadata = JsonDictField('Metadata')
|
metadata = JsonDictField('Metadata')
|
||||||
|
canonical_tag = fields.Char('Canonical tag', compute='_compute_canonical_tag', store=True)
|
||||||
summary = fields.Char('Content summary', compute='_compute_summary', store=False)
|
summary = fields.Char('Content summary', compute='_compute_summary', store=False)
|
||||||
module_name = fields.Char('Module name') # name in ir_logging
|
module_name = fields.Char('Module name') # name in ir_logging
|
||||||
file_path = fields.Char('File Path') # path in ir logging
|
file_path = fields.Char('File Path') # path in ir logging
|
||||||
@ -578,6 +591,11 @@ class BuildErrorContent(models.Model):
|
|||||||
if not previous_error.error_content_ids:
|
if not previous_error.error_content_ids:
|
||||||
build_error.error_id._merge(previous_error)
|
build_error.error_id._merge(previous_error)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@api.depends('metadata')
|
||||||
|
def _compute_canonical_tag(self):
|
||||||
|
for record in self:
|
||||||
|
record.canonical_tag = record.metadata.get('test', {}).get('canonical_tag')
|
||||||
|
|
||||||
@api.depends('build_error_link_ids')
|
@api.depends('build_error_link_ids')
|
||||||
def _compute_build_ids(self):
|
def _compute_build_ids(self):
|
||||||
@ -835,10 +853,11 @@ class ErrorQualifyRegex(models.Model):
|
|||||||
active = fields.Boolean('Active', default=True, tracking=True)
|
active = fields.Boolean('Active', default=True, tracking=True)
|
||||||
regex = fields.Char('Regular expression', required=True, tracking=True)
|
regex = fields.Char('Regular expression', required=True, tracking=True)
|
||||||
|
|
||||||
|
check_canonical_tag = fields.Boolean('Check canonical tag', default=False, help='Apply regex on canonical tag')
|
||||||
check_module_name = fields.Boolean('Check Module Name', default=False, help='Apply regex on Error Module Name')
|
check_module_name = fields.Boolean('Check Module Name', default=False, help='Apply regex on Error Module Name')
|
||||||
check_file_path = fields.Boolean('Check File Path', default=False, help='Apply regex on Error Module Name')
|
check_file_path = fields.Boolean('Check File Path', default=False, help='Apply regex on Error Module Name')
|
||||||
check_function = fields.Boolean('Check Function name', default=False, help='Apply regex on Error Function Name')
|
check_function = fields.Boolean('Check Function name', default=False, help='Apply regex on Error Function Name')
|
||||||
check_content = fields.Boolean('Check content', default=True, help='Apply regex on Error Csontent')
|
check_content = fields.Boolean('Check content', default=True, help='Apply regex on Error Content')
|
||||||
|
|
||||||
check_fields = fields.Char('Checked Fields', compute='_compute_check_fields', help='Fields on which regex is applied')
|
check_fields = fields.Char('Checked Fields', compute='_compute_check_fields', help='Fields on which regex is applied')
|
||||||
|
|
||||||
@ -879,11 +898,11 @@ for error_content in self:
|
|||||||
"The regular expresion should contain at least one named group pattern e.g: '(?P<module>.+)'"
|
"The regular expresion should contain at least one named group pattern e.g: '(?P<module>.+)'"
|
||||||
)
|
)
|
||||||
|
|
||||||
@api.depends('check_module_name', 'check_file_path', 'check_function', 'check_content')
|
@api.depends('check_module_name', 'check_file_path', 'check_function', 'check_content', 'check_canonical_tag')
|
||||||
def _compute_check_fields(self):
|
def _compute_check_fields(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
res = []
|
res = []
|
||||||
for cf in ['module_name', 'file_path', 'function', 'content']:
|
for cf in ['canonical_tag', 'module_name', 'file_path', 'function', 'content']:
|
||||||
if record[f'check_{cf}']:
|
if record[f'check_{cf}']:
|
||||||
res.append(cf)
|
res.append(cf)
|
||||||
record.check_fields = ','.join(res)
|
record.check_fields = ','.join(res)
|
||||||
|
@ -32,20 +32,16 @@
|
|||||||
</list>
|
</list>
|
||||||
</field>
|
</field>
|
||||||
</group>
|
</group>
|
||||||
<group name="fixer_info" string="Fixing" col="2">
|
<group>
|
||||||
<group>
|
<group name="fixer_info" string="Fixing" col="2">
|
||||||
<field name="responsible"/>
|
<field name="responsible"/>
|
||||||
<field name="customer"/>
|
<field name="customer"/>
|
||||||
<field name="team_id"/>
|
<field name="team_id"/>
|
||||||
<field name="fixing_pr_id"/>
|
<field name="fixing_pr_id"/>
|
||||||
<field name="fixing_pr_url" widget="pull_request_url"/>
|
<field name="fixing_pr_url" widget="pull_request_url"/>
|
||||||
<field name="active"/>
|
<field name="active"/>
|
||||||
<field name="test_tags" decoration-danger="True" readonly="1" groups="!runbot.group_runbot_admin"/>
|
|
||||||
<field name="test_tags" decoration-danger="True" groups="runbot.group_runbot_admin"/>
|
|
||||||
<field name="tags_min_version_id" invisible="not test_tags"/>
|
|
||||||
<field name="tags_max_version_id" invisible="not test_tags"/>
|
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group name="appearance_info" string="Appearance" col="2">
|
||||||
<field name="version_ids" widget="many2many_tags"/>
|
<field name="version_ids" widget="many2many_tags"/>
|
||||||
<field name="trigger_ids" widget="many2many_tags"/>
|
<field name="trigger_ids" widget="many2many_tags"/>
|
||||||
<field name="tag_ids" widget="many2many_tags"/>
|
<field name="tag_ids" widget="many2many_tags"/>
|
||||||
@ -56,6 +52,14 @@
|
|||||||
<field name="last_seen_build_id" invisible="True"/>
|
<field name="last_seen_build_id" invisible="True"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
<group name="test_tags_group" string="Disabling">
|
||||||
|
<field name="canonical_tags"/>
|
||||||
|
<button name="action_copy_canonical_tag" type="object" groups="runbot.group_runbot_admin">Disable test using canonical tag</button>
|
||||||
|
<field name="test_tags" decoration-danger="True" readonly="1" groups="!runbot.group_runbot_admin"/>
|
||||||
|
<field name="test_tags" decoration-danger="True" groups="runbot.group_runbot_admin"/>
|
||||||
|
<field name="tags_min_version_id" invisible="not test_tags"/>
|
||||||
|
<field name="tags_max_version_id" invisible="not test_tags" />
|
||||||
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="previous_error_id" readonly="1" invisible="not previous_error_id" text-decoration-danger="True"/>
|
<field name="previous_error_id" readonly="1" invisible="not previous_error_id" text-decoration-danger="True"/>
|
||||||
</group>
|
</group>
|
||||||
@ -205,7 +209,8 @@
|
|||||||
</group>
|
</group>
|
||||||
<group name="build_error_group" string="Base info" col="2">
|
<group name="build_error_group" string="Base info" col="2">
|
||||||
<field name="content" readonly="1"/>
|
<field name="content" readonly="1"/>
|
||||||
<field name="metadata" readonly="1"/>
|
<field name="canonical_tag"/>
|
||||||
|
<field name="metadata" readonly="0" widget="runbotjsonb"/>
|
||||||
<field name="module_name" readonly="1"/>
|
<field name="module_name" readonly="1"/>
|
||||||
<field name="function" readonly="1"/>
|
<field name="function" readonly="1"/>
|
||||||
<field name="file_path" readonly="1"/>
|
<field name="file_path" readonly="1"/>
|
||||||
@ -325,6 +330,7 @@
|
|||||||
<button name="%(runbot.runbot_open_bulk_wizard)d" string="Bulk Update" type="action" groups="runbot.group_runbot_admin,runbot.group_runbot_error_manager"/>
|
<button name="%(runbot.runbot_open_bulk_wizard)d" string="Bulk Update" type="action" groups="runbot.group_runbot_admin,runbot.group_runbot_error_manager"/>
|
||||||
</header>
|
</header>
|
||||||
<field name="name" optional="show" readonly="1"/>
|
<field name="name" optional="show" readonly="1"/>
|
||||||
|
<field name="canonical_tags" optional="hide" readonly="1"/>
|
||||||
<field name="description" optional="hide" readonly="1"/>
|
<field name="description" optional="hide" readonly="1"/>
|
||||||
<field name="random" string="Random"/>
|
<field name="random" string="Random"/>
|
||||||
<field name="first_seen_date" string="First Seen" optional="hide" readonly="1"/>
|
<field name="first_seen_date" string="First Seen" optional="hide" readonly="1"/>
|
||||||
@ -360,7 +366,8 @@
|
|||||||
<button name="action_qualify" string="Qualify" type="object" groups="runbot.group_runbot_admin,runbot.group_runbot_error_manager"/>
|
<button name="action_qualify" string="Qualify" type="object" groups="runbot.group_runbot_admin,runbot.group_runbot_error_manager"/>
|
||||||
</header>
|
</header>
|
||||||
<field name="error_display_id" optional="show"/>
|
<field name="error_display_id" optional="show"/>
|
||||||
<field name="module_name" optional="show" readonly="1"/>
|
<field name="canonical_tag" optional="show" readonly="1"/>
|
||||||
|
<field name="module_name" optional="hide" readonly="1"/>
|
||||||
<field name="summary" optional="show" readonly="1"/>
|
<field name="summary" optional="show" readonly="1"/>
|
||||||
<field name="random" string="Random"/>
|
<field name="random" string="Random"/>
|
||||||
<field name="first_seen_date" string="First Seen" optional="hide" readonly="1"/>
|
<field name="first_seen_date" string="First Seen" optional="hide" readonly="1"/>
|
||||||
@ -384,7 +391,7 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<search string="Search errors">
|
<search string="Search errors">
|
||||||
<field name="content"/>
|
<field name="content"/>
|
||||||
<field name="description"/>
|
<field name="canonical_tags"/>
|
||||||
<field name="version_ids"/>
|
<field name="version_ids"/>
|
||||||
<field name="responsible"/>
|
<field name="responsible"/>
|
||||||
<field name="team_id"/>
|
<field name="team_id"/>
|
||||||
@ -548,6 +555,7 @@
|
|||||||
<sheet>
|
<sheet>
|
||||||
<group name="Regex And Source">
|
<group name="Regex And Source">
|
||||||
<field name="regex"/>
|
<field name="regex"/>
|
||||||
|
<field name="check_canonical_tag"/>
|
||||||
<field name="check_module_name"/>
|
<field name="check_module_name"/>
|
||||||
<field name="check_file_path"/>
|
<field name="check_file_path"/>
|
||||||
<field name="check_function"/>
|
<field name="check_function"/>
|
||||||
|
Loading…
Reference in New Issue
Block a user