diff --git a/forwardport/tests/conftest.py b/forwardport/tests/conftest.py
index c5951502..58f57184 100644
--- a/forwardport/tests/conftest.py
+++ b/forwardport/tests/conftest.py
@@ -7,7 +7,6 @@ import requests
@pytest.fixture
def default_crons():
return [
- 'runbot_merge.staging_cron',
'runbot_merge.check_linked_prs_status',
]
diff --git a/runbot_merge/data/merge_cron.xml b/runbot_merge/data/merge_cron.xml
index f6a4f3da..aa9de63e 100644
--- a/runbot_merge/data/merge_cron.xml
+++ b/runbot_merge/data/merge_cron.xml
@@ -15,8 +15,8 @@
code
model._create_stagings(True)
- 1
- minutes
+ 6
+ hours
-1
40
diff --git a/runbot_merge/models/batch.py b/runbot_merge/models/batch.py
index eace55b4..d920802f 100644
--- a/runbot_merge/models/batch.py
+++ b/runbot_merge/models/batch.py
@@ -223,13 +223,15 @@ class Batch(models.Model):
failed and f"{failed} have failed CI",
]))
else:
- if batch.blocked and batch.cancel_staging:
- if splits := batch.target.split_ids:
- splits.unlink()
- batch.target.active_staging_id.cancel(
- 'unstaged by %s becoming ready',
- ', '.join(batch.prs.mapped('display_name')),
- )
+ if batch.blocked:
+ self.env.ref("runbot_merge.staging_cron")._trigger()
+ if batch.cancel_staging:
+ if splits := batch.target.split_ids:
+ splits.unlink()
+ batch.target.active_staging_id.cancel(
+ 'unstaged by %s becoming ready',
+ ', '.join(batch.prs.mapped('display_name')),
+ )
batch.blocked = False
diff --git a/runbot_merge/models/pull_requests.py b/runbot_merge/models/pull_requests.py
index 0955c853..ea55d03b 100644
--- a/runbot_merge/models/pull_requests.py
+++ b/runbot_merge/models/pull_requests.py
@@ -2067,6 +2067,9 @@ class Stagings(models.Model):
self.env.ref("runbot_merge.merge_cron")\
._trigger(fields.Datetime.to_datetime(timeout))
+ if vals.get('active') is False:
+ self.env.ref("runbot_merge.staging_cron")._trigger()
+
return super().write(vals)
# only depend on staged_at as it should not get modified, but we might
diff --git a/runbot_merge/tests/conftest.py b/runbot_merge/tests/conftest.py
index e200434a..6143afe6 100644
--- a/runbot_merge/tests/conftest.py
+++ b/runbot_merge/tests/conftest.py
@@ -7,8 +7,6 @@ def module():
@pytest.fixture
def default_crons():
return [
- # env['runbot_merge.project']._create_stagings()
- 'runbot_merge.staging_cron',
# env['runbot_merge.pull_requests']._check_linked_prs_statuses()
'runbot_merge.check_linked_prs_status',
]
diff --git a/runbot_merge/tests/test_basic.py b/runbot_merge/tests/test_basic.py
index 9026aa02..a68d70f8 100644
--- a/runbot_merge/tests/test_basic.py
+++ b/runbot_merge/tests/test_basic.py
@@ -598,7 +598,7 @@ def test_staging_ci_timeout(env, repo, config, page, update_op: Callable[[int],
timeout = env['runbot_merge.project'].search([]).ci_timeout
pr_id.staging_id.write(update_op(timeout))
- env.run_crons('runbot_merge.staging_cron')
+ env.run_crons(None)
assert pr_id.state == 'error', "timeout should fail the PR"
dangerbox = pr_page(page, pr).cssselect('.alert-danger span')
@@ -1248,7 +1248,7 @@ class TestRetry:
with repo:
pr.post_comment('hansen retry', config['role_' + retrier]['token'])
assert pr_id.state == 'ready'
- env.run_crons('runbot_merge.staging_cron')
+ env.run_crons(None)
staging_head2 = repo.commit('heads/staging.master')
assert staging_head2 != staging_head
@@ -1281,7 +1281,7 @@ class TestRetry:
with repo:
pr.post_comment('hansen retry', config['role_reviewer']['token'])
- env.run_crons('runbot_merge.staging_cron')
+ env.run_crons(None)
with repo:
repo.post_status('staging.master', 'success', 'legal/cla')
@@ -1771,7 +1771,7 @@ commits, I need to know how to merge it:
c0 = repo.make_commit(m, 'C0', None, tree={'a': 'b'})
prx = repo.make_pr(title="gibberish", body="blahblah", target='master', head=c0)
- env.run_crons('runbot_merge.staging_cron')
+ env.run_crons(None)
with repo:
repo.post_status(prx.head, 'success', 'legal/cla')
@@ -1813,7 +1813,7 @@ commits, I need to know how to merge it:
c0 = repo.make_commit(m, 'C0', None, tree={'a': 'b'})
prx = repo.make_pr(title="gibberish", body=None, target='master', head=c0)
- env.run_crons('runbot_merge.staging_cron')
+ env.run_crons(None)
with repo:
repo.post_status(prx.head, 'success', 'legal/cla')
@@ -3089,7 +3089,7 @@ class TestBatching(object):
with repo:
repo.post_status('staging.master', 'success', 'ci/runbot')
repo.post_status('staging.master', 'success', 'legal/cla')
- env.run_crons('runbot_merge.staging_cron')
+ env.run_crons(None)
assert pr2.state == 'merged'
class TestReviewing:
diff --git a/runbot_merge/tests/test_multirepo.py b/runbot_merge/tests/test_multirepo.py
index 3c68bd9e..0efb7cfc 100644
--- a/runbot_merge/tests/test_multirepo.py
+++ b/runbot_merge/tests/test_multirepo.py
@@ -493,7 +493,7 @@ def test_ff_fail(env, project, repo_a, repo_b, config):
with repo_a, repo_b:
repo_a.post_status('heads/staging.master', 'success')
repo_b.post_status('heads/staging.master', 'success')
- env.run_crons('runbot_merge.staging_cron')
+ env.run_crons(None)
assert repo_b.commit('heads/master').id == cn,\
"B should still be at the conflicting commit"
assert repo_a.commit('heads/master').id == root_a,\
diff --git a/runbot_merge/tests/test_project_toggles.py b/runbot_merge/tests/test_project_toggles.py
index 0dffdccc..db838df6 100644
--- a/runbot_merge/tests/test_project_toggles.py
+++ b/runbot_merge/tests/test_project_toggles.py
@@ -111,15 +111,17 @@ def test_staging_priority(env, project, repo, config, mode, cutoff, second):
# specifically delay creation of new staging to observe the failed
# staging's state and the splits
model, cron_id = env['ir.model.data'].check_object_reference('runbot_merge', 'staging_cron')
- env[model].browse([cron_id]).write({
- 'nextcall': (datetime.datetime.utcnow() + datetime.timedelta(minutes=10)).isoformat(" ", "seconds")
- })
+ staging_cron = env[model].browse([cron_id])
+ staging_cron.active = False
+
env.run_crons(None)
assert not staging.active
assert not env['runbot_merge.stagings'].search([]).active
assert env['runbot_merge.split'].search_count([]) == 2
- env.run_crons()
+ staging_cron.active = True
+ # manually trigger that cron, as having the cron disabled prevented the creation of the triggers entirely
+ env.run_crons('runbot_merge.staging_cron')
# check that st.pr_ids are the PRs we expect
st = env['runbot_merge.stagings'].search([])