diff --git a/runbot_merge/models/pull_requests.py b/runbot_merge/models/pull_requests.py index b03ef637..a6e62e02 100644 --- a/runbot_merge/models/pull_requests.py +++ b/runbot_merge/models/pull_requests.py @@ -1843,6 +1843,15 @@ class Stagings(models.Model): self, prs ) prs.write({'state': 'merged'}) + pseudobranch = None + if self.target == project.branch_ids[:1] and project.branch_ids[1:2]: + prev = project.branch_ids[1:2].name + m = re.search(r'(\d+)(?:\.(\d+))?$', prev) + if m: + pseudobranch = "%s.%d" % (m[1], (int(m[2] or 0) + 1)) + else: + pseudobranch = 'post-' + prev + for pr in prs: self.env['runbot_merge.pull_requests.feedback'].create({ 'repository': pr.repository.id, @@ -1852,6 +1861,12 @@ class Stagings(models.Model): }), 'close': True, }) + if pseudobranch: + self.env['runbot_merge.pull_requests.tagging'].create({ + 'repository': pr.repository.id, + 'pull_request': pr.number, + 'tags_add': json.dumps([pseudobranch]), + }) finally: self.batch_ids.write({'active': False}) self.write({'active': False}) diff --git a/runbot_merge/tests/test_by_branch.py b/runbot_merge/tests/test_by_branch.py index 768ab293..ae635db3 100644 --- a/runbot_merge/tests/test_by_branch.py +++ b/runbot_merge/tests/test_by_branch.py @@ -111,3 +111,68 @@ def test_status_skipped(env, project, repo, config): repo.post_status('staging.maintenance', 'success', 'ci') env.run_crons('runbot_merge.process_updated_commits') assert st.state == 'success' + +def test_pseudo_version_tag(env, project, make_repo, setreviewers, config): + """ Because the last branch in the sequence is "live", if a PR's merged in + it it's hard to know where it landed in terms of other branches. + + Therefore if a PR is merged in one such branch, tag it using the previous + branch of the sequence: + + * if that ends with a number, increment the number by 1 + * otherwise add 'post-' prefix (I guess) + """ + repo = make_repo('repo') + project.branch_ids.sequence = 1 + project.write({ + 'repo_ids': [(0, 0, {'name': repo.name, 'required_statuses': 'ci'})], + 'branch_ids': [ + (0, 0, {'name': '2.0', 'sequence': 11}), + (0, 0, {'name': '1.0', 'sequence': 21}) + ], + }) + setreviewers(*project.repo_ids) + + with repo: + [m] = repo.make_commits(None, Commit('c1', tree={'a': '1'}), ref='heads/master') + repo.make_ref('heads/1.0', m) + repo.make_ref('heads/2.0', m) + repo.make_ref('heads/bonk', m) + + with repo: + repo.make_commits(m, Commit('pr1', tree={'b': '1'}), ref='heads/change') + pr = repo.make_pr(target='master', head='change') + repo.post_status(pr.ref, 'success', 'ci') + pr.post_comment('hansen r+', config['role_reviewer']['token']) + env.run_crons() # should create staging + pr_id = env['runbot_merge.pull_requests'].search([ + ('repository.name', '=', repo.name), + ('number', '=', pr.number) + ]) + assert pr_id.state == 'ready' + assert pr_id.staging_id + with repo: + repo.post_status('staging.master', 'success', 'ci') + env.run_crons() # should merge staging + assert pr_id.state == 'merged' + assert pr.labels >= {'2.1'} + + # now the second branch is non-numeric, therefore the label should just be prefixed by "post-" + project.write({'branch_ids': [(0, 0, {'name': 'bonk', 'sequence': 6})]}) + with repo: + repo.make_commits(m, Commit('pr2', tree={'c': '1'}), ref='heads/change2') + pr = repo.make_pr(target='master', head='change2') + repo.post_status(pr.ref, 'success', 'ci') + pr.post_comment('hansen r+', config['role_reviewer']['token']) + env.run_crons() # should create staging + pr_id = env['runbot_merge.pull_requests'].search([ + ('repository.name', '=', repo.name), + ('number', '=', pr.number) + ]) + assert pr_id.state == 'ready', pr.comments + assert pr_id.staging_id + with repo: + repo.post_status('staging.master', 'success', 'ci') + env.run_crons() # should merge staging + assert pr_id.state == 'merged' + assert pr.labels >= {'post-bonk'}