Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion marge/merge_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
12 changes: 10 additions & 2 deletions marge/single_merge_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -58,8 +59,15 @@ def update_merge_request_and_accept(self, approvals):
source_repo_url=source_repo_url,
)
except GitLabRebaseResultMismatch as err:
log.info("Gitlab rebase didn't give expected result: %r", err.reason)
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: %r", err.reason)
merge_request.comment("Someone skipped the queue! Will have to try again...")
continue

if _updated_sha == actual_sha and self._options.guarantee_final_pipeline:
Expand Down
8 changes: 8 additions & 0 deletions tests/gitlab_api_mock.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
62 changes: 51 additions & 11 deletions tests/test_merge_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,25 @@ 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):
new_info = dict(INFO, state='closed')
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):
Expand Down Expand Up @@ -99,19 +109,29 @@ 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
),
(
PUT('/projects/1234/merge_requests/54/rebase'),
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)
),
]
Expand All @@ -123,15 +143,21 @@ 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
),
(
PUT('/projects/1234/merge_requests/54/rebase'),
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")
),
]
Expand All @@ -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)
),
]
Expand Down Expand Up @@ -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