mirror of
https://github.com/odoo/runbot.git
synced 2025-03-15 15:35:46 +07:00

Adds a very limited ability to try and look for false positive / non-determinstic staging errors. It tries to err on the side of limiting false false positives, so it's likely to miss many. Currently has no automation / reporting, just sets a flag on the stagings which are strongly believed to have failed due to false positives. While at it, add link between a "root" staging and its splits. It's necessary to clear the "false positive" flag, and surfacing it in the UI could be useful one day. Fixes #660
473 lines
22 KiB
XML
473 lines
22 KiB
XML
<odoo>
|
|
|
|
<record id="form_repository" model="ir.ui.view">
|
|
<field name="name">Repository form</field>
|
|
<field name="model">runbot_merge.repository</field>
|
|
<field name="arch" type="xml">
|
|
<form>
|
|
<sheet>
|
|
<div class="oe_title">
|
|
<h1><field name="name"/></h1>
|
|
</div>
|
|
<group>
|
|
<group>
|
|
<field name="group_id" string="Accessible to"/>
|
|
</group>
|
|
<group>
|
|
<field name="branch_filter"/>
|
|
</group>
|
|
</group>
|
|
<separator string="Required Statuses"/>
|
|
<field name="status_ids">
|
|
<tree editable="bottom">
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open status"/>
|
|
<field name="context"/>
|
|
<field name="branch_filter"/>
|
|
<field name="prs"/>
|
|
<field name="stagings"/>
|
|
</tree>
|
|
</field>
|
|
</sheet>
|
|
</form>
|
|
</field>
|
|
</record>
|
|
<record id="runbot_merge_branch_form" model="ir.ui.view">
|
|
<field name="name">Branch Form</field>
|
|
<field name="model">runbot_merge.branch</field>
|
|
<field name="arch" type="xml">
|
|
<form>
|
|
<sheet>
|
|
<div class="oe_title">
|
|
<h1><field name="name"/></h1>
|
|
</div>
|
|
<group>
|
|
<group>
|
|
<field name="project_id" readonly="1"/>
|
|
<field name="sequence" readonly="1"/>
|
|
</group>
|
|
<group>
|
|
<field name="active"/>
|
|
<field name="staging_enabled"/>
|
|
</group>
|
|
</group>
|
|
<separator string="Stagings"/>
|
|
<group>
|
|
<field name="active_staging_id"/>
|
|
</group>
|
|
<field name="staging_ids" nolabel="1" readonly="1">
|
|
<tree default_order="staged_at desc">
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open staging"/>
|
|
<field name="id"/>
|
|
<field name="staged_at"/>
|
|
<field name="state"/>
|
|
</tree>
|
|
</field>
|
|
</sheet>
|
|
</form>
|
|
</field>
|
|
</record>
|
|
|
|
<record id="runbot_merge_action_projects" model="ir.actions.act_window">
|
|
<field name="name">Projects</field>
|
|
<field name="res_model">runbot_merge.project</field>
|
|
<field name="view_mode">tree,form</field>
|
|
</record>
|
|
|
|
<record id="runbot_merge_action_prs" model="ir.actions.act_window">
|
|
<field name="name">Pull Requests</field>
|
|
<field name="res_model">runbot_merge.pull_requests</field>
|
|
<field name="view_mode">tree,form</field>
|
|
<field name="context">{'search_default_open': True}</field>
|
|
</record>
|
|
<record id="runbot_merge_search_prs" model="ir.ui.view">
|
|
<field name="name">PR search</field>
|
|
<field name="model">runbot_merge.pull_requests</field>
|
|
<field name="arch" type="xml">
|
|
<search>
|
|
<filter
|
|
name="open" string="Open"
|
|
domain="[('state', 'not in', ['merged', 'closed'])]"
|
|
/>
|
|
<field name="label"/>
|
|
<field name="number"/>
|
|
<field name="author"/>
|
|
<field name="target"/>
|
|
<field name="repository"/>
|
|
<field name="state"/>
|
|
|
|
<group>
|
|
<filter string="Target" name="target_" context="{'group_by':'target'}"/>
|
|
<filter string="Repository" name="repo_" context="{'group_by':'repository'}"/>
|
|
<filter string="State" name="state_" context="{'group_by':'state'}"/>
|
|
<filter string="Priority" name="priority_" context="{'group_by':'priority'}"/>
|
|
</group>
|
|
</search>
|
|
</field>
|
|
</record>
|
|
<record id="runbot_merge_tree_prs" model="ir.ui.view">
|
|
<field name="name">PR tree</field>
|
|
<field name="model">runbot_merge.pull_requests</field>
|
|
<field name="arch" type="xml">
|
|
<tree>
|
|
<field name="repository"/>
|
|
<field name="number"/>
|
|
<field name="target"/>
|
|
<field name="state"/>
|
|
<field name="author"/>
|
|
<field name="reviewed_by"/>
|
|
<field name="write_date"/>
|
|
</tree>
|
|
</field>
|
|
</record>
|
|
<record id="runbot_merge_form_prs" model="ir.ui.view">
|
|
<field name="name">PR form</field>
|
|
<field name="model">runbot_merge.pull_requests</field>
|
|
<field name="arch" type="xml">
|
|
<form>
|
|
<header>
|
|
<div class="d-flex gap-1">
|
|
<button type="object" name="button_split" string="Split Off"/>
|
|
<field name="github_url" widget="url" class="btn btn-secondary mb-0" text="Github"/>
|
|
<field name="url" widget="url" class="btn btn-secondary mb-0" text="Frontend"/>
|
|
</div>
|
|
</header>
|
|
<sheet>
|
|
<field name="project" invisible="1"/>
|
|
<field name="target_sequence" invisible="1"/>
|
|
<div class="oe_title" colspan="2">
|
|
<h1>
|
|
<field name="repository" readonly="True"/>#<field name="number" readonly="True"/>
|
|
</h1>
|
|
<h2>
|
|
<field name="state"/>
|
|
<span invisible="state == 'merged' or not blocked">
|
|
<!--
|
|
The web client forces char fields to take 100%
|
|
width in all situations without (as far as I
|
|
can tell) opt out, if the view is in edition
|
|
mode. Which is now always the case for form views.
|
|
-->
|
|
(blocked: <field name="blocked" class="w-auto"/>)
|
|
</span>
|
|
<span invisible="state != 'merged'">
|
|
(<field name="merge_date" readonly="True"/>)
|
|
</span>
|
|
</h2>
|
|
</div>
|
|
<!-- main PR metadata -->
|
|
<group name="metadata">
|
|
<group>
|
|
<field name="batch_id"/>
|
|
<field name="target"/>
|
|
</group>
|
|
<group>
|
|
<field name="author"/>
|
|
<field name="head"/>
|
|
</group>
|
|
</group>
|
|
<notebook>
|
|
<page name="state" string="State">
|
|
<group>
|
|
<group>
|
|
<field name="reviewed_by"/>
|
|
<field name="closed"/>
|
|
<field name="error"/>
|
|
</group>
|
|
<group>
|
|
<field name="status"/>
|
|
<details colspan="4">
|
|
<summary>Commit Statuses</summary>
|
|
|
|
<field name="statuses"/>
|
|
</details>
|
|
<details colspan="4">
|
|
<summary>Overrides</summary>
|
|
<field name="overrides"/>
|
|
</details>
|
|
</group>
|
|
</group>
|
|
</page>
|
|
<page name="configuration" string="Configuration">
|
|
<group>
|
|
<group>
|
|
<field name="merge_method"/>
|
|
<field name="squash"/>
|
|
<field name="draft"/>
|
|
</group>
|
|
<group>
|
|
<field name="priority"/>
|
|
<field name="skipchecks" widget="boolean_toggle"/>
|
|
<field name="cancel_staging" widget="boolean_toggle"/>
|
|
</group>
|
|
</group>
|
|
<group string="Delegates">
|
|
<group colspan="4">
|
|
<field colspan="2" name="delegates" nolabel="1">
|
|
<tree>
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open partner"/>
|
|
<field name="name"/>
|
|
<field name="github_login"/>
|
|
</tree>
|
|
</field>
|
|
</group>
|
|
</group>
|
|
</page>
|
|
<page name="stagings" string="Staging History">
|
|
<group>
|
|
<group colspan="4">
|
|
<field colspan="2" name="staging_ids" nolabel="1" readonly="1">
|
|
<tree>
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open staging"/>
|
|
<field name="staged_at"/>
|
|
<field name="state"/>
|
|
<field name="reason"/>
|
|
</tree>
|
|
</field>
|
|
</group>
|
|
</group>
|
|
</page>
|
|
<page name="porting" string="Forward-Porting">
|
|
<group>
|
|
<group>
|
|
<field name="limit_id" domain="[('project_id', '=', project), ('sequence', '<=', target_sequence)]"/>
|
|
<field string="Original PR" name="source_id"/>
|
|
<field name="parent_id"/>
|
|
<field
|
|
invisible="source_id and not parent_id"
|
|
string="Detached because" name="detach_reason" readonly="1"/>
|
|
</group>
|
|
<group>
|
|
<field colspan="2" name="forwardport_ids" nolabel="1" readonly="True">
|
|
<tree>
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open PR"/>
|
|
<field name="target" string="Branch"/>
|
|
<field name="number"/>
|
|
</tree>
|
|
</field>
|
|
</group>
|
|
</group>
|
|
</page>
|
|
</notebook>
|
|
<!-- influencers -->
|
|
<group string="Message">
|
|
<group colspan="4">
|
|
<field colspan="2" name="message" nolabel="1" readonly="1"/>
|
|
</group>
|
|
</group>
|
|
</sheet>
|
|
<div class="oe_chatter">
|
|
<field name="message_follower_ids" widget="mail_followers"/>
|
|
<field name="message_ids" widget="mail_thread"/>
|
|
</div>
|
|
</form>
|
|
</field>
|
|
</record>
|
|
|
|
<record id="runbot_merge_pull_requests_split_off_form" model="ir.ui.view">
|
|
<field name="name">Split Off Form</field>
|
|
<field name="model">runbot_merge.pull_requests.split_off</field>
|
|
<field name="arch" type="xml">
|
|
<form>
|
|
<field name="new_label" colspan="4"/>
|
|
<footer>
|
|
<button type="object" name="button_apply" string="Apply" class="btn btn-primary"/>
|
|
<button special="cancel" string="Cancel" class="btn btn-secondary"/>
|
|
</footer>
|
|
</form>
|
|
</field>
|
|
</record>
|
|
|
|
<record id="runbot_merge_action_stagings" model="ir.actions.act_window">
|
|
<field name="name">Stagings</field>
|
|
<field name="res_model">runbot_merge.stagings</field>
|
|
<field name="view_mode">tree,form</field>
|
|
<field name="context">{'search_default_active': True, 'active_test': False}</field>
|
|
</record>
|
|
<record id="runbot_merge_search_stagings" model="ir.ui.view">
|
|
<field name="name">Stagings Search</field>
|
|
<field name="model">runbot_merge.stagings</field>
|
|
<field name="arch" type="xml">
|
|
<search>
|
|
<filter string="Active" name="active"
|
|
domain="[('active', '=', True)]"/>
|
|
<field name="state"/>
|
|
<field name="target"/>
|
|
|
|
<group>
|
|
<filter string="Target" name="target_" context="{'group_by': 'target'}"/>
|
|
</group>
|
|
</search>
|
|
</field>
|
|
</record>
|
|
<record id="runbot_merge_tree_stagings" model="ir.ui.view">
|
|
<field name="name">Stagings Tree</field>
|
|
<field name="model">runbot_merge.stagings</field>
|
|
<field name="arch" type="xml">
|
|
<tree>
|
|
<field name="target"/>
|
|
<field name="state"/>
|
|
</tree>
|
|
</field>
|
|
</record>
|
|
<record id="runbot_merge_form_stagings" model="ir.ui.view">
|
|
<field name="name">Stagings Form</field>
|
|
<field name="model">runbot_merge.stagings</field>
|
|
<field name="arch" type="xml">
|
|
<form>
|
|
<field name="active" invisible="1"/>
|
|
<header>
|
|
<button type="object" name="action_cancel" string="Cancel" class="oe_highlight"
|
|
invisible="not active"
|
|
/>
|
|
</header>
|
|
<sheet>
|
|
<group>
|
|
<group>
|
|
<field name="target"/>
|
|
<field name="state"/>
|
|
<field name="reason"/>
|
|
</group>
|
|
<group>
|
|
<field name="staged_at"/>
|
|
<field string="Staging Duration (seconds)"
|
|
name="staging_duration" widget="integer"/>
|
|
</group>
|
|
</group>
|
|
<notebook>
|
|
<page string="PRs">
|
|
<group string="Batches">
|
|
<field name="batch_ids" colspan="4" nolabel="1" readonly="1">
|
|
<tree>
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open batch"/>
|
|
<field name="name"/>
|
|
<field name="prs" widget="many2many_tags"/>
|
|
</tree>
|
|
</field>
|
|
</group>
|
|
<group string="PRs">
|
|
<field name="pr_ids" colspan="4" nolabel="1" readonly="1">
|
|
<tree>
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open pr"/>
|
|
<field name="display_name"/>
|
|
<field name="github_url" widget="url"/>
|
|
<field name="url" widget="url"/>
|
|
</tree>
|
|
</field>
|
|
</group>
|
|
</page>
|
|
<page string="Commits">
|
|
<group>
|
|
<group string="Heads">
|
|
<field name="head_ids" colspan="2" nolabel="1" readonly="1">
|
|
<tree>
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open head"/>
|
|
<field name="sha"/>
|
|
</tree>
|
|
</field>
|
|
</group>
|
|
<group string="Commits">
|
|
<field name="commit_ids" colspan="2" nolabel="1" readonly="1">
|
|
<tree>
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open commit"/>
|
|
<field name="sha"/>
|
|
</tree>
|
|
</field>
|
|
</group>
|
|
</group>
|
|
</page>
|
|
<page string="Splits">
|
|
<field name="child_ids" colspan="4" nolabel="1" readonly="1">
|
|
<tree>
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open pr"/>
|
|
<field name="display_name"/>
|
|
<field name="state"/>
|
|
<field name="reason"/>
|
|
</tree>
|
|
</field>
|
|
</page>
|
|
</notebook>
|
|
</sheet>
|
|
</form>
|
|
</field>
|
|
</record>
|
|
|
|
<record id="runbot_merge_action_commits" model="ir.actions.act_window">
|
|
<field name="name">Commit Statuses</field>
|
|
<field name="res_model">runbot_merge.commit</field>
|
|
<field name="view_mode">tree,form</field>
|
|
</record>
|
|
<record id="runbot_merge_commits_search" model="ir.ui.view">
|
|
<field name="name">commits search</field>
|
|
<field name="model">runbot_merge.commit</field>
|
|
<field name="arch" type="xml">
|
|
<search>
|
|
<field name="sha" operator="="/>
|
|
</search>
|
|
</field>
|
|
</record>
|
|
<record id="runbot_merge_commits_tree" model="ir.ui.view">
|
|
<field name="name">commits list</field>
|
|
<field name="model">runbot_merge.commit</field>
|
|
<field name="arch" type="xml">
|
|
<tree>
|
|
<field name="sha"/>
|
|
</tree>
|
|
</field>
|
|
</record>
|
|
<record id="runbot_merge_commits_form" model="ir.ui.view">
|
|
<field name="name">commits form</field>
|
|
<field name="model">runbot_merge.commit</field>
|
|
<field name="arch" type="xml">
|
|
<form>
|
|
<sheet>
|
|
<div class="oe_title">
|
|
<h1><field name="sha"/></h1>
|
|
</div>
|
|
<field name="statuses" widget="json"/>
|
|
<separator string="Pull Requests"/>
|
|
<field name="pull_requests" nolabel="1">
|
|
<tree>
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open pr"/>
|
|
<field name="display_name"/>
|
|
<field name="state"/>
|
|
</tree>
|
|
</field>
|
|
<separator string="Stagings (commits)"/>
|
|
<field name="commit_ids" nolabel="1" readonly="1">
|
|
<tree>
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open commit"/>
|
|
<field name="target"/>
|
|
<field name="id"/>
|
|
<field name="staged_at"/>
|
|
<field name="state"/>
|
|
</tree>
|
|
</field>
|
|
<separator string="Stagings (heads)"/>
|
|
<field name="head_ids" nolabel="1" readonly="1">
|
|
<tree>
|
|
<button type="object" name="get_formview_action" icon="fa-external-link" title="open head"/>
|
|
<field name="target"/>
|
|
<field name="id"/>
|
|
<field name="staged_at"/>
|
|
<field name="state"/>
|
|
</tree>
|
|
</field>
|
|
</sheet>
|
|
</form>
|
|
</field>
|
|
</record>
|
|
|
|
<menuitem name="Mergebot" id="runbot_merge_menu">
|
|
<menuitem name="Pull Requests" id="runbot_merge_menu_prs"
|
|
action="runbot_merge_action_prs" sequence="5"/>
|
|
<menuitem name="Stagings" id="runbot_merge_menu_stagings"
|
|
action="runbot_merge_action_stagings" sequence="8"/>
|
|
<menuitem name="Projects" id="runbot_merge_menu_project"
|
|
action="runbot_merge_action_projects"/>
|
|
<menuitem name="Batches" id="runbot_merge_menu_batches"
|
|
action="runbot_merge_action_batches"/>
|
|
<menuitem name="Commits" id="runbot_merge_menu_commits"
|
|
action="runbot_merge_action_commits"/>
|
|
</menuitem>
|
|
</odoo>
|