mirror of
https://github.com/odoo/runbot.git
synced 2025-03-27 13:25:47 +07:00
[ADD] runbot_merge: staging query endpoints
`/runbot_merge/stagings` ======================== This endpoint is a reverse lookup from any number of commits to a (number of) staging(s): - it takes a list of commit hashes as either the `commits` or the `heads` keyword parameter - it then returns the stagings which have *all* these commits as respectively commits or heads, if providing all commits for a project the result should always be unique (if any) - `commits` are the merged commits, aka the stuff which ends up in the actual branches - `heads` are the staging heads, aka the commits at the tip of the `staging.$name` branches, those may be the same as the corresponding commit, or might be deduplicator commits which get discarded on success `/runbot_merge/stagings/:id` ============================ Returns a list of all PRs in the staging, grouped by batch (aka PRs which have the same label and must be merged together). For each PR, the `repository` name, `number`, and `name` in the form `$repository#$number` get returned. `/runbot_merge/stagings/:id1/:id2` ================================== Returns a list of all the *successfully merged* stagings between `id1` and `id2`, from oldest to most recent. Individual records have the form: - `staging` is the id of the staging - `prs` is the contents of the previous endpoint (a list of PRs grouped by batch) `id1` *must* be lower than `id2`. By default, this endpoint is inclusive on both ends, the `include_from` and / or `include_to` parameters can be passed with the `False` value to exclude the corresponding bound from the result. Related to #768
This commit is contained in:
parent
4eefc980bb
commit
85a74a9e32
@ -15,6 +15,63 @@ from .. import utils, github
|
|||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class MergebotController(Controller):
|
class MergebotController(Controller):
|
||||||
|
@route('/runbot_merge/stagings', auth='none', type='json')
|
||||||
|
def stagings_for_commits(self, commits=None, heads=None):
|
||||||
|
Stagings = request.env(user=1)['runbot_merge.stagings'].sudo()
|
||||||
|
if commits:
|
||||||
|
stagings = Stagings.for_commits(*commits)
|
||||||
|
elif heads:
|
||||||
|
stagings = Stagings.for_heads(*heads)
|
||||||
|
else:
|
||||||
|
raise ValueError('Must receive one of "commits" or "heads" kwarg')
|
||||||
|
|
||||||
|
return stagings.ids
|
||||||
|
|
||||||
|
@route('/runbot_merge/stagings/<int:staging>', auth='none', type='json')
|
||||||
|
def prs_for_staging(self, staging):
|
||||||
|
staging = request.env(user=1)['runbot_merge.stagings'].browse(staging)
|
||||||
|
return [
|
||||||
|
batch.prs.mapped(lambda p: {
|
||||||
|
'name': p.display_name,
|
||||||
|
'repository': p.repository.name,
|
||||||
|
'number': p.number,
|
||||||
|
})
|
||||||
|
for batch in staging.sudo().batch_ids
|
||||||
|
]
|
||||||
|
|
||||||
|
@route('/runbot_merge/stagings/<int:from_staging>/<int:to_staging>', auth='none', type='json')
|
||||||
|
def prs_for_staging(self, from_staging, to_staging, include_from=True, include_to=True):
|
||||||
|
Stagings = request.env(user=1, context={"active_test": False})['runbot_merge.stagings']
|
||||||
|
from_staging = Stagings.browse(from_staging)
|
||||||
|
to_staging = Stagings.browse(to_staging)
|
||||||
|
if from_staging.target != to_staging.target:
|
||||||
|
raise ValueError(f"Stagings must have the same target branch, found {from_staging.target.name} and {to_staging.target.name}")
|
||||||
|
if from_staging.id >= to_staging.id:
|
||||||
|
raise ValueError("first staging must be older than second staging")
|
||||||
|
|
||||||
|
stagings = Stagings.search([
|
||||||
|
('target', '=', to_staging.target.id),
|
||||||
|
('state', '=', 'success'),
|
||||||
|
('id', '>=' if include_from else '>', from_staging.id),
|
||||||
|
('id', '<=' if include_to else '<', to_staging.id),
|
||||||
|
], order="id asc")
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
'staging': staging.id,
|
||||||
|
'prs': [
|
||||||
|
batch.prs.mapped(lambda p: {
|
||||||
|
'name': p.display_name,
|
||||||
|
'repository': p.repository.name,
|
||||||
|
'number': p.number,
|
||||||
|
})
|
||||||
|
for batch in staging.batch_ids
|
||||||
|
]
|
||||||
|
}
|
||||||
|
for staging in stagings
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@route('/runbot_merge/hooks', auth='none', type='json', csrf=False, methods=['POST'])
|
@route('/runbot_merge/hooks', auth='none', type='json', csrf=False, methods=['POST'])
|
||||||
def index(self):
|
def index(self):
|
||||||
req = request.httprequest
|
req = request.httprequest
|
||||||
|
Loading…
Reference in New Issue
Block a user