Merge lp:~cjwatson/launchpad/git-register-merge-missing-path into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 17476
Proposed branch: lp:~cjwatson/launchpad/git-register-merge-missing-path
Merge into: lp:launchpad
Diff against target: 143 lines (+92/-26)
2 files modified
lib/lp/code/browser/gitref.py (+26/-26)
lib/lp/code/browser/tests/test_branchmergeproposal.py (+66/-0)
To merge this branch: bzr merge lp:~cjwatson/launchpad/git-register-merge-missing-path
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+258121@code.launchpad.net

Commit message

Fix GitRefRegisterMergeProposalView.validate to stop assuming that all required fields are present.

Description of the change

Fix GitRefRegisterMergeProposalView.validate to stop assuming that all required fields are present.

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) wrote :

Probably worth factoring the target/prereq validate bits out.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/code/browser/gitref.py'
2--- lib/lp/code/browser/gitref.py 2015-04-28 16:48:22 +0000
3+++ lib/lp/code/browser/gitref.py 2015-05-05 10:16:00 +0000
4@@ -293,36 +293,36 @@
5 except InvalidBranchMergeProposal as error:
6 self.addError(str(error))
7
8+ def _validateRef(self, data, name):
9+ repository = data.get('%s_git_repository' % name)
10+ path = data.get('%s_git_path' % name)
11+ if path:
12+ ref = repository.getRefByPath(path)
13+ else:
14+ ref = None
15+ if ref is None:
16+ self.setFieldError(
17+ '%s_git_path' % name,
18+ "The %s path must be the path of a reference in the "
19+ "%s repository." % (name, name))
20+ elif ref == self.context:
21+ self.setFieldError(
22+ '%s_git_path' % name,
23+ "The %s repository and path together cannot be the same "
24+ "as the source repository and path." % name)
25+ return repository
26+
27 def validate(self, data):
28 source_ref = self.context
29- target_repository = data['target_git_repository']
30- target_ref = target_repository.getRefByPath(data['target_git_path'])
31- if target_ref is None:
32- self.setFieldError(
33- 'target_git_path',
34- "The target path must be the path of a reference in the "
35- "target repository.")
36- elif source_ref == target_ref:
37- self.setFieldError(
38- 'target_git_path',
39- "The target repository and path together cannot be the same "
40- "as the source repository and path.")
41- elif not target_repository.isRepositoryMergeable(self.context):
42+ target_repository = self._validateRef(data, 'target')
43+ if not target_repository.isRepositoryMergeable(source_ref.repository):
44 self.setFieldError(
45 'target_git_repository',
46- "This repository is not mergeable into %s." %
47- target_repository.identity)
48- elif (data.get('prerequisite_git_repository') is not None and
49- data.get('prerequisite_git_path') is not None):
50- prerequisite_repository = data['prerequisite_git_repository']
51- prerequisite_ref = prerequisite_repository.getRefByPath(
52- data['prerequisite_git_path'])
53- if prerequisite_ref is None:
54- self.setFieldError(
55- 'prerequisite_git_path',
56- "The prerequisite path must be the path of a reference in "
57- "the prerequisite repository.")
58- elif not target_repository.isRepositoryMergeable(
59+ "%s is not mergeable into this repository." %
60+ source_ref.repository.identity)
61+ if data.get('prerequisite_git_repository') is not None:
62+ prerequisite_repository = self._validateRef(data, 'prerequisite')
63+ if not target_repository.isRepositoryMergeable(
64 prerequisite_repository):
65 self.setFieldError(
66 'prerequisite_git_repository',
67
68=== modified file 'lib/lp/code/browser/tests/test_branchmergeproposal.py'
69--- lib/lp/code/browser/tests/test_branchmergeproposal.py 2015-04-28 16:48:22 +0000
70+++ lib/lp/code/browser/tests/test_branchmergeproposal.py 2015-05-05 10:16:00 +0000
71@@ -808,6 +808,72 @@
72 'form_wide_errors': []},
73 simplejson.loads(view.form_result))
74
75+ def test_register_ajax_request_with_missing_target_git_path(self):
76+ # A missing target_git_path is a validation error.
77+ owner = self.factory.makePerson()
78+ target_branch = self._makeTargetBranch(
79+ owner=owner, information_type=InformationType.USERDATA)
80+ extra = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
81+ with person_logged_in(owner):
82+ request = LaunchpadTestRequest(
83+ method='POST', principal=owner,
84+ form={
85+ 'field.actions.register': 'Propose Merge',
86+ 'field.target_git_repository.target_git_repository':
87+ target_branch.repository.unique_name,
88+ },
89+ **extra)
90+ view = create_initialized_view(
91+ self.source_branch,
92+ name='+register-merge',
93+ request=request)
94+ self.assertEqual(
95+ '400 Validation', view.request.response.getStatusString())
96+ self.assertEqual(
97+ {'error_summary': 'There is 1 error.',
98+ 'errors': {
99+ 'field.target_git_path':
100+ ('The target path must be the path of a reference in the '
101+ 'target repository.')},
102+ 'form_wide_errors': []},
103+ simplejson.loads(view.form_result))
104+
105+ def test_register_ajax_request_with_missing_prerequisite_git_path(self):
106+ # A missing prerequisite_git_path is a validation error if
107+ # prerequisite_git_repository is present.
108+ owner = self.factory.makePerson()
109+ target_branch = self._makeTargetBranch(
110+ owner=owner, information_type=InformationType.USERDATA)
111+ prerequisite_branch = self._makeTargetBranch(
112+ owner=owner, information_type=InformationType.USERDATA)
113+ extra = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
114+ with person_logged_in(owner):
115+ request = LaunchpadTestRequest(
116+ method='POST', principal=owner,
117+ form={
118+ 'field.actions.register': 'Propose Merge',
119+ 'field.target_git_repository.target_git_repository':
120+ target_branch.repository.unique_name,
121+ 'field.target_git_path': target_branch.path,
122+ 'field.prerequisite_git_repository':
123+ prerequisite_branch.repository.unique_name,
124+ },
125+ **extra)
126+ view = create_initialized_view(
127+ self.source_branch,
128+ name='+register-merge',
129+ request=request)
130+ self.assertEqual(
131+ '400 Validation', view.request.response.getStatusString())
132+ self.assertEqual(
133+ {'error_summary': 'There is 1 error.',
134+ 'errors': {
135+ 'field.prerequisite_git_path':
136+ ('The prerequisite path must be the path of a reference '
137+ 'in the prerequisite repository.')},
138+ 'form_wide_errors': []},
139+ simplejson.loads(view.form_result))
140+
141
142 class TestBranchMergeProposalResubmitViewMixin:
143 """Test BranchMergeProposalResubmitView."""