[ADD] runbot_merge: update squash flags when PR commits are updated

If the PR's commits count changes, the squash state should be updated
to match/reflect.
This commit is contained in:
Xavier Morel 2018-06-01 12:33:31 +02:00 committed by xmo-odoo
parent df2d19302b
commit 5e64f79730
3 changed files with 42 additions and 3 deletions

View File

@ -142,8 +142,8 @@ def handle_pr(event):
pr_obj.staging_id,
)
# TODO: should we update squash as well? What of explicit squash commands?
pr_obj.head = pr['head']['sha']
pr_obj.squash = pr['commits'] == 1
return 'Updated {} to {}'.format(pr_obj.id, pr_obj.head)
# don't marked merged PRs as closed (!!!)

View File

@ -833,8 +833,6 @@ class Batch(models.Model):
msg = pr.message
author=None
if pr.squash:
# FIXME: maybe should be message of the *first* commit of the branch?
# TODO: or depend on # of commits in PR instead of squash flag?
commit = gh.commit(pr.head)
msg = commit['message']
author = commit['author']

View File

@ -536,6 +536,47 @@ class TestSquashing(object):
]).state == 'merged'
assert prx.state == 'closed'
def test_pr_update_unsquash(self, repo, env):
"""
If a PR starts with 1 commit and a second commit is added, the PR
should be unflagged as squash
"""
m = repo.make_commit(None, 'initial', None, tree={'m': 'm'})
m2 = repo.make_commit(m, 'second', None, tree={'m': 'm', 'm2': 'm2'})
repo.make_ref('heads/master', m2)
c1 = repo.make_commit(m, 'first', None, tree={'m': 'c1'})
prx = repo.make_pr('title', 'body', target='master', ctid=c1, user='user')
pr = env['runbot_merge.pull_requests'].search([
('repository.name', '=', 'odoo/odoo'),
('number', '=', prx.number),
])
assert pr.squash, "a PR with a single commit should be squashed"
prx.push(repo.make_commit(c1, 'second2', None, tree={'m': 'c2'}))
assert not pr.squash, "a PR with a single commit should not be squashed"
def test_pr_reset_squash(self, repo, env):
"""
If a PR starts at >1 commits and is reset back to 1, the PR should be
re-flagged as squash
"""
m = repo.make_commit(None, 'initial', None, tree={'m': 'm'})
m2 = repo.make_commit(m, 'second', None, tree={'m': 'm', 'm2': 'm2'})
repo.make_ref('heads/master', m2)
c1 = repo.make_commit(m, 'first', None, tree={'m': 'c1'})
c2 = repo.make_commit(c1, 'second2', None, tree={'m': 'c2'})
prx = repo.make_pr('title', 'body', target='master', ctid=c2, user='user')
pr = env['runbot_merge.pull_requests'].search([
('repository.name', '=', 'odoo/odoo'),
('number', '=', prx.number),
])
assert not pr.squash, "a PR with a single commit should not be squashed"
prx.push(repo.make_commit(m, 'fixup', None, tree={'m': 'c2'}))
assert pr.squash, "a PR with a single commit should be squashed"
@pytest.mark.xfail(reason="removed support for squash+ command")
def test_force_squash_merge(self, repo, env):
m = repo.make_commit(None, 'initial', None, tree={'m': 'm'})