launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #18453
[Merge] lp:~cjwatson/launchpad/git-register-merge-missing-path into lp:launchpad
Colin Watson has proposed merging lp:~cjwatson/launchpad/git-register-merge-missing-path into lp:launchpad.
Commit message:
Fix GitRefRegisterMergeProposalView.validate to stop assuming that all required fields are present.
Requested reviews:
Launchpad code reviewers (launchpad-reviewers)
Related bugs:
Bug #1451068 in Launchpad itself: "OOPS while attempting to create a git merge request"
https://bugs.launchpad.net/launchpad/+bug/1451068
For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/git-register-merge-missing-path/+merge/258121
Fix GitRefRegisterMergeProposalView.validate to stop assuming that all required fields are present.
--
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~cjwatson/launchpad/git-register-merge-missing-path into lp:launchpad.
=== modified file 'lib/lp/code/browser/gitref.py'
--- lib/lp/code/browser/gitref.py 2015-04-28 16:48:22 +0000
+++ lib/lp/code/browser/gitref.py 2015-05-03 11:42:57 +0000
@@ -296,7 +296,16 @@
def validate(self, data):
source_ref = self.context
target_repository = data['target_git_repository']
- target_ref = target_repository.getRefByPath(data['target_git_path'])
+ if not target_repository.isRepositoryMergeable(self.context):
+ self.setFieldError(
+ 'target_git_repository',
+ "This repository is not mergeable into %s." %
+ target_repository.identity)
+ target_path = data.get('target_git_path')
+ if target_path:
+ target_ref = target_repository.getRefByPath(target_path)
+ else:
+ target_ref = None
if target_ref is None:
self.setFieldError(
'target_git_path',
@@ -307,24 +316,22 @@
'target_git_path',
"The target repository and path together cannot be the same "
"as the source repository and path.")
- elif not target_repository.isRepositoryMergeable(self.context):
- self.setFieldError(
- 'target_git_repository',
- "This repository is not mergeable into %s." %
- target_repository.identity)
- elif (data.get('prerequisite_git_repository') is not None and
- data.get('prerequisite_git_path') is not None):
+ if data.get('prerequisite_git_repository') is not None:
prerequisite_repository = data['prerequisite_git_repository']
- prerequisite_ref = prerequisite_repository.getRefByPath(
- data['prerequisite_git_path'])
+ if not target_repository.isRepositoryMergeable(
+ prerequisite_repository):
+ self.setFieldError(
+ 'prerequisite_git_repository',
+ "This repository is not mergeable into %s." %
+ target_repository.identity)
+ prerequisite_path = data.get('prerequisite_git_path')
+ if prerequisite_path:
+ prerequisite_ref = prerequisite_repository.getRefByPath(
+ prerequisite_path)
+ else:
+ prerequisite_ref = None
if prerequisite_ref is None:
self.setFieldError(
'prerequisite_git_path',
"The prerequisite path must be the path of a reference in "
"the prerequisite repository.")
- elif not target_repository.isRepositoryMergeable(
- prerequisite_repository):
- self.setFieldError(
- 'prerequisite_git_repository',
- "This repository is not mergeable into %s." %
- target_repository.identity)
=== modified file 'lib/lp/code/browser/tests/test_branchmergeproposal.py'
--- lib/lp/code/browser/tests/test_branchmergeproposal.py 2015-04-28 16:48:22 +0000
+++ lib/lp/code/browser/tests/test_branchmergeproposal.py 2015-05-03 11:42:57 +0000
@@ -808,6 +808,72 @@
'form_wide_errors': []},
simplejson.loads(view.form_result))
+ def test_register_ajax_request_with_missing_target_git_path(self):
+ # A missing target_git_path is a validation error.
+ owner = self.factory.makePerson()
+ target_branch = self._makeTargetBranch(
+ owner=owner, information_type=InformationType.USERDATA)
+ extra = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
+ with person_logged_in(owner):
+ request = LaunchpadTestRequest(
+ method='POST', principal=owner,
+ form={
+ 'field.actions.register': 'Propose Merge',
+ 'field.target_git_repository.target_git_repository':
+ target_branch.repository.unique_name,
+ },
+ **extra)
+ view = create_initialized_view(
+ self.source_branch,
+ name='+register-merge',
+ request=request)
+ self.assertEqual(
+ '400 Validation', view.request.response.getStatusString())
+ self.assertEqual(
+ {'error_summary': 'There is 1 error.',
+ 'errors': {
+ 'field.target_git_path':
+ ('The target path must be the path of a reference in the '
+ 'target repository.')},
+ 'form_wide_errors': []},
+ simplejson.loads(view.form_result))
+
+ def test_register_ajax_request_with_missing_prerequisite_git_path(self):
+ # A missing prerequisite_git_path is a validation error if
+ # prerequisite_git_repository is present.
+ owner = self.factory.makePerson()
+ target_branch = self._makeTargetBranch(
+ owner=owner, information_type=InformationType.USERDATA)
+ prerequisite_branch = self._makeTargetBranch(
+ owner=owner, information_type=InformationType.USERDATA)
+ extra = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
+ with person_logged_in(owner):
+ request = LaunchpadTestRequest(
+ method='POST', principal=owner,
+ form={
+ 'field.actions.register': 'Propose Merge',
+ 'field.target_git_repository.target_git_repository':
+ target_branch.repository.unique_name,
+ 'field.target_git_path': target_branch.path,
+ 'field.prerequisite_git_repository':
+ prerequisite_branch.repository.unique_name,
+ },
+ **extra)
+ view = create_initialized_view(
+ self.source_branch,
+ name='+register-merge',
+ request=request)
+ self.assertEqual(
+ '400 Validation', view.request.response.getStatusString())
+ self.assertEqual(
+ {'error_summary': 'There is 1 error.',
+ 'errors': {
+ 'field.prerequisite_git_path':
+ ('The prerequisite path must be the path of a reference '
+ 'in the prerequisite repository.')},
+ 'form_wide_errors': []},
+ simplejson.loads(view.form_result))
+
class TestBranchMergeProposalResubmitViewMixin:
"""Test BranchMergeProposalResubmitView."""
Follow ups