mirror of
https://github.com/odoo/runbot.git
synced 2025-03-27 13:25:47 +07:00
[CHG] runbot_merge: move merge_date to batch, remove active
- `merge_date` should be common to an entire batch, so move it there - remove `Batch.active` which should probably have been removed when batches were made persistent (can eventually re-add as a proxy for `merge_date` being set maybe, but for now removing it seems a better way to catch mistakes) - update various sites to use `Batch.merge_date` instead of `Batch.active`
This commit is contained in:
parent
e910b8e857
commit
21b5dd439b
@ -258,11 +258,6 @@ class PullRequests(models.Model):
|
|||||||
token_field='fp_github_token',
|
token_field='fp_github_token',
|
||||||
format_args={'pr': parent, 'child': p},
|
format_args={'pr': parent, 'child': p},
|
||||||
)
|
)
|
||||||
if vals.get('merge_date'):
|
|
||||||
self.env['forwardport.branch_remover'].create([
|
|
||||||
{'pr_id': p.id}
|
|
||||||
for p in self
|
|
||||||
])
|
|
||||||
# if we change the policy to skip CI, schedule followups on existing FPs
|
# if we change the policy to skip CI, schedule followups on existing FPs
|
||||||
if vals.get('fw_policy') == 'skipci' and self.state == 'merged':
|
if vals.get('fw_policy') == 'skipci' and self.state == 'merged':
|
||||||
self.env['runbot_merge.pull_requests'].search([
|
self.env['runbot_merge.pull_requests'].search([
|
||||||
@ -344,8 +339,6 @@ class PullRequests(models.Model):
|
|||||||
})
|
})
|
||||||
resumed = tip
|
resumed = tip
|
||||||
else:
|
else:
|
||||||
# reactivate batch
|
|
||||||
tip.batch_id.active = True
|
|
||||||
resumed = tip._schedule_fp_followup()
|
resumed = tip._schedule_fp_followup()
|
||||||
if resumed:
|
if resumed:
|
||||||
addendum += f', resuming forward-port stopped at {tip.display_name}'
|
addendum += f', resuming forward-port stopped at {tip.display_name}'
|
||||||
@ -982,6 +975,21 @@ stderr:
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
class Batch(models.Model):
|
||||||
|
_inherit = 'runbot_merge.batch'
|
||||||
|
|
||||||
|
def write(self, vals):
|
||||||
|
if vals.get('merge_date'):
|
||||||
|
self.env['forwardport.branch_remover'].create([
|
||||||
|
{'pr_id': p.id}
|
||||||
|
for b in self
|
||||||
|
if not b.merge_date
|
||||||
|
for p in b.prs
|
||||||
|
])
|
||||||
|
|
||||||
|
super().write(vals)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
# ordering is a bit unintuitive because the lowest sequence (and name)
|
# ordering is a bit unintuitive because the lowest sequence (and name)
|
||||||
# is the last link of the fp chain, reasoning is a bit more natural the
|
# is the last link of the fp chain, reasoning is a bit more natural the
|
||||||
|
@ -20,8 +20,7 @@ class Batch(models.Model):
|
|||||||
|
|
||||||
prs = fields.One2many('runbot_merge.pull_requests', 'batch_id')
|
prs = fields.One2many('runbot_merge.pull_requests', 'batch_id')
|
||||||
|
|
||||||
active = fields.Boolean(default=True)
|
merge_date = fields.Datetime(tracking=True)
|
||||||
|
|
||||||
skipchecks = fields.Boolean(
|
skipchecks = fields.Boolean(
|
||||||
string="Skips Checks",
|
string="Skips Checks",
|
||||||
default=False, tracking=True,
|
default=False, tracking=True,
|
||||||
|
@ -339,10 +339,8 @@ class FreezeWizard(models.Model):
|
|||||||
)
|
)
|
||||||
|
|
||||||
all_prs = self.release_pr_ids.pr_id | self.bump_pr_ids.pr_id
|
all_prs = self.release_pr_ids.pr_id | self.bump_pr_ids.pr_id
|
||||||
all_prs.write({
|
all_prs.batch_id.merge_date = fields.Datetime.now()
|
||||||
'merge_date': fields.Datetime.now(),
|
all_prs.reviewed_by = self.env.user.partner_id.id
|
||||||
'reviewed_by': self.env.user.partner_id.id,
|
|
||||||
})
|
|
||||||
self.env['runbot_merge.pull_requests.feedback'].create([{
|
self.env['runbot_merge.pull_requests.feedback'].create([{
|
||||||
'repository': pr.repository.id,
|
'repository': pr.repository.id,
|
||||||
'pull_request': pr.number,
|
'pull_request': pr.number,
|
||||||
|
@ -15,8 +15,7 @@ from typing import Optional, Union, List, Iterator, Tuple
|
|||||||
import sentry_sdk
|
import sentry_sdk
|
||||||
import werkzeug
|
import werkzeug
|
||||||
|
|
||||||
from odoo import api, fields, models, tools
|
from odoo import api, fields, models, tools, Command
|
||||||
from odoo.exceptions import ValidationError
|
|
||||||
from odoo.osv import expression
|
from odoo.osv import expression
|
||||||
from odoo.tools import html_escape
|
from odoo.tools import html_escape
|
||||||
from . import commands
|
from . import commands
|
||||||
@ -329,7 +328,12 @@ class PullRequests(models.Model):
|
|||||||
error = fields.Boolean(string="in error", default=False, tracking=True)
|
error = fields.Boolean(string="in error", default=False, tracking=True)
|
||||||
skipchecks = fields.Boolean(related='batch_id.skipchecks')
|
skipchecks = fields.Boolean(related='batch_id.skipchecks')
|
||||||
cancel_staging = fields.Boolean(related='batch_id.cancel_staging')
|
cancel_staging = fields.Boolean(related='batch_id.cancel_staging')
|
||||||
merge_date = fields.Datetime(tracking=True)
|
merge_date = fields.Datetime(
|
||||||
|
related='batch_id.merge_date',
|
||||||
|
inverse=lambda _: 1/0,
|
||||||
|
tracking=True,
|
||||||
|
store=True,
|
||||||
|
)
|
||||||
|
|
||||||
state = fields.Selection([
|
state = fields.Selection([
|
||||||
('opened', 'Opened'),
|
('opened', 'Opened'),
|
||||||
@ -939,10 +943,10 @@ class PullRequests(models.Model):
|
|||||||
pr.status = st
|
pr.status = st
|
||||||
|
|
||||||
# closed, merged, error should be exclusive, so this should probably be a selection
|
# closed, merged, error should be exclusive, so this should probably be a selection
|
||||||
@api.depends("status", "reviewed_by", 'merge_date', "closed", "error")
|
@api.depends("status", "reviewed_by", 'batch_id.merge_date', "closed", "error")
|
||||||
def _compute_state(self):
|
def _compute_state(self):
|
||||||
for pr in self:
|
for pr in self:
|
||||||
if pr.merge_date:
|
if pr.batch_id.merge_date:
|
||||||
pr.state = 'merged'
|
pr.state = 'merged'
|
||||||
elif pr.closed:
|
elif pr.closed:
|
||||||
pr.state = "closed"
|
pr.state = "closed"
|
||||||
@ -1032,7 +1036,7 @@ class PullRequests(models.Model):
|
|||||||
batch = Batches
|
batch = Batches
|
||||||
else:
|
else:
|
||||||
batch = Batches.search([
|
batch = Batches.search([
|
||||||
('active', '=', True),
|
('merge_date', '=', False),
|
||||||
('target', '=', target),
|
('target', '=', target),
|
||||||
('prs.label', '=', label),
|
('prs.label', '=', label),
|
||||||
])
|
])
|
||||||
@ -1735,7 +1739,6 @@ class Stagings(models.Model):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
_logger.info("Cancelling staging %s: " + reason, self, *args)
|
_logger.info("Cancelling staging %s: " + reason, self, *args)
|
||||||
self.mapped('batch_ids').write({'active': False})
|
|
||||||
self.write({
|
self.write({
|
||||||
'active': False,
|
'active': False,
|
||||||
'state': 'cancelled',
|
'state': 'cancelled',
|
||||||
@ -1756,7 +1759,6 @@ class Stagings(models.Model):
|
|||||||
format_args={'pr': pr, 'message': message},
|
format_args={'pr': pr, 'message': message},
|
||||||
)
|
)
|
||||||
|
|
||||||
self.batch_ids.write({'active': False})
|
|
||||||
self.write({
|
self.write({
|
||||||
'active': False,
|
'active': False,
|
||||||
'state': 'failure',
|
'state': 'failure',
|
||||||
@ -1772,15 +1774,14 @@ class Stagings(models.Model):
|
|||||||
# NB: batches remain attached to their original staging
|
# NB: batches remain attached to their original staging
|
||||||
sh = self.env['runbot_merge.split'].create({
|
sh = self.env['runbot_merge.split'].create({
|
||||||
'target': self.target.id,
|
'target': self.target.id,
|
||||||
'batch_ids': [(4, batch.id, 0) for batch in h],
|
'batch_ids': [Command.link(batch.id) for batch in h],
|
||||||
})
|
})
|
||||||
st = self.env['runbot_merge.split'].create({
|
st = self.env['runbot_merge.split'].create({
|
||||||
'target': self.target.id,
|
'target': self.target.id,
|
||||||
'batch_ids': [(4, batch.id, 0) for batch in t],
|
'batch_ids': [Command.link(batch.id) for batch in t],
|
||||||
})
|
})
|
||||||
_logger.info("Split %s to %s (%s) and %s (%s)",
|
_logger.info("Split %s to %s (%s) and %s (%s)",
|
||||||
self, h, sh, t, st)
|
self, h, sh, t, st)
|
||||||
self.batch_ids.write({'active': False})
|
|
||||||
self.write({
|
self.write({
|
||||||
'active': False,
|
'active': False,
|
||||||
'state': 'failure',
|
'state': 'failure',
|
||||||
@ -1871,7 +1872,7 @@ class Stagings(models.Model):
|
|||||||
"%s FF successful, marking %s as merged",
|
"%s FF successful, marking %s as merged",
|
||||||
self, prs
|
self, prs
|
||||||
)
|
)
|
||||||
prs.merge_date = fields.Datetime.now()
|
self.batch_ids.merge_date = fields.Datetime.now()
|
||||||
|
|
||||||
pseudobranch = None
|
pseudobranch = None
|
||||||
if self.target == project.branch_ids[:1]:
|
if self.target == project.branch_ids[:1]:
|
||||||
@ -1893,7 +1894,6 @@ class Stagings(models.Model):
|
|||||||
'tags_add': json.dumps([pseudobranch]),
|
'tags_add': json.dumps([pseudobranch]),
|
||||||
})
|
})
|
||||||
finally:
|
finally:
|
||||||
self.batch_ids.write({'active': False})
|
|
||||||
self.write({'active': False})
|
self.write({'active': False})
|
||||||
elif self.state == 'failure' or self.is_timed_out():
|
elif self.state == 'failure' or self.is_timed_out():
|
||||||
self.try_splitting()
|
self.try_splitting()
|
||||||
|
Loading…
Reference in New Issue
Block a user