##// END OF EJS Templates
api: pull-requests fixed logic of ancestor calculation and target ref calculation based on the web view.
marcink -
r2873:d22eab3d default
parent child Browse files
Show More
@@ -94,6 +94,20 b' class TestCreatePullRequestApi(object):'
94 assert pull_request.description == ''
94 assert pull_request.description == ''
95
95
96 @pytest.mark.backends("git", "hg")
96 @pytest.mark.backends("git", "hg")
97 def test_create_with_empty_title(self, backend):
98 data = self._prepare_data(backend)
99 data.pop('title')
100 id_, params = build_data(
101 self.apikey_regular, 'create_pull_request', **data)
102 response = api_call(self.app, params)
103 result = response.json
104 pull_request_id = result['result']['pull_request_id']
105 pull_request = PullRequestModel().get(pull_request_id)
106 data['ref'] = backend.default_branch_name
107 title = '{source_repo}#{ref} to {target_repo}'.format(**data)
108 assert pull_request.title == title
109
110 @pytest.mark.backends("git", "hg")
97 def test_create_with_reviewers_specified_by_names(
111 def test_create_with_reviewers_specified_by_names(
98 self, backend, no_notifications):
112 self, backend, no_notifications):
99 data = self._prepare_data(backend)
113 data = self._prepare_data(backend)
@@ -277,6 +291,7 b' class TestCreatePullRequestApi(object):'
277 self.commit_ids = backend.create_master_repo(commits)
291 self.commit_ids = backend.create_master_repo(commits)
278 self.source = backend.create_repo(heads=[source_head])
292 self.source = backend.create_repo(heads=[source_head])
279 self.target = backend.create_repo(heads=[target_head])
293 self.target = backend.create_repo(heads=[target_head])
294
280 data = {
295 data = {
281 'source_repo': self.source.repo_name,
296 'source_repo': self.source.repo_name,
282 'target_repo': self.target.repo_name,
297 'target_repo': self.target.repo_name,
@@ -608,7 +608,7 b' def create_pull_request('
608 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
608 [{'username': 'nick', 'reasons': ['original author'], 'mandatory': <bool>}]
609 """
609 """
610
610
611 source_db_repo = get_repo_or_error(source_repo)
611 source_db_repo = get_repo_or_error(source_repo)
612 target_db_repo = get_repo_or_error(target_repo)
612 target_db_repo = get_repo_or_error(target_repo)
613 if not has_superadmin_permission(apiuser):
613 if not has_superadmin_permission(apiuser):
614 _perms = ('repository.admin', 'repository.write', 'repository.read',)
614 _perms = ('repository.admin', 'repository.write', 'repository.read',)
@@ -616,24 +616,29 b' def create_pull_request('
616
616
617 full_source_ref = resolve_ref_or_error(source_ref, source_db_repo)
617 full_source_ref = resolve_ref_or_error(source_ref, source_db_repo)
618 full_target_ref = resolve_ref_or_error(target_ref, target_db_repo)
618 full_target_ref = resolve_ref_or_error(target_ref, target_db_repo)
619
620 source_scm = source_db_repo.scm_instance()
621 target_scm = target_db_repo.scm_instance()
622
619 source_commit = get_commit_or_error(full_source_ref, source_db_repo)
623 source_commit = get_commit_or_error(full_source_ref, source_db_repo)
620 target_commit = get_commit_or_error(full_target_ref, target_db_repo)
624 target_commit = get_commit_or_error(full_target_ref, target_db_repo)
621 source_scm = source_db_repo.scm_instance()
625
622 target_scm = target_db_repo.scm_instance()
626 ancestor = source_scm.get_common_ancestor(
627 source_commit.raw_id, target_commit.raw_id, target_scm)
628 if not ancestor:
629 raise JSONRPCError('no common ancestor found')
630
631 # recalculate target ref based on ancestor
632 target_ref_type, target_ref_name, __ = full_target_ref.split(':')
633 full_target_ref = ':'.join((target_ref_type, target_ref_name, ancestor))
623
634
624 commit_ranges = target_scm.compare(
635 commit_ranges = target_scm.compare(
625 target_commit.raw_id, source_commit.raw_id, source_scm,
636 target_commit.raw_id, source_commit.raw_id, source_scm,
626 merge=True, pre_load=[])
637 merge=True, pre_load=[])
627
638
628 ancestor = target_scm.get_common_ancestor(
629 target_commit.raw_id, source_commit.raw_id, source_scm)
630
631 if not commit_ranges:
639 if not commit_ranges:
632 raise JSONRPCError('no commits found')
640 raise JSONRPCError('no commits found')
633
641
634 if not ancestor:
635 raise JSONRPCError('no common ancestor found')
636
637 reviewer_objects = Optional.extract(reviewers) or []
642 reviewer_objects = Optional.extract(reviewers) or []
638
643
639 if reviewer_objects:
644 if reviewer_objects:
@@ -674,6 +679,7 b' def create_pull_request('
674 source_ref=title_source_ref,
679 source_ref=title_source_ref,
675 target=target_repo
680 target=target_repo
676 )
681 )
682 description = Optional.extract(description)
677
683
678 pull_request = PullRequestModel().create(
684 pull_request = PullRequestModel().create(
679 created_by=apiuser.user_id,
685 created_by=apiuser.user_id,
@@ -684,7 +690,7 b' def create_pull_request('
684 revisions=[commit.raw_id for commit in reversed(commit_ranges)],
690 revisions=[commit.raw_id for commit in reversed(commit_ranges)],
685 reviewers=reviewers,
691 reviewers=reviewers,
686 title=title,
692 title=title,
687 description=Optional.extract(description),
693 description=description,
688 reviewer_data=reviewer_rules,
694 reviewer_data=reviewer_rules,
689 auth_user=apiuser
695 auth_user=apiuser
690 )
696 )
General Comments 0
You need to be logged in to leave comments. Login now