Show More
@@ -534,6 +534,8 b' get_repo_settings' | |||
|
534 | 534 | "phases_publish": "True", |
|
535 | 535 | "rhodecode_hg_use_rebase_for_merging": true, |
|
536 | 536 | "rhodecode_hg_close_branch_before_merging": false, |
|
537 | "rhodecode_git_use_rebase_for_merging": true, | |
|
538 | "rhodecode_git_close_branch_before_merging": false, | |
|
537 | 539 | "rhodecode_pr_merge_enabled": true, |
|
538 | 540 | "rhodecode_use_outdated_comments": true |
|
539 | 541 | } |
@@ -558,6 +558,7 b' class MercurialRepository(BaseRepository' | |||
|
558 | 558 | """ |
|
559 | 559 | Update the working copty to the specified revision. |
|
560 | 560 | """ |
|
561 | log.debug('Doing checkout to commit: `%s` for %s', revision, self) | |
|
561 | 562 | self._remote.update(revision, clean=clean) |
|
562 | 563 | |
|
563 | 564 | def _identify(self): |
@@ -654,8 +655,8 b' class MercurialRepository(BaseRepository' | |||
|
654 | 655 | Returns the commit id of the close and a boolean indicating if the |
|
655 | 656 | commit needs to be pushed. |
|
656 | 657 | """ |
|
657 |
self._update( |
|
|
658 | message = close_message or "Closing branch" | |
|
658 | self._update(source_ref.commit_id) | |
|
659 | message = close_message or "Closing branch: `{}`".format(source_ref.name) | |
|
659 | 660 | try: |
|
660 | 661 | self._remote.commit( |
|
661 | 662 | message=safe_str(message), |
@@ -732,16 +733,26 b' class MercurialRepository(BaseRepository' | |||
|
732 | 733 | False, False, None, MergeFailureReason.MISSING_SOURCE_REF) |
|
733 | 734 | |
|
734 | 735 | merge_ref = None |
|
736 | merge_commit_id = None | |
|
737 | close_commit_id = None | |
|
735 | 738 | merge_failure_reason = MergeFailureReason.NONE |
|
736 | 739 | |
|
737 | if close_branch and not use_rebase: | |
|
740 | # enforce that close branch should be used only in case we source from | |
|
741 | # an actual Branch | |
|
742 | close_branch = close_branch and source_ref.type == 'branch' | |
|
743 | ||
|
744 | # don't allow to close branch if source and target are the same | |
|
745 | close_branch = close_branch and source_ref.name != target_ref.name | |
|
746 | ||
|
747 | needs_push_on_close = False | |
|
748 | if close_branch and not use_rebase and not dry_run: | |
|
738 | 749 | try: |
|
739 | close_commit_id, needs_push = shadow_repo._local_close( | |
|
750 | close_commit_id, needs_push_on_close = shadow_repo._local_close( | |
|
740 | 751 | target_ref, merger_name, merger_email, source_ref) |
|
741 | target_ref.commit_id = close_commit_id | |
|
742 | 752 | merge_possible = True |
|
743 | 753 | except RepositoryError: |
|
744 | log.exception('Failure when doing close branch on hg shadow repo') | |
|
754 | log.exception( | |
|
755 | 'Failure when doing close branch on hg shadow repo') | |
|
745 | 756 | merge_possible = False |
|
746 | 757 | merge_failure_reason = MergeFailureReason.MERGE_FAILED |
|
747 | 758 | else: |
@@ -754,9 +765,13 b' class MercurialRepository(BaseRepository' | |||
|
754 | 765 | source_ref, use_rebase=use_rebase) |
|
755 | 766 | merge_possible = True |
|
756 | 767 | |
|
757 | # Set a bookmark pointing to the merge commit. This bookmark may be | |
|
758 | # used to easily identify the last successful merge commit in the | |
|
759 | # shadow repository. | |
|
768 | # read the state of the close action, if it | |
|
769 | # maybe required a push | |
|
770 | needs_push = needs_push or needs_push_on_close | |
|
771 | ||
|
772 | # Set a bookmark pointing to the merge commit. This bookmark | |
|
773 | # may be used to easily identify the last successful merge | |
|
774 | # commit in the shadow repository. | |
|
760 | 775 | shadow_repo.bookmark('pr-merge', revision=merge_commit_id) |
|
761 | 776 | merge_ref = Reference('book', 'pr-merge', merge_commit_id) |
|
762 | 777 | except SubrepoMergeError: |
@@ -776,7 +791,6 b' class MercurialRepository(BaseRepository' | |||
|
776 | 791 | if target_ref.type == 'book': |
|
777 | 792 | shadow_repo.bookmark( |
|
778 | 793 | target_ref.name, revision=merge_commit_id) |
|
779 | ||
|
780 | 794 | try: |
|
781 | 795 | shadow_repo_with_hooks = self._get_shadow_instance( |
|
782 | 796 | shadow_repository_path, |
@@ -788,6 +802,12 b' class MercurialRepository(BaseRepository' | |||
|
788 | 802 | shadow_repo_with_hooks._local_push( |
|
789 | 803 | merge_commit_id, self.path, push_branches=True, |
|
790 | 804 | enable_hooks=True) |
|
805 | ||
|
806 | # maybe we also need to push the close_commit_id | |
|
807 | if close_commit_id: | |
|
808 | shadow_repo_with_hooks._local_push( | |
|
809 | close_commit_id, self.path, push_branches=True, | |
|
810 | enable_hooks=True) | |
|
791 | 811 | merge_succeeded = True |
|
792 | 812 | except RepositoryError: |
|
793 | 813 | log.exception( |
@@ -394,6 +394,8 b' class _BaseVcsSettingsForm(formencode.Sc' | |||
|
394 | 394 | |
|
395 | 395 | # git |
|
396 | 396 | vcs_git_lfs_enabled = v.StringBoolean(if_missing=False) |
|
397 | rhodecode_git_use_rebase_for_merging = v.StringBoolean(if_missing=False) | |
|
398 | rhodecode_git_close_branch_before_merging = v.StringBoolean(if_missing=False) | |
|
397 | 399 | |
|
398 | 400 | # svn |
|
399 | 401 | vcs_svn_proxy_http_requests_enabled = v.StringBoolean(if_missing=False) |
@@ -1424,12 +1424,26 b' class PullRequestModel(BaseModel):' | |||
|
1424 | 1424 | pull_request, 'rhodecode_pr_merge_enabled') |
|
1425 | 1425 | |
|
1426 | 1426 | def _use_rebase_for_merging(self, pull_request): |
|
1427 | repo_type = pull_request.target_repo.repo_type | |
|
1428 | if repo_type == 'hg': | |
|
1427 | 1429 | return self._get_general_setting( |
|
1428 | 1430 | pull_request, 'rhodecode_hg_use_rebase_for_merging') |
|
1431 | elif repo_type == 'git': | |
|
1432 | return self._get_general_setting( | |
|
1433 | pull_request, 'rhodecode_git_use_rebase_for_merging') | |
|
1434 | ||
|
1435 | return False | |
|
1429 | 1436 | |
|
1430 | 1437 | def _close_branch_before_merging(self, pull_request): |
|
1438 | repo_type = pull_request.target_repo.repo_type | |
|
1439 | if repo_type == 'hg': | |
|
1431 | 1440 | return self._get_general_setting( |
|
1432 | 1441 | pull_request, 'rhodecode_hg_close_branch_before_merging') |
|
1442 | elif repo_type == 'git': | |
|
1443 | return self._get_general_setting( | |
|
1444 | pull_request, 'rhodecode_git_close_branch_before_merging') | |
|
1445 | ||
|
1446 | return False | |
|
1433 | 1447 | |
|
1434 | 1448 | def _get_general_setting(self, pull_request, settings_key, default=False): |
|
1435 | 1449 | settings_model = VcsSettingsModel(repo=pull_request.target_repo) |
@@ -409,7 +409,9 b' class VcsSettingsModel(object):' | |||
|
409 | 409 | 'use_outdated_comments', |
|
410 | 410 | 'pr_merge_enabled', |
|
411 | 411 | 'hg_use_rebase_for_merging', |
|
412 |
'hg_close_branch_before_merging' |
|
|
412 | 'hg_close_branch_before_merging', | |
|
413 | 'git_use_rebase_for_merging', | |
|
414 | 'git_close_branch_before_merging') | |
|
413 | 415 | |
|
414 | 416 | HOOKS_SETTINGS = ( |
|
415 | 417 | ('hooks', 'changegroup.repo_size'), |
@@ -145,34 +145,6 b'' | |||
|
145 | 145 | |
|
146 | 146 | </div> |
|
147 | 147 | </div> |
|
148 | ## LABS for HG | |
|
149 | % if c.labs_active: | |
|
150 | <div class="panel panel-danger"> | |
|
151 | <div class="panel-heading"> | |
|
152 | <h3 class="panel-title">${_('Mercurial Labs Settings')} (${_('These features are considered experimental and may not work as expected.')})</h3> | |
|
153 | </div> | |
|
154 | <div class="panel-body"> | |
|
155 | ||
|
156 | <div class="checkbox"> | |
|
157 | ${h.checkbox('rhodecode_hg_use_rebase_for_merging' + suffix, 'True', **kwargs)} | |
|
158 | <label for="rhodecode_hg_use_rebase_for_merging${suffix}">${_('Use rebase as merge strategy')}</label> | |
|
159 | </div> | |
|
160 | <div class="label"> | |
|
161 | <span class="help-block">${_('Use rebase instead of creating a merge commit when merging via web interface.')}</span> | |
|
162 | </div> | |
|
163 | ||
|
164 | <div class="checkbox"> | |
|
165 | ${h.checkbox('rhodecode_hg_close_branch_before_merging' + suffix, 'True', **kwargs)} | |
|
166 | <label for="rhodecode_hg_close_branch_before_merging{suffix}">${_('Close branch before merging it')}</label> | |
|
167 | </div> | |
|
168 | <div class="label"> | |
|
169 | <span class="help-block">${_('Close branch before merging it into destination branch. No effect when rebase strategy is use.')}</span> | |
|
170 | </div> | |
|
171 | ||
|
172 | </div> | |
|
173 | </div> | |
|
174 | % endif | |
|
175 | ||
|
176 | 148 | % endif |
|
177 | 149 | |
|
178 | 150 | % if display_globals or repo_type in ['git']: |
@@ -340,4 +312,59 b'' | |||
|
340 | 312 | </div> |
|
341 | 313 | % endif |
|
342 | 314 | |
|
315 | % if display_globals or repo_type in ['hg',]: | |
|
316 | <div class="panel panel-default"> | |
|
317 | <div class="panel-heading" id="vcs-pull-requests-options"> | |
|
318 | <h3 class="panel-title">${_('Mercurial Pull Request Settings')}<a class="permalink" href="#vcs-hg-pull-requests-options"> ΒΆ</a></h3> | |
|
319 | </div> | |
|
320 | <div class="panel-body"> | |
|
321 | ## Specific HG settings | |
|
322 | <div class="checkbox"> | |
|
323 | ${h.checkbox('rhodecode_hg_use_rebase_for_merging' + suffix, 'True', **kwargs)} | |
|
324 | <label for="rhodecode_hg_use_rebase_for_merging${suffix}">${_('Use rebase as merge strategy')}</label> | |
|
325 | </div> | |
|
326 | <div class="label"> | |
|
327 | <span class="help-block">${_('Use rebase instead of creating a merge commit when merging via web interface.')}</span> | |
|
328 | </div> | |
|
329 | ||
|
330 | <div class="checkbox"> | |
|
331 | ${h.checkbox('rhodecode_hg_close_branch_before_merging' + suffix, 'True', **kwargs)} | |
|
332 | <label for="rhodecode_hg_close_branch_before_merging{suffix}">${_('Close branch before merging it')}</label> | |
|
333 | </div> | |
|
334 | <div class="label"> | |
|
335 | <span class="help-block">${_('Close branch before merging it into destination branch. No effect when rebase strategy is use.')}</span> | |
|
336 | </div> | |
|
337 | ||
|
338 | ||
|
339 | </div> | |
|
340 | </div> | |
|
341 | % endif | |
|
342 | ||
|
343 | ## DISABLED FOR GIT FOR NOW as the rebase/close is not supported yet | |
|
344 | ## % if display_globals or repo_type in ['git']: | |
|
345 | ## <div class="panel panel-default"> | |
|
346 | ## <div class="panel-heading" id="vcs-pull-requests-options"> | |
|
347 | ## <h3 class="panel-title">${_('Git Pull Request Settings')}<a class="permalink" href="#vcs-git-pull-requests-options"> ΒΆ</a></h3> | |
|
348 | ## </div> | |
|
349 | ## <div class="panel-body"> | |
|
350 | ## <div class="checkbox"> | |
|
351 | ## ${h.checkbox('rhodecode_git_use_rebase_for_merging' + suffix, 'True', **kwargs)} | |
|
352 | ## <label for="rhodecode_git_use_rebase_for_merging${suffix}">${_('Use rebase as merge strategy')}</label> | |
|
353 | ## </div> | |
|
354 | ## <div class="label"> | |
|
355 | ## <span class="help-block">${_('Use rebase instead of creating a merge commit when merging via web interface.')}</span> | |
|
356 | ## </div> | |
|
357 | ## | |
|
358 | ## <div class="checkbox"> | |
|
359 | ## ${h.checkbox('rhodecode_git_close_branch_before_merging' + suffix, 'True', **kwargs)} | |
|
360 | ## <label for="rhodecode_git_close_branch_before_merging{suffix}">${_('Delete branch after merging it')}</label> | |
|
361 | ## </div> | |
|
362 | ## <div class="label"> | |
|
363 | ## <span class="help-block">${_('Delete branch after merging it into destination branch. No effect when rebase strategy is use.')}</span> | |
|
364 | ## </div> | |
|
365 | ## </div> | |
|
366 | ## </div> | |
|
367 | ## % endif | |
|
368 | ||
|
369 | ||
|
343 | 370 | </%def> |
@@ -324,18 +324,6 b' class TestAdminSettingsVcs(object):' | |||
|
324 | 324 | setting = SettingsModel().get_setting_by_name(setting_key) |
|
325 | 325 | assert setting.app_settings_value is new_value |
|
326 | 326 | |
|
327 | def test_has_a_section_for_labs_settings_if_enabled(self, app): | |
|
328 | with mock.patch.dict( | |
|
329 | rhodecode.CONFIG, {'labs_settings_active': 'true'}): | |
|
330 | response = self.app.get(url('admin_settings_vcs')) | |
|
331 | response.mustcontain('Labs Settings') | |
|
332 | ||
|
333 | def test_has_not_a_section_for_labs_settings_if_disables(self, app): | |
|
334 | with mock.patch.dict( | |
|
335 | rhodecode.CONFIG, {'labs_settings_active': 'false'}): | |
|
336 | response = self.app.get(url('admin_settings_vcs')) | |
|
337 | response.mustcontain(no='Labs Settings') | |
|
338 | ||
|
339 | 327 | @pytest.mark.parametrize('new_value', [True, False]) |
|
340 | 328 | def test_allows_to_change_hg_rebase_merge_strategy( |
|
341 | 329 | self, app, form_defaults, csrf_token, new_value): |
@@ -41,6 +41,9 b' GENERAL_FORM_DATA = {' | |||
|
41 | 41 | 'rhodecode_pr_merge_enabled': True, |
|
42 | 42 | 'rhodecode_use_outdated_comments': True, |
|
43 | 43 | 'rhodecode_hg_use_rebase_for_merging': True, |
|
44 | 'rhodecode_hg_close_branch_before_merging': True, | |
|
45 | 'rhodecode_git_use_rebase_for_merging': True, | |
|
46 | 'rhodecode_git_close_branch_before_merging': True, | |
|
44 | 47 | } |
|
45 | 48 | |
|
46 | 49 |
@@ -164,7 +164,7 b' class TestPullRequestModel(object):' | |||
|
164 | 164 | pull_request.target_ref_parts, |
|
165 | 165 | pull_request.source_repo.scm_instance(), |
|
166 | 166 | pull_request.source_ref_parts, self.workspace_id, dry_run=True, |
|
167 | use_rebase=False) | |
|
167 | use_rebase=False, close_branch=False) | |
|
168 | 168 | |
|
169 | 169 | assert pull_request._last_merge_source_rev == self.source_commit |
|
170 | 170 | assert pull_request._last_merge_target_rev == self.target_commit |
@@ -193,7 +193,7 b' class TestPullRequestModel(object):' | |||
|
193 | 193 | pull_request.target_ref_parts, |
|
194 | 194 | pull_request.source_repo.scm_instance(), |
|
195 | 195 | pull_request.source_ref_parts, self.workspace_id, dry_run=True, |
|
196 | use_rebase=False) | |
|
196 | use_rebase=False, close_branch=False) | |
|
197 | 197 | |
|
198 | 198 | assert pull_request._last_merge_source_rev == self.source_commit |
|
199 | 199 | assert pull_request._last_merge_target_rev == self.target_commit |
@@ -225,7 +225,7 b' class TestPullRequestModel(object):' | |||
|
225 | 225 | pull_request.target_ref_parts, |
|
226 | 226 | pull_request.source_repo.scm_instance(), |
|
227 | 227 | pull_request.source_ref_parts, self.workspace_id, dry_run=True, |
|
228 | use_rebase=False) | |
|
228 | use_rebase=False, close_branch=False) | |
|
229 | 229 | |
|
230 | 230 | assert pull_request._last_merge_source_rev is None |
|
231 | 231 | assert pull_request._last_merge_target_rev is None |
@@ -299,7 +299,7 b' class TestPullRequestModel(object):' | |||
|
299 | 299 | pull_request.source_repo.scm_instance(), |
|
300 | 300 | pull_request.source_ref_parts, self.workspace_id, |
|
301 | 301 | user_name=user.username, user_email=user.email, message=message, |
|
302 | use_rebase=False | |
|
302 | use_rebase=False, close_branch=False | |
|
303 | 303 | ) |
|
304 | 304 | self.invalidation_mock.assert_called_once_with( |
|
305 | 305 | pull_request.target_repo.repo_name) |
@@ -338,7 +338,7 b' class TestPullRequestModel(object):' | |||
|
338 | 338 | pull_request.source_repo.scm_instance(), |
|
339 | 339 | pull_request.source_ref_parts, self.workspace_id, |
|
340 | 340 | user_name=user.username, user_email=user.email, message=message, |
|
341 | use_rebase=False | |
|
341 | use_rebase=False, close_branch=False | |
|
342 | 342 | ) |
|
343 | 343 | |
|
344 | 344 | pull_request = PullRequest.get(pull_request.pull_request_id) |
General Comments 0
You need to be logged in to leave comments.
Login now