diff --git a/marge/merge_request.py b/marge/merge_request.py index 030b79b8..0dee208b 100644 --- a/marge/merge_request.py +++ b/marge/merge_request.py @@ -164,7 +164,10 @@ def update_sha(self, sha): self._info['sha'] = sha def refetch_info(self): - self._info = self._api.call(GET('/projects/{0.project_id}/merge_requests/{0.iid}'.format(self))) + self._info = self._api.call(GET( + '/projects/{0.project_id}/merge_requests/{0.iid}'.format(self), + {'include_rebase_in_progress': 'true'} + )) def comment(self, message): if self._api.version().release >= (9, 2, 2): diff --git a/marge/single_merge_job.py b/marge/single_merge_job.py index 1f8155ba..c45e2755 100644 --- a/marge/single_merge_job.py +++ b/marge/single_merge_job.py @@ -45,6 +45,7 @@ def update_merge_request_and_accept(self, approvals): api = self._api merge_request = self._merge_request updated_into_up_to_date_target_branch = False + first_iteration = True while not updated_into_up_to_date_target_branch: self.ensure_mergeable_mr(merge_request) @@ -58,8 +59,15 @@ def update_merge_request_and_accept(self, approvals): source_repo_url=source_repo_url, ) except GitLabRebaseResultMismatch: - log.info("Gitlab rebase didn't give expected result") - merge_request.comment("Someone skipped the queue! Will have to try again...") + if first_iteration: + log.info( + "Gitlab rebase didn't give expected result." + "This is expected immediately after rebase. Retrying." + ) + first_iteration = False + else: + log.info("Gitlab rebase didn't give expected result") + merge_request.comment("Someone skipped the queue! Will have to try again...") continue if _updated_sha == actual_sha and self._options.guarantee_final_pipeline: diff --git a/tests/gitlab_api_mock.py b/tests/gitlab_api_mock.py index 012fb647..8a57af49 100644 --- a/tests/gitlab_api_mock.py +++ b/tests/gitlab_api_mock.py @@ -175,6 +175,14 @@ def add_project(self, info, sudo=None, from_state=None, to_state=None): def add_merge_request(self, info, sudo=None, from_state=None, to_state=None): self.add_resource('/projects/{0.project_id}/merge_requests/{0.iid}', info, sudo, from_state, to_state) + self.add_transition( + GET( + '/projects/{0.project_id}/merge_requests/{0.iid}'.format(attrs(info)), + args={'include_rebase_in_progress': 'true'}, + ), + Ok(info), + sudo, from_state, to_state, + ) def add_commit(self, project_id, info, sudo=None, from_state=None, to_state=None): path = '/projects/%s/repository/commits/{0.id}' % project_id diff --git a/tests/test_merge_request.py b/tests/test_merge_request.py index 7259ea72..2295eb47 100644 --- a/tests/test_merge_request.py +++ b/tests/test_merge_request.py @@ -50,7 +50,12 @@ def test_fetch_by_iid(self): merge_request = MergeRequest.fetch_by_iid(project_id=1234, merge_request_iid=54, api=api) - api.call.assert_called_once_with(GET('/projects/1234/merge_requests/54')) + api.call.assert_called_once_with( + GET( + '/projects/1234/merge_requests/54', + {'include_rebase_in_progress': 'true'} + ) + ) assert merge_request.info == INFO def test_refetch_info(self): @@ -58,7 +63,12 @@ def test_refetch_info(self): self.api.call = Mock(return_value=new_info) self.merge_request.refetch_info() - self.api.call.assert_called_once_with(GET('/projects/1234/merge_requests/54')) + self.api.call.assert_called_once_with( + GET( + '/projects/1234/merge_requests/54', + {'include_rebase_in_progress': 'true'} + ) + ) assert self.merge_request.info == new_info def test_properties(self): @@ -99,7 +109,10 @@ def test_unassign(self): def test_rebase_was_not_in_progress_no_error(self): expected = [ ( - GET('/projects/1234/merge_requests/54'), # refetch_info -> not in progress + GET( + '/projects/1234/merge_requests/54', + {'include_rebase_in_progress': 'true'} + ), # refetch_info -> not in progress INFO ), ( @@ -107,11 +120,18 @@ def test_rebase_was_not_in_progress_no_error(self): True ), ( - GET('/projects/1234/merge_requests/54'), # refetch_info -> in progress + GET( + '/projects/1234/merge_requests/54', + {'include_rebase_in_progress': 'true'} + ), # refetch_info -> in progress dict(INFO, rebase_in_progress=True) ), ( - GET('/projects/1234/merge_requests/54'), # refetch_info -> succeeded + # GET('/projects/1234/merge_requests/54'), # refetch_info -> succeeded + GET( + '/projects/1234/merge_requests/54', + {'include_rebase_in_progress': 'true'} + ), # refetch_info -> succeeded dict(INFO, rebase_in_progress=False) ), ] @@ -123,7 +143,10 @@ def test_rebase_was_not_in_progress_no_error(self): def test_rebase_was_not_in_progress_error(self): expected = [ ( - GET('/projects/1234/merge_requests/54'), # refetch_info -> not in progress + GET( + '/projects/1234/merge_requests/54', + {'include_rebase_in_progress': 'true'} + ), # refetch_info -> not in progress INFO ), ( @@ -131,7 +154,10 @@ def test_rebase_was_not_in_progress_error(self): True ), ( - GET('/projects/1234/merge_requests/54'), # refetch_info -> BOOM + GET( + '/projects/1234/merge_requests/54', + {'include_rebase_in_progress': 'true'} + ), # refetch_info -> BOOM dict(INFO, rebase_in_progress=False, merge_error="Rebase failed. Please rebase locally") ), ] @@ -145,15 +171,24 @@ def test_rebase_was_not_in_progress_error(self): def test_rebase_was_in_progress_no_error(self): expected = [ ( - GET('/projects/1234/merge_requests/54'), # refetch_info -> in progress + GET( + '/projects/1234/merge_requests/54', + {'include_rebase_in_progress': 'true'} + ), # refetch_info -> in progress dict(INFO, rebase_in_progress=True) ), ( - GET('/projects/1234/merge_requests/54'), # refetch_info -> in progress + GET( + '/projects/1234/merge_requests/54', + {'include_rebase_in_progress': 'true'} + ), # refetch_info -> in progress dict(INFO, rebase_in_progress=True) ), ( - GET('/projects/1234/merge_requests/54'), # refetch_info -> succeeded + GET( + '/projects/1234/merge_requests/54', + {'include_rebase_in_progress': 'true'} + ), # refetch_info -> succeeded dict(INFO, rebase_in_progress=False) ), ] @@ -232,5 +267,10 @@ def _load(self, json): old_mock = self.api.call self.api.call = Mock(return_value=json) self.merge_request.refetch_info() - self.api.call.assert_called_with(GET('/projects/1234/merge_requests/54')) + self.api.call.assert_called_with( + GET( + '/projects/1234/merge_requests/54', + {'include_rebase_in_progress': 'true'} + ) + ) self.api.call = old_mock