mirror of
https://github.com/odoo/runbot.git
synced 2025-03-16 16:05:42 +07:00

Before this change, a CI override would have to be replicated on most / all forward-ports of the base PR. This was intentional to see how it would shake out, the answer being that it's rather annoying. Also add a `statuses_full` computed field on PRs for the aggregate status: the existing `statuses` field is just a copy of the commit statuses which I didn't remember I kept free of the overrides so the commit statuses could be displayed "as-is" in the backend (the overrides are displayed separately). And while at it fix the PR dashboard to use that new field: that was basically the intention but then I went on to use the "wrong" field hence #433. Mebbe the UI part should be displayed using a computed M2M (?) as a table or as tags instead? This m2m could indicate whether the status is an override or an "intrinsic" status. Also removed some dead code: * leftover from the removed tagging feature (removed the tag manipulation but forgot some of the setup / computations) * unused local variables * an empty skipped test case Fixes #439. Fixes #433.
117 lines
4.3 KiB
Python
117 lines
4.3 KiB
Python
import json
|
|
|
|
from utils import Commit, make_basic
|
|
|
|
def statuses(pr):
|
|
return {
|
|
k: v['state']
|
|
for k, v in json.loads(pr.statuses_full).items()
|
|
}
|
|
def test_override_inherited(env, config, make_repo, users):
|
|
""" A forwardport should inherit its parents' overrides, until it's edited.
|
|
"""
|
|
repo, other = make_basic(env, config, make_repo)
|
|
project = env['runbot_merge.project'].search([])
|
|
env['res.partner'].search([('github_login', '=', users['reviewer'])])\
|
|
.write({'override_rights': [(0, 0, {
|
|
'repository_id': project.repo_ids.id,
|
|
'context': 'ci/runbot',
|
|
})]})
|
|
|
|
with repo:
|
|
repo.make_commits('a', Commit('C', tree={'a': '0'}), ref='heads/change')
|
|
pr = repo.make_pr(target='a', head='change')
|
|
repo.post_status('change', 'success', 'legal/cla')
|
|
pr.post_comment('hansen r+ override=ci/runbot', config['role_reviewer']['token'])
|
|
env.run_crons()
|
|
|
|
original = env['runbot_merge.pull_requests'].search([('repository.name', '=', repo.name), ('number', '=', pr.number)])
|
|
assert original.state == 'ready'
|
|
|
|
with repo:
|
|
repo.post_status('staging.a', 'success', 'legal/cla')
|
|
repo.post_status('staging.a', 'success', 'ci/runbot')
|
|
env.run_crons()
|
|
|
|
pr0_id, pr1_id = env['runbot_merge.pull_requests'].search([], order='number')
|
|
assert pr0_id == original
|
|
assert pr1_id.parent_id, pr0_id
|
|
|
|
with repo:
|
|
repo.post_status(pr1_id.head, 'success', 'legal/cla')
|
|
env.run_crons()
|
|
assert pr1_id.state == 'validated'
|
|
assert statuses(pr1_id) == {'ci/runbot': 'success', 'legal/cla': 'success'}
|
|
|
|
# now we edit the child PR
|
|
pr_repo, pr_ref = repo.get_pr(pr1_id.number).branch
|
|
with pr_repo:
|
|
pr_repo.make_commits(
|
|
pr1_id.target.name,
|
|
Commit('wop wop', tree={'a': '1'}),
|
|
ref=f'heads/{pr_ref}',
|
|
make=False
|
|
)
|
|
env.run_crons()
|
|
assert pr1_id.state == 'opened'
|
|
assert not pr1_id.parent_id
|
|
assert statuses(pr1_id) == {}, "should not have any status left"
|
|
|
|
def test_override_combination(env, config, make_repo, users):
|
|
""" A forwardport should inherit its parents' overrides, until it's edited.
|
|
"""
|
|
repo, other = make_basic(env, config, make_repo)
|
|
project = env['runbot_merge.project'].search([])
|
|
env['res.partner'].search([('github_login', '=', users['reviewer'])]) \
|
|
.write({'override_rights': [
|
|
(0, 0, {
|
|
'repository_id': project.repo_ids.id,
|
|
'context': 'ci/runbot',
|
|
}),
|
|
(0, 0, {
|
|
'repository_id': project.repo_ids.id,
|
|
'context': 'legal/cla',
|
|
})
|
|
]})
|
|
|
|
with repo:
|
|
repo.make_commits('a', Commit('C', tree={'a': '0'}), ref='heads/change')
|
|
pr = repo.make_pr(target='a', head='change')
|
|
repo.post_status('change', 'success', 'legal/cla')
|
|
pr.post_comment('hansen r+ override=ci/runbot', config['role_reviewer']['token'])
|
|
env.run_crons()
|
|
|
|
pr0_id = env['runbot_merge.pull_requests'].search([('repository.name', '=', repo.name), ('number', '=', pr.number)])
|
|
assert pr0_id.state == 'ready'
|
|
assert statuses(pr0_id) == {'ci/runbot': 'success', 'legal/cla': 'success'}
|
|
|
|
with repo:
|
|
repo.post_status('staging.a', 'success', 'legal/cla')
|
|
repo.post_status('staging.a', 'success', 'ci/runbot')
|
|
env.run_crons()
|
|
|
|
# check for combination: ci/runbot is overridden through parent, if we
|
|
# override legal/cla then the PR should be validated
|
|
pr1_id = env['runbot_merge.pull_requests'].search([('parent_id', '=', pr0_id.id)])
|
|
assert pr1_id.state == 'opened'
|
|
assert statuses(pr1_id) == {'ci/runbot': 'success'}
|
|
with repo:
|
|
repo.get_pr(pr1_id.number).post_comment('hansen override=legal/cla', config['role_reviewer']['token'])
|
|
env.run_crons()
|
|
assert pr1_id.state == 'validated'
|
|
|
|
# editing the child should devalidate
|
|
pr_repo, pr_ref = repo.get_pr(pr1_id.number).branch
|
|
with pr_repo:
|
|
pr_repo.make_commits(
|
|
pr1_id.target.name,
|
|
Commit('wop wop', tree={'a': '1'}),
|
|
ref=f'heads/{pr_ref}',
|
|
make=False
|
|
)
|
|
env.run_crons()
|
|
assert pr1_id.state == 'opened'
|
|
assert not pr1_id.parent_id
|
|
assert statuses(pr1_id) == {'legal/cla': 'success'}, \
|
|
"should only have its own status left"
|