Merge ~cjwatson/launchpad:stormify-branchmergeproposal into launchpad:master
- Git
- lp:~cjwatson/launchpad
- stormify-branchmergeproposal
- Merge into master
Proposed by
Colin Watson
Status: | Merged |
---|---|
Approved by: | Colin Watson |
Approved revision: | b6f4d067affc49737c6f4b0cbee3c8d55f56f1a5 |
Merge reported by: | Otto Co-Pilot |
Merged at revision: | not available |
Proposed branch: | ~cjwatson/launchpad:stormify-branchmergeproposal |
Merge into: | launchpad:master |
Diff against target: |
817 lines (+204/-142) 9 files modified
lib/lp/code/interfaces/branchmergeproposal.py (+4/-4) lib/lp/code/mail/codehandler.py (+5/-5) lib/lp/code/model/branch.py (+14/-10) lib/lp/code/model/branchcollection.py (+11/-7) lib/lp/code/model/branchmergeproposal.py (+138/-93) lib/lp/code/model/gitcollection.py (+6/-5) lib/lp/code/model/gitrepository.py (+5/-5) lib/lp/code/model/tests/test_branch.py (+9/-6) lib/lp/code/model/tests/test_gitrepository.py (+12/-7) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Guruprasad | Approve | ||
Review via email: mp+446309@code.launchpad.net |
Commit message
Convert BranchMergeProposal to Storm
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/lib/lp/code/interfaces/branchmergeproposal.py b/lib/lp/code/interfaces/branchmergeproposal.py | |||
2 | index 20b4ceb..e65eef6 100644 | |||
3 | --- a/lib/lp/code/interfaces/branchmergeproposal.py | |||
4 | +++ b/lib/lp/code/interfaces/branchmergeproposal.py | |||
5 | @@ -93,16 +93,16 @@ class IBranchMergeProposalPublic(IPrivacy): | |||
6 | 93 | readonly=True, | 93 | readonly=True, |
7 | 94 | description=_("The tracking number for this merge proposal."), | 94 | description=_("The tracking number for this merge proposal."), |
8 | 95 | ) | 95 | ) |
10 | 96 | source_branchID = Int( | 96 | source_branch_id = Int( |
11 | 97 | title=_("Source branch ID"), required=False, readonly=True | 97 | title=_("Source branch ID"), required=False, readonly=True |
12 | 98 | ) | 98 | ) |
14 | 99 | source_git_repositoryID = Int( | 99 | source_git_repository_id = Int( |
15 | 100 | title=_("Source Git repository ID"), required=False, readonly=True | 100 | title=_("Source Git repository ID"), required=False, readonly=True |
16 | 101 | ) | 101 | ) |
18 | 102 | prerequisite_branchID = Int( | 102 | prerequisite_branch_id = Int( |
19 | 103 | title=_("Prerequisite branch ID"), required=False, readonly=True | 103 | title=_("Prerequisite branch ID"), required=False, readonly=True |
20 | 104 | ) | 104 | ) |
22 | 105 | prerequisite_git_repositoryID = Int( | 105 | prerequisite_git_repository_id = Int( |
23 | 106 | title=_("Prerequisite Git repository ID"), | 106 | title=_("Prerequisite Git repository ID"), |
24 | 107 | required=False, | 107 | required=False, |
25 | 108 | readonly=True, | 108 | readonly=True, |
26 | diff --git a/lib/lp/code/mail/codehandler.py b/lib/lp/code/mail/codehandler.py | |||
27 | index 7a8a3f0..6eb574a 100644 | |||
28 | --- a/lib/lp/code/mail/codehandler.py | |||
29 | +++ b/lib/lp/code/mail/codehandler.py | |||
30 | @@ -10,12 +10,12 @@ from zope.component import getUtility | |||
31 | 10 | from zope.interface import implementer | 10 | from zope.interface import implementer |
32 | 11 | from zope.security.interfaces import Unauthorized | 11 | from zope.security.interfaces import Unauthorized |
33 | 12 | 12 | ||
34 | 13 | from lp.app.errors import NotFoundError | ||
35 | 13 | from lp.code.adapters.branch import BranchMergeProposalNoPreviewDiffDelta | 14 | from lp.code.adapters.branch import BranchMergeProposalNoPreviewDiffDelta |
36 | 14 | from lp.code.enums import CodeReviewVote | 15 | from lp.code.enums import CodeReviewVote |
37 | 15 | from lp.code.errors import UserNotBranchReviewer | 16 | from lp.code.errors import UserNotBranchReviewer |
38 | 16 | from lp.code.interfaces.branchmergeproposal import IBranchMergeProposalGetter | 17 | from lp.code.interfaces.branchmergeproposal import IBranchMergeProposalGetter |
39 | 17 | from lp.services.config import config | 18 | from lp.services.config import config |
40 | 18 | from lp.services.database.sqlobject import SQLObjectNotFound | ||
41 | 19 | from lp.services.mail.commands import EmailCommand, EmailCommandCollection | 19 | from lp.services.mail.commands import EmailCommand, EmailCommandCollection |
42 | 20 | from lp.services.mail.helpers import ( | 20 | from lp.services.mail.helpers import ( |
43 | 21 | IncomingEmailError, | 21 | IncomingEmailError, |
44 | @@ -42,7 +42,7 @@ class InvalidBranchMergeProposalAddress(BadBranchMergeProposalAddress): | |||
45 | 42 | """The user-supplied address is not an acceptable value.""" | 42 | """The user-supplied address is not an acceptable value.""" |
46 | 43 | 43 | ||
47 | 44 | 44 | ||
49 | 45 | class NonExistantBranchMergeProposalAddress(BadBranchMergeProposalAddress): | 45 | class NonExistentBranchMergeProposalAddress(BadBranchMergeProposalAddress): |
50 | 46 | """The BranchMergeProposal specified by the address does not exist.""" | 46 | """The BranchMergeProposal specified by the address does not exist.""" |
51 | 47 | 47 | ||
52 | 48 | 48 | ||
53 | @@ -310,7 +310,7 @@ class CodeHandler: | |||
54 | 310 | user = getUtility(ILaunchBag).user | 310 | user = getUtility(ILaunchBag).user |
55 | 311 | try: | 311 | try: |
56 | 312 | merge_proposal = self.getBranchMergeProposal(email_addr) | 312 | merge_proposal = self.getBranchMergeProposal(email_addr) |
58 | 313 | except NonExistantBranchMergeProposalAddress: | 313 | except NonExistentBranchMergeProposalAddress: |
59 | 314 | send_process_error_notification( | 314 | send_process_error_notification( |
60 | 315 | str(user.preferredemail.email), | 315 | str(user.preferredemail.email), |
61 | 316 | "Submit Request Failure", | 316 | "Submit Request Failure", |
62 | @@ -375,5 +375,5 @@ class CodeHandler: | |||
63 | 375 | getter = getUtility(IBranchMergeProposalGetter) | 375 | getter = getUtility(IBranchMergeProposalGetter) |
64 | 376 | try: | 376 | try: |
65 | 377 | return getter.get(merge_proposal_id) | 377 | return getter.get(merge_proposal_id) |
68 | 378 | except SQLObjectNotFound: | 378 | except NotFoundError: |
69 | 379 | raise NonExistantBranchMergeProposalAddress(email_addr) | 379 | raise NonExistentBranchMergeProposalAddress(email_addr) |
70 | diff --git a/lib/lp/code/model/branch.py b/lib/lp/code/model/branch.py | |||
71 | index b9cfedc..b9f9b5f 100644 | |||
72 | --- a/lib/lp/code/model/branch.py | |||
73 | +++ b/lib/lp/code/model/branch.py | |||
74 | @@ -134,7 +134,7 @@ from lp.services.database.datetimecol import UtcDateTimeCol | |||
75 | 134 | from lp.services.database.decoratedresultset import DecoratedResultSet | 134 | from lp.services.database.decoratedresultset import DecoratedResultSet |
76 | 135 | from lp.services.database.enumcol import DBEnum | 135 | from lp.services.database.enumcol import DBEnum |
77 | 136 | from lp.services.database.interfaces import IPrimaryStore, IStore | 136 | from lp.services.database.interfaces import IPrimaryStore, IStore |
79 | 137 | from lp.services.database.sqlbase import SQLBase, sqlvalues | 137 | from lp.services.database.sqlbase import SQLBase |
80 | 138 | from lp.services.database.sqlobject import ForeignKey, IntCol, StringCol | 138 | from lp.services.database.sqlobject import ForeignKey, IntCol, StringCol |
81 | 139 | from lp.services.database.stormexpr import Array, ArrayAgg, ArrayIntersects | 139 | from lp.services.database.stormexpr import Array, ArrayAgg, ArrayIntersects |
82 | 140 | from lp.services.helpers import shortlist | 140 | from lp.services.helpers import shortlist |
83 | @@ -559,12 +559,14 @@ class Branch(SQLBase, WebhookTargetMixin, BzrIdentityMixin): | |||
84 | 559 | @property | 559 | @property |
85 | 560 | def dependent_branches(self): | 560 | def dependent_branches(self): |
86 | 561 | """See `IBranch`.""" | 561 | """See `IBranch`.""" |
93 | 562 | return BranchMergeProposal.select( | 562 | return Store.of(self).find( |
94 | 563 | """ | 563 | BranchMergeProposal, |
95 | 564 | BranchMergeProposal.dependent_branch = %s AND | 564 | BranchMergeProposal.prerequisite_branch == self, |
96 | 565 | BranchMergeProposal.queue_status NOT IN %s | 565 | Not( |
97 | 566 | """ | 566 | BranchMergeProposal.queue_status.is_in( |
98 | 567 | % sqlvalues(self, BRANCH_MERGE_PROPOSAL_FINAL_STATES) | 567 | BRANCH_MERGE_PROPOSAL_FINAL_STATES |
99 | 568 | ) | ||
100 | 569 | ), | ||
101 | 568 | ) | 570 | ) |
102 | 569 | 571 | ||
103 | 570 | def getMergeProposals( | 572 | def getMergeProposals( |
104 | @@ -942,7 +944,9 @@ class Branch(SQLBase, WebhookTargetMixin, BzrIdentityMixin): | |||
105 | 942 | ) | 944 | ) |
106 | 943 | # Cannot use self.landing_candidates, because it ignores merged | 945 | # Cannot use self.landing_candidates, because it ignores merged |
107 | 944 | # merge proposals. | 946 | # merge proposals. |
109 | 945 | for merge_proposal in BranchMergeProposal.selectBy(target_branch=self): | 947 | for merge_proposal in Store.of(self).find( |
110 | 948 | BranchMergeProposal, target_branch=self | ||
111 | 949 | ): | ||
112 | 946 | deletion_operations.append( | 950 | deletion_operations.append( |
113 | 947 | DeletionCallable( | 951 | DeletionCallable( |
114 | 948 | merge_proposal, | 952 | merge_proposal, |
115 | @@ -953,8 +957,8 @@ class Branch(SQLBase, WebhookTargetMixin, BzrIdentityMixin): | |||
116 | 953 | merge_proposal.deleteProposal, | 957 | merge_proposal.deleteProposal, |
117 | 954 | ) | 958 | ) |
118 | 955 | ) | 959 | ) |
121 | 956 | for merge_proposal in BranchMergeProposal.selectBy( | 960 | for merge_proposal in Store.of(self).find( |
122 | 957 | prerequisite_branch=self | 961 | BranchMergeProposal, prerequisite_branch=self |
123 | 958 | ): | 962 | ): |
124 | 959 | alteration_operations.append(ClearDependentBranch(merge_proposal)) | 963 | alteration_operations.append(ClearDependentBranch(merge_proposal)) |
125 | 960 | 964 | ||
126 | diff --git a/lib/lp/code/model/branchcollection.py b/lib/lp/code/model/branchcollection.py | |||
127 | index 8ffbb63..55cbb0c 100644 | |||
128 | --- a/lib/lp/code/model/branchcollection.py | |||
129 | +++ b/lib/lp/code/model/branchcollection.py | |||
130 | @@ -431,14 +431,16 @@ class GenericBranchCollection: | |||
131 | 431 | Join( | 431 | Join( |
132 | 432 | BranchMergeProposal, | 432 | BranchMergeProposal, |
133 | 433 | And( | 433 | And( |
135 | 434 | Branch.id == BranchMergeProposal.source_branchID, | 434 | Branch.id == BranchMergeProposal.source_branch_id, |
136 | 435 | *( | 435 | *( |
137 | 436 | self._branch_filter_expressions | 436 | self._branch_filter_expressions |
138 | 437 | + self._asymmetric_filter_expressions | 437 | + self._asymmetric_filter_expressions |
139 | 438 | ), | 438 | ), |
140 | 439 | ), | 439 | ), |
141 | 440 | ), | 440 | ), |
143 | 441 | Join(Target, Target.id == BranchMergeProposal.target_branchID), | 441 | Join( |
144 | 442 | Target, Target.id == BranchMergeProposal.target_branch_id | ||
145 | 443 | ), | ||
146 | 442 | ] | 444 | ] |
147 | 443 | ) | 445 | ) |
148 | 444 | expressions = self._getBranchVisibilityExpression() | 446 | expressions = self._getBranchVisibilityExpression() |
149 | @@ -446,7 +448,7 @@ class GenericBranchCollection: | |||
150 | 446 | if for_branches is not None: | 448 | if for_branches is not None: |
151 | 447 | branch_ids = [branch.id for branch in for_branches] | 449 | branch_ids = [branch.id for branch in for_branches] |
152 | 448 | expressions.append( | 450 | expressions.append( |
154 | 449 | BranchMergeProposal.source_branchID.is_in(branch_ids) | 451 | BranchMergeProposal.source_branch_id.is_in(branch_ids) |
155 | 450 | ) | 452 | ) |
156 | 451 | if target_branch is not None: | 453 | if target_branch is not None: |
157 | 452 | expressions.append( | 454 | expressions.append( |
158 | @@ -467,7 +469,7 @@ class GenericBranchCollection: | |||
159 | 467 | == BranchRevision.sequence, | 469 | == BranchRevision.sequence, |
160 | 468 | BranchRevision.revision_id == Revision.id, | 470 | BranchRevision.revision_id == Revision.id, |
161 | 469 | BranchRevision.branch_id | 471 | BranchRevision.branch_id |
163 | 470 | == BranchMergeProposal.target_branchID, | 472 | == BranchMergeProposal.target_branch_id, |
164 | 471 | Revision.revision_id == merged_revision, | 473 | Revision.revision_id == merged_revision, |
165 | 472 | ] | 474 | ] |
166 | 473 | ) | 475 | ) |
167 | @@ -512,7 +514,7 @@ class GenericBranchCollection: | |||
168 | 512 | # Need to filter on Branch beyond the with constraints. | 514 | # Need to filter on Branch beyond the with constraints. |
169 | 513 | expressions += self._asymmetric_filter_expressions | 515 | expressions += self._asymmetric_filter_expressions |
170 | 514 | expressions.append( | 516 | expressions.append( |
172 | 515 | BranchMergeProposal.source_branchID == Branch.id | 517 | BranchMergeProposal.source_branch_id == Branch.id |
173 | 516 | ) | 518 | ) |
174 | 517 | tables.append(Branch) | 519 | tables.append(Branch) |
175 | 518 | tables.extend(self._asymmetric_tables.values()) | 520 | tables.extend(self._asymmetric_tables.values()) |
176 | @@ -568,12 +570,14 @@ class GenericBranchCollection: | |||
177 | 568 | 570 | ||
178 | 569 | expressions = [ | 571 | expressions = [ |
179 | 570 | CodeReviewVoteReference.reviewer == reviewer, | 572 | CodeReviewVoteReference.reviewer == reviewer, |
181 | 571 | BranchMergeProposal.source_branchID.is_in(self._getBranchSelect()), | 573 | BranchMergeProposal.source_branch_id.is_in( |
182 | 574 | self._getBranchSelect() | ||
183 | 575 | ), | ||
184 | 572 | ] | 576 | ] |
185 | 573 | visibility = self._getBranchVisibilityExpression() | 577 | visibility = self._getBranchVisibilityExpression() |
186 | 574 | if visibility: | 578 | if visibility: |
187 | 575 | expressions.append( | 579 | expressions.append( |
189 | 576 | BranchMergeProposal.target_branchID.is_in( | 580 | BranchMergeProposal.target_branch_id.is_in( |
190 | 577 | Select(Branch.id, visibility) | 581 | Select(Branch.id, visibility) |
191 | 578 | ) | 582 | ) |
192 | 579 | ) | 583 | ) |
193 | diff --git a/lib/lp/code/model/branchmergeproposal.py b/lib/lp/code/model/branchmergeproposal.py | |||
194 | index bf927c8..7fb2176 100644 | |||
195 | --- a/lib/lp/code/model/branchmergeproposal.py | |||
196 | +++ b/lib/lp/code/model/branchmergeproposal.py | |||
197 | @@ -11,12 +11,13 @@ __all__ = [ | |||
198 | 11 | 11 | ||
199 | 12 | import sys | 12 | import sys |
200 | 13 | from collections import defaultdict | 13 | from collections import defaultdict |
201 | 14 | from datetime import timezone | ||
202 | 14 | from email.utils import make_msgid | 15 | from email.utils import make_msgid |
203 | 15 | from operator import attrgetter | 16 | from operator import attrgetter |
204 | 16 | 17 | ||
205 | 17 | from lazr.lifecycle.event import ObjectCreatedEvent, ObjectDeletedEvent | 18 | from lazr.lifecycle.event import ObjectCreatedEvent, ObjectDeletedEvent |
206 | 18 | from storm.expr import SQL, And, Desc, Join, LeftJoin, Not, Or, Select | 19 | from storm.expr import SQL, And, Desc, Join, LeftJoin, Not, Or, Select |
208 | 19 | from storm.locals import Int, Reference | 20 | from storm.locals import DateTime, Int, Reference, Unicode |
209 | 20 | from storm.store import Store | 21 | from storm.store import Store |
210 | 21 | from zope.component import getUtility | 22 | from zope.component import getUtility |
211 | 22 | from zope.error.interfaces import IErrorReportingUtility | 23 | from zope.error.interfaces import IErrorReportingUtility |
212 | @@ -82,11 +83,10 @@ from lp.registry.model.person import Person | |||
213 | 82 | from lp.services.config import config | 83 | from lp.services.config import config |
214 | 83 | from lp.services.database.bulk import load, load_referencing, load_related | 84 | from lp.services.database.bulk import load, load_referencing, load_related |
215 | 84 | from lp.services.database.constants import DEFAULT, UTC_NOW | 85 | from lp.services.database.constants import DEFAULT, UTC_NOW |
216 | 85 | from lp.services.database.datetimecol import UtcDateTimeCol | ||
217 | 86 | from lp.services.database.enumcol import DBEnum | 86 | from lp.services.database.enumcol import DBEnum |
218 | 87 | from lp.services.database.interfaces import IPrimaryStore, IStore | 87 | from lp.services.database.interfaces import IPrimaryStore, IStore |
221 | 88 | from lp.services.database.sqlbase import SQLBase, quote | 88 | from lp.services.database.sqlbase import quote |
222 | 89 | from lp.services.database.sqlobject import ForeignKey, IntCol, StringCol | 89 | from lp.services.database.stormbase import StormBase |
223 | 90 | from lp.services.helpers import shortlist | 90 | from lp.services.helpers import shortlist |
224 | 91 | from lp.services.job.interfaces.job import JobStatus | 91 | from lp.services.job.interfaces.job import JobStatus |
225 | 92 | from lp.services.job.model.job import Job | 92 | from lp.services.job.model.job import Job |
226 | @@ -160,65 +160,62 @@ class TooManyRelatedBugs(Exception): | |||
227 | 160 | 160 | ||
228 | 161 | 161 | ||
229 | 162 | @implementer(IBranchMergeProposal, IHasBranchTarget) | 162 | @implementer(IBranchMergeProposal, IHasBranchTarget) |
231 | 163 | class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | 163 | class BranchMergeProposal(StormBase, BugLinkTargetMixin): |
232 | 164 | """A relationship between a person and a branch.""" | 164 | """A relationship between a person and a branch.""" |
233 | 165 | 165 | ||
236 | 166 | _table = "BranchMergeProposal" | 166 | __storm_table__ = "BranchMergeProposal" |
237 | 167 | _defaultOrder = ["-date_created", "id"] | 167 | __storm_order__ = ("-date_created", "id") |
238 | 168 | 168 | ||
245 | 169 | registrant = ForeignKey( | 169 | id = Int(primary=True) |
240 | 170 | dbName="registrant", | ||
241 | 171 | foreignKey="Person", | ||
242 | 172 | storm_validator=validate_public_person, | ||
243 | 173 | notNull=True, | ||
244 | 174 | ) | ||
246 | 175 | 170 | ||
249 | 176 | source_branch = ForeignKey( | 171 | registrant_id = Int( |
250 | 177 | dbName="source_branch", foreignKey="Branch", notNull=False | 172 | name="registrant", validator=validate_public_person, allow_none=False |
251 | 178 | ) | 173 | ) |
253 | 179 | source_git_repositoryID = Int( | 174 | registrant = Reference(registrant_id, "Person.id") |
254 | 175 | |||
255 | 176 | source_branch_id = Int(name="source_branch", allow_none=True) | ||
256 | 177 | source_branch = Reference(source_branch_id, "Branch.id") | ||
257 | 178 | source_git_repository_id = Int( | ||
258 | 180 | name="source_git_repository", allow_none=True | 179 | name="source_git_repository", allow_none=True |
259 | 181 | ) | 180 | ) |
260 | 182 | source_git_repository = Reference( | 181 | source_git_repository = Reference( |
262 | 183 | source_git_repositoryID, "GitRepository.id" | 182 | source_git_repository_id, "GitRepository.id" |
263 | 184 | ) | 183 | ) |
266 | 185 | source_git_path = StringCol( | 184 | source_git_path = Unicode( |
267 | 186 | dbName="source_git_path", default=None, notNull=False | 185 | name="source_git_path", default=None, allow_none=True |
268 | 187 | ) | 186 | ) |
271 | 188 | source_git_commit_sha1 = StringCol( | 187 | source_git_commit_sha1 = Unicode( |
272 | 189 | dbName="source_git_commit_sha1", default=None, notNull=False | 188 | name="source_git_commit_sha1", default=None, allow_none=True |
273 | 190 | ) | 189 | ) |
274 | 191 | 190 | ||
279 | 192 | target_branch = ForeignKey( | 191 | target_branch_id = Int(name="target_branch", allow_none=True) |
280 | 193 | dbName="target_branch", foreignKey="Branch", notNull=False | 192 | target_branch = Reference(target_branch_id, "Branch.id") |
281 | 194 | ) | 193 | target_git_repository_id = Int( |
278 | 195 | target_git_repositoryID = Int( | ||
282 | 196 | name="target_git_repository", allow_none=True | 194 | name="target_git_repository", allow_none=True |
283 | 197 | ) | 195 | ) |
284 | 198 | target_git_repository = Reference( | 196 | target_git_repository = Reference( |
286 | 199 | target_git_repositoryID, "GitRepository.id" | 197 | target_git_repository_id, "GitRepository.id" |
287 | 200 | ) | 198 | ) |
290 | 201 | target_git_path = StringCol( | 199 | target_git_path = Unicode( |
291 | 202 | dbName="target_git_path", default=None, notNull=False | 200 | name="target_git_path", default=None, allow_none=True |
292 | 203 | ) | 201 | ) |
295 | 204 | target_git_commit_sha1 = StringCol( | 202 | target_git_commit_sha1 = Unicode( |
296 | 205 | dbName="target_git_commit_sha1", default=None, notNull=False | 203 | name="target_git_commit_sha1", default=None, allow_none=True |
297 | 206 | ) | 204 | ) |
298 | 207 | 205 | ||
303 | 208 | prerequisite_branch = ForeignKey( | 206 | prerequisite_branch_id = Int(name="dependent_branch", allow_none=True) |
304 | 209 | dbName="dependent_branch", foreignKey="Branch", notNull=False | 207 | prerequisite_branch = Reference(prerequisite_branch_id, "Branch.id") |
305 | 210 | ) | 208 | prerequisite_git_repository_id = Int( |
302 | 211 | prerequisite_git_repositoryID = Int( | ||
306 | 212 | name="dependent_git_repository", allow_none=True | 209 | name="dependent_git_repository", allow_none=True |
307 | 213 | ) | 210 | ) |
308 | 214 | prerequisite_git_repository = Reference( | 211 | prerequisite_git_repository = Reference( |
310 | 215 | prerequisite_git_repositoryID, "GitRepository.id" | 212 | prerequisite_git_repository_id, "GitRepository.id" |
311 | 216 | ) | 213 | ) |
314 | 217 | prerequisite_git_path = StringCol( | 214 | prerequisite_git_path = Unicode( |
315 | 218 | dbName="dependent_git_path", default=None, notNull=False | 215 | name="dependent_git_path", default=None, allow_none=True |
316 | 219 | ) | 216 | ) |
319 | 220 | prerequisite_git_commit_sha1 = StringCol( | 217 | prerequisite_git_commit_sha1 = Unicode( |
320 | 221 | dbName="dependent_git_commit_sha1", default=None, notNull=False | 218 | name="dependent_git_commit_sha1", default=None, allow_none=True |
321 | 222 | ) | 219 | ) |
322 | 223 | 220 | ||
323 | 224 | @property | 221 | @property |
324 | @@ -303,9 +300,9 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
325 | 303 | else: | 300 | else: |
326 | 304 | return self.source_git_repository | 301 | return self.source_git_repository |
327 | 305 | 302 | ||
329 | 306 | description = StringCol(default=None) | 303 | description = Unicode(default=None) |
330 | 307 | 304 | ||
332 | 308 | whiteboard = StringCol(default=None) | 305 | whiteboard = Unicode(default=None) |
333 | 309 | 306 | ||
334 | 310 | queue_status = DBEnum( | 307 | queue_status = DBEnum( |
335 | 311 | enum=BranchMergeProposalStatus, | 308 | enum=BranchMergeProposalStatus, |
336 | @@ -326,13 +323,13 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
337 | 326 | for obj in objects | 323 | for obj in objects |
338 | 327 | ) | 324 | ) |
339 | 328 | 325 | ||
345 | 329 | reviewer = ForeignKey( | 326 | reviewer_id = Int( |
346 | 330 | dbName="reviewer", | 327 | name="reviewer", |
347 | 331 | foreignKey="Person", | 328 | validator=validate_person, |
348 | 332 | storm_validator=validate_person, | 329 | allow_none=True, |
344 | 333 | notNull=False, | ||
349 | 334 | default=None, | 330 | default=None, |
350 | 335 | ) | 331 | ) |
351 | 332 | reviewer = Reference(reviewer_id, "Person.id") | ||
352 | 336 | 333 | ||
353 | 337 | @property | 334 | @property |
354 | 338 | def next_preview_diff_job(self): | 335 | def next_preview_diff_job(self): |
355 | @@ -356,13 +353,13 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
356 | 356 | else: | 353 | else: |
357 | 357 | return None | 354 | return None |
358 | 358 | 355 | ||
360 | 359 | reviewed_revision_id = StringCol(default=None) | 356 | reviewed_revision_id = Unicode(default=None) |
361 | 360 | 357 | ||
363 | 361 | commit_message = StringCol(default=None) | 358 | commit_message = Unicode(default=None) |
364 | 362 | 359 | ||
368 | 363 | date_merged = UtcDateTimeCol(default=None) | 360 | date_merged = DateTime(default=None, tzinfo=timezone.utc) |
369 | 364 | merged_revno = IntCol(default=None) | 361 | merged_revno = Int(default=None) |
370 | 365 | merged_revision_id = StringCol(default=None) | 362 | merged_revision_id = Unicode(default=None) |
371 | 366 | 363 | ||
372 | 367 | @property | 364 | @property |
373 | 368 | def merged_revision(self): | 365 | def merged_revision(self): |
374 | @@ -372,13 +369,56 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
375 | 372 | else: | 369 | else: |
376 | 373 | return self.merged_revision_id | 370 | return self.merged_revision_id |
377 | 374 | 371 | ||
383 | 375 | merge_reporter = ForeignKey( | 372 | merge_reporter_id = Int( |
384 | 376 | dbName="merge_reporter", | 373 | name="merge_reporter", |
385 | 377 | foreignKey="Person", | 374 | validator=validate_public_person, |
386 | 378 | storm_validator=validate_public_person, | 375 | allow_none=True, |
382 | 379 | notNull=False, | ||
387 | 380 | default=None, | 376 | default=None, |
388 | 381 | ) | 377 | ) |
389 | 378 | merge_reporter = Reference(merge_reporter_id, "Person.id") | ||
390 | 379 | |||
391 | 380 | def __init__( | ||
392 | 381 | self, | ||
393 | 382 | registrant, | ||
394 | 383 | source_branch=None, | ||
395 | 384 | source_git_repository=None, | ||
396 | 385 | source_git_path=None, | ||
397 | 386 | source_git_commit_sha1=None, | ||
398 | 387 | target_branch=None, | ||
399 | 388 | target_git_repository=None, | ||
400 | 389 | target_git_path=None, | ||
401 | 390 | target_git_commit_sha1=None, | ||
402 | 391 | prerequisite_branch=None, | ||
403 | 392 | prerequisite_git_repository=None, | ||
404 | 393 | prerequisite_git_path=None, | ||
405 | 394 | prerequisite_git_commit_sha1=None, | ||
406 | 395 | description=None, | ||
407 | 396 | whiteboard=None, | ||
408 | 397 | queue_status=DEFAULT, | ||
409 | 398 | commit_message=None, | ||
410 | 399 | date_created=DEFAULT, | ||
411 | 400 | date_review_requested=None, | ||
412 | 401 | ): | ||
413 | 402 | super().__init__() | ||
414 | 403 | self.registrant = registrant | ||
415 | 404 | self.source_branch = source_branch | ||
416 | 405 | self.source_git_repository = source_git_repository | ||
417 | 406 | self.source_git_path = source_git_path | ||
418 | 407 | self.source_git_commit_sha1 = source_git_commit_sha1 | ||
419 | 408 | self.target_branch = target_branch | ||
420 | 409 | self.target_git_repository = target_git_repository | ||
421 | 410 | self.target_git_path = target_git_path | ||
422 | 411 | self.target_git_commit_sha1 = target_git_commit_sha1 | ||
423 | 412 | self.prerequisite_branch = prerequisite_branch | ||
424 | 413 | self.prerequisite_git_repository = prerequisite_git_repository | ||
425 | 414 | self.prerequisite_git_path = prerequisite_git_path | ||
426 | 415 | self.prerequisite_git_commit_sha1 = prerequisite_git_commit_sha1 | ||
427 | 416 | self.description = description | ||
428 | 417 | self.whiteboard = whiteboard | ||
429 | 418 | self.queue_status = queue_status | ||
430 | 419 | self.commit_message = commit_message | ||
431 | 420 | self.date_created = date_created | ||
432 | 421 | self.date_review_requested = date_review_requested | ||
433 | 382 | 422 | ||
434 | 383 | @property | 423 | @property |
435 | 384 | def bugs(self): | 424 | def bugs(self): |
436 | @@ -557,22 +597,24 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
437 | 557 | def address(self): | 597 | def address(self): |
438 | 558 | return "mp+%d@%s" % (self.id, config.launchpad.code_domain) | 598 | return "mp+%d@%s" % (self.id, config.launchpad.code_domain) |
439 | 559 | 599 | ||
446 | 560 | superseded_by = ForeignKey( | 600 | superseded_by_id = Int(name="superseded_by", allow_none=True, default=None) |
447 | 561 | dbName="superseded_by", | 601 | superseded_by = Reference(superseded_by_id, "BranchMergeProposal.id") |
442 | 562 | foreignKey="BranchMergeProposal", | ||
443 | 563 | notNull=False, | ||
444 | 564 | default=None, | ||
445 | 565 | ) | ||
448 | 566 | 602 | ||
450 | 567 | _supersedes = Reference("<primary key>", "superseded_by", on_remote=True) | 603 | _supersedes = Reference("id", "superseded_by_id", on_remote=True) |
451 | 568 | 604 | ||
452 | 569 | @cachedproperty | 605 | @cachedproperty |
453 | 570 | def supersedes(self): | 606 | def supersedes(self): |
454 | 571 | return self._supersedes | 607 | return self._supersedes |
455 | 572 | 608 | ||
459 | 573 | date_created = UtcDateTimeCol(notNull=True, default=DEFAULT) | 609 | date_created = DateTime( |
460 | 574 | date_review_requested = UtcDateTimeCol(notNull=False, default=None) | 610 | allow_none=False, default=DEFAULT, tzinfo=timezone.utc |
461 | 575 | date_reviewed = UtcDateTimeCol(notNull=False, default=None) | 611 | ) |
462 | 612 | date_review_requested = DateTime( | ||
463 | 613 | allow_none=True, default=None, tzinfo=timezone.utc | ||
464 | 614 | ) | ||
465 | 615 | date_reviewed = DateTime( | ||
466 | 616 | allow_none=True, default=None, tzinfo=timezone.utc | ||
467 | 617 | ) | ||
468 | 576 | 618 | ||
469 | 577 | @property | 619 | @property |
470 | 578 | def target(self): | 620 | def target(self): |
471 | @@ -584,7 +626,7 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
472 | 584 | # although it has similar semantics. | 626 | # although it has similar semantics. |
473 | 585 | return self.source_git_repository.namespace | 627 | return self.source_git_repository.namespace |
474 | 586 | 628 | ||
476 | 587 | root_message_id = StringCol(default=None) | 629 | root_message_id = Unicode(default=None) |
477 | 588 | 630 | ||
478 | 589 | @property | 631 | @property |
479 | 590 | def title(self): | 632 | def title(self): |
480 | @@ -923,10 +965,10 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
481 | 923 | self._transitionToState( | 965 | self._transitionToState( |
482 | 924 | BranchMergeProposalStatus.SUPERSEDED, registrant | 966 | BranchMergeProposalStatus.SUPERSEDED, registrant |
483 | 925 | ) | 967 | ) |
488 | 926 | # This sync update is needed as the add landing target does | 968 | # This flush is needed as the add landing target does a database |
489 | 927 | # a database query to identify if there are any active proposals | 969 | # query to identify if there are any active proposals with the same |
490 | 928 | # with the same source and target branches. | 970 | # source and target branches. |
491 | 929 | self.syncUpdate() | 971 | Store.of(self).flush() |
492 | 930 | review_requests = list( | 972 | review_requests = list( |
493 | 931 | {(vote.reviewer, vote.review_type) for vote in self.votes} | 973 | {(vote.reviewer, vote.review_type) for vote in self.votes} |
494 | 932 | ) | 974 | ) |
495 | @@ -941,10 +983,10 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
496 | 941 | ) | 983 | ) |
497 | 942 | if not break_link: | 984 | if not break_link: |
498 | 943 | self.superseded_by = proposal | 985 | self.superseded_by = proposal |
503 | 944 | # This sync update is needed to ensure that the transitive | 986 | # This flush is needed to ensure that the transitive properties of |
504 | 945 | # properties of supersedes and superseded_by are visible to | 987 | # supersedes and superseded_by are visible to the old and the new |
505 | 946 | # the old and the new proposal. | 988 | # proposal. |
506 | 947 | self.syncUpdate() | 989 | Store.of(self).flush() |
507 | 948 | return proposal | 990 | return proposal |
508 | 949 | 991 | ||
509 | 950 | def _normalizeReviewType(self, review_type): | 992 | def _normalizeReviewType(self, review_type): |
510 | @@ -1068,7 +1110,7 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
511 | 1068 | ): | 1110 | ): |
512 | 1069 | job.destroySelf() | 1111 | job.destroySelf() |
513 | 1070 | self._preview_diffs.remove() | 1112 | self._preview_diffs.remove() |
515 | 1071 | self.destroySelf() | 1113 | Store.of(self).remove(self) |
516 | 1072 | 1114 | ||
517 | 1073 | def getUnlandedSourceBranchRevisions(self): | 1115 | def getUnlandedSourceBranchRevisions(self): |
518 | 1074 | """See `IBranchMergeProposal`.""" | 1116 | """See `IBranchMergeProposal`.""" |
519 | @@ -1513,24 +1555,24 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
520 | 1513 | person_ids = set() | 1555 | person_ids = set() |
521 | 1514 | for mp in branch_merge_proposals: | 1556 | for mp in branch_merge_proposals: |
522 | 1515 | ids.add(mp.id) | 1557 | ids.add(mp.id) |
526 | 1516 | if mp.source_branchID is not None: | 1558 | if mp.source_branch_id is not None: |
527 | 1517 | source_branch_ids.add(mp.source_branchID) | 1559 | source_branch_ids.add(mp.source_branch_id) |
528 | 1518 | if mp.source_git_repositoryID is not None: | 1560 | if mp.source_git_repository_id is not None: |
529 | 1519 | git_ref_keys.add( | 1561 | git_ref_keys.add( |
531 | 1520 | (mp.source_git_repositoryID, mp.source_git_path) | 1562 | (mp.source_git_repository_id, mp.source_git_path) |
532 | 1521 | ) | 1563 | ) |
533 | 1522 | git_ref_keys.add( | 1564 | git_ref_keys.add( |
535 | 1523 | (mp.target_git_repositoryID, mp.target_git_path) | 1565 | (mp.target_git_repository_id, mp.target_git_path) |
536 | 1524 | ) | 1566 | ) |
538 | 1525 | if mp.prerequisite_git_repositoryID is not None: | 1567 | if mp.prerequisite_git_repository_id is not None: |
539 | 1526 | git_ref_keys.add( | 1568 | git_ref_keys.add( |
540 | 1527 | ( | 1569 | ( |
542 | 1528 | mp.prerequisite_git_repositoryID, | 1570 | mp.prerequisite_git_repository_id, |
543 | 1529 | mp.prerequisite_git_path, | 1571 | mp.prerequisite_git_path, |
544 | 1530 | ) | 1572 | ) |
545 | 1531 | ) | 1573 | ) |
548 | 1532 | person_ids.add(mp.registrantID) | 1574 | person_ids.add(mp.registrant_id) |
549 | 1533 | person_ids.add(mp.merge_reporterID) | 1575 | person_ids.add(mp.merge_reporter_id) |
550 | 1534 | git_repository_ids = { | 1576 | git_repository_ids = { |
551 | 1535 | repository_id for repository_id, _ in git_ref_keys | 1577 | repository_id for repository_id, _ in git_ref_keys |
552 | 1536 | } | 1578 | } |
553 | @@ -1538,15 +1580,15 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
554 | 1538 | branches = load_related( | 1580 | branches = load_related( |
555 | 1539 | Branch, | 1581 | Branch, |
556 | 1540 | branch_merge_proposals, | 1582 | branch_merge_proposals, |
558 | 1541 | ("target_branchID", "prerequisite_branchID", "source_branchID"), | 1583 | ("target_branch_id", "prerequisite_branch_id", "source_branch_id"), |
559 | 1542 | ) | 1584 | ) |
560 | 1543 | repositories = load_related( | 1585 | repositories = load_related( |
561 | 1544 | GitRepository, | 1586 | GitRepository, |
562 | 1545 | branch_merge_proposals, | 1587 | branch_merge_proposals, |
563 | 1546 | ( | 1588 | ( |
567 | 1547 | "target_git_repositoryID", | 1589 | "target_git_repository_id", |
568 | 1548 | "prerequisite_git_repositoryID", | 1590 | "prerequisite_git_repository_id", |
569 | 1549 | "source_git_repositoryID", | 1591 | "source_git_repository_id", |
570 | 1550 | ), | 1592 | ), |
571 | 1551 | ) | 1593 | ) |
572 | 1552 | load(GitRef, git_ref_keys) | 1594 | load(GitRef, git_ref_keys) |
573 | @@ -1579,9 +1621,9 @@ class BranchMergeProposal(SQLBase, BugLinkTargetMixin): | |||
574 | 1579 | # Preload other merge proposals that supersede these. | 1621 | # Preload other merge proposals that supersede these. |
575 | 1580 | supersedes_map = {} | 1622 | supersedes_map = {} |
576 | 1581 | for other_mp in load_referencing( | 1623 | for other_mp in load_referencing( |
578 | 1582 | BranchMergeProposal, branch_merge_proposals, ["superseded_byID"] | 1624 | BranchMergeProposal, branch_merge_proposals, ["superseded_by_id"] |
579 | 1583 | ): | 1625 | ): |
581 | 1584 | supersedes_map[other_mp.superseded_byID] = other_mp | 1626 | supersedes_map[other_mp.superseded_by_id] = other_mp |
582 | 1585 | for mp in branch_merge_proposals: | 1627 | for mp in branch_merge_proposals: |
583 | 1586 | get_property_cache(mp).supersedes = supersedes_map.get(mp.id) | 1628 | get_property_cache(mp).supersedes = supersedes_map.get(mp.id) |
584 | 1587 | 1629 | ||
585 | @@ -1643,7 +1685,10 @@ class BranchMergeProposalGetter: | |||
586 | 1643 | @staticmethod | 1685 | @staticmethod |
587 | 1644 | def get(id): | 1686 | def get(id): |
588 | 1645 | """See `IBranchMergeProposalGetter`.""" | 1687 | """See `IBranchMergeProposalGetter`.""" |
590 | 1646 | return BranchMergeProposal.get(id) | 1688 | mp = IStore(BranchMergeProposal).get(BranchMergeProposal, id) |
591 | 1689 | if mp is None: | ||
592 | 1690 | raise NotFoundError(id) | ||
593 | 1691 | return mp | ||
594 | 1647 | 1692 | ||
595 | 1648 | @staticmethod | 1693 | @staticmethod |
596 | 1649 | def getProposalsForContext(context, status=None, visible_by_user=None): | 1694 | def getProposalsForContext(context, status=None, visible_by_user=None): |
597 | @@ -1666,7 +1711,7 @@ class BranchMergeProposalGetter: | |||
598 | 1666 | """See `IBranchMergeProposalGetter`.""" | 1711 | """See `IBranchMergeProposalGetter`.""" |
599 | 1667 | registrant_select = Select( | 1712 | registrant_select = Select( |
600 | 1668 | BranchMergeProposal.id, | 1713 | BranchMergeProposal.id, |
602 | 1669 | BranchMergeProposal.registrantID == participant.id, | 1714 | BranchMergeProposal.registrant_id == participant.id, |
603 | 1670 | ) | 1715 | ) |
604 | 1671 | 1716 | ||
605 | 1672 | review_select = Select( | 1717 | review_select = Select( |
606 | diff --git a/lib/lp/code/model/gitcollection.py b/lib/lp/code/model/gitcollection.py | |||
607 | index 1885d75..2481410 100644 | |||
608 | --- a/lib/lp/code/model/gitcollection.py | |||
609 | +++ b/lib/lp/code/model/gitcollection.py | |||
610 | @@ -367,7 +367,7 @@ class GenericGitCollection: | |||
611 | 367 | BranchMergeProposal, | 367 | BranchMergeProposal, |
612 | 368 | And( | 368 | And( |
613 | 369 | GitRepository.id | 369 | GitRepository.id |
615 | 370 | == BranchMergeProposal.source_git_repositoryID, | 370 | == BranchMergeProposal.source_git_repository_id, |
616 | 371 | *( | 371 | *( |
617 | 372 | self._filter_expressions | 372 | self._filter_expressions |
618 | 373 | + self._asymmetric_filter_expressions | 373 | + self._asymmetric_filter_expressions |
619 | @@ -376,7 +376,7 @@ class GenericGitCollection: | |||
620 | 376 | ), | 376 | ), |
621 | 377 | Join( | 377 | Join( |
622 | 378 | Target, | 378 | Target, |
624 | 379 | Target.id == BranchMergeProposal.target_git_repositoryID, | 379 | Target.id == BranchMergeProposal.target_git_repository_id, |
625 | 380 | ), | 380 | ), |
626 | 381 | ] | 381 | ] |
627 | 382 | ) | 382 | ) |
628 | @@ -451,7 +451,8 @@ class GenericGitCollection: | |||
629 | 451 | # Need to filter on GitRepository beyond the with constraints. | 451 | # Need to filter on GitRepository beyond the with constraints. |
630 | 452 | expressions += self._asymmetric_filter_expressions | 452 | expressions += self._asymmetric_filter_expressions |
631 | 453 | expressions.append( | 453 | expressions.append( |
633 | 454 | BranchMergeProposal.source_git_repositoryID == GitRepository.id | 454 | BranchMergeProposal.source_git_repository_id |
634 | 455 | == GitRepository.id | ||
635 | 455 | ) | 456 | ) |
636 | 456 | tables.append(GitRepository) | 457 | tables.append(GitRepository) |
637 | 457 | tables.extend(self._asymmetric_tables.values()) | 458 | tables.extend(self._asymmetric_tables.values()) |
638 | @@ -507,14 +508,14 @@ class GenericGitCollection: | |||
639 | 507 | 508 | ||
640 | 508 | expressions = [ | 509 | expressions = [ |
641 | 509 | CodeReviewVoteReference.reviewer == reviewer, | 510 | CodeReviewVoteReference.reviewer == reviewer, |
643 | 510 | BranchMergeProposal.source_git_repositoryID.is_in( | 511 | BranchMergeProposal.source_git_repository_id.is_in( |
644 | 511 | self._getRepositorySelect() | 512 | self._getRepositorySelect() |
645 | 512 | ), | 513 | ), |
646 | 513 | ] | 514 | ] |
647 | 514 | visibility = self._getRepositoryVisibilityExpression() | 515 | visibility = self._getRepositoryVisibilityExpression() |
648 | 515 | if visibility: | 516 | if visibility: |
649 | 516 | expressions.append( | 517 | expressions.append( |
651 | 517 | BranchMergeProposal.target_git_repositoryID.is_in( | 518 | BranchMergeProposal.target_git_repository_id.is_in( |
652 | 518 | Select(GitRepository.id, visibility) | 519 | Select(GitRepository.id, visibility) |
653 | 519 | ) | 520 | ) |
654 | 520 | ) | 521 | ) |
655 | diff --git a/lib/lp/code/model/gitrepository.py b/lib/lp/code/model/gitrepository.py | |||
656 | index 37c5c08..8b3c3ea 100644 | |||
657 | --- a/lib/lp/code/model/gitrepository.py | |||
658 | +++ b/lib/lp/code/model/gitrepository.py | |||
659 | @@ -1417,7 +1417,7 @@ class GitRepository( | |||
660 | 1417 | } | 1417 | } |
661 | 1418 | updated = set() | 1418 | updated = set() |
662 | 1419 | for kind in ("source", "target", "prerequisite"): | 1419 | for kind in ("source", "target", "prerequisite"): |
664 | 1420 | repository_name = "%s_git_repositoryID" % kind | 1420 | repository_name = "%s_git_repository_id" % kind |
665 | 1421 | path_name = "%s_git_path" % kind | 1421 | path_name = "%s_git_path" % kind |
666 | 1422 | commit_sha1_name = "%s_git_commit_sha1" % kind | 1422 | commit_sha1_name = "%s_git_commit_sha1" % kind |
667 | 1423 | old_column = partial(getattr, BranchMergeProposal) | 1423 | old_column = partial(getattr, BranchMergeProposal) |
668 | @@ -1958,8 +1958,8 @@ class GitRepository( | |||
669 | 1958 | seen_merge_proposal_ids.add(merge_proposal.id) | 1958 | seen_merge_proposal_ids.add(merge_proposal.id) |
670 | 1959 | # Cannot use self.landing_candidates, because it ignores merged | 1959 | # Cannot use self.landing_candidates, because it ignores merged |
671 | 1960 | # merge proposals. | 1960 | # merge proposals. |
674 | 1961 | for merge_proposal in BranchMergeProposal.selectBy( | 1961 | for merge_proposal in Store.of(self).find( |
675 | 1962 | target_git_repository=self | 1962 | BranchMergeProposal, target_git_repository=self |
676 | 1963 | ): | 1963 | ): |
677 | 1964 | if merge_proposal.id not in seen_merge_proposal_ids: | 1964 | if merge_proposal.id not in seen_merge_proposal_ids: |
678 | 1965 | deletion_operations.append( | 1965 | deletion_operations.append( |
679 | @@ -1973,8 +1973,8 @@ class GitRepository( | |||
680 | 1973 | ) | 1973 | ) |
681 | 1974 | ) | 1974 | ) |
682 | 1975 | seen_merge_proposal_ids.add(merge_proposal.id) | 1975 | seen_merge_proposal_ids.add(merge_proposal.id) |
685 | 1976 | for merge_proposal in BranchMergeProposal.selectBy( | 1976 | for merge_proposal in Store.of(self).find( |
686 | 1977 | prerequisite_git_repository=self | 1977 | BranchMergeProposal, prerequisite_git_repository=self |
687 | 1978 | ): | 1978 | ): |
688 | 1979 | if merge_proposal.id not in seen_merge_proposal_ids: | 1979 | if merge_proposal.id not in seen_merge_proposal_ids: |
689 | 1980 | alteration_operations.append( | 1980 | alteration_operations.append( |
690 | diff --git a/lib/lp/code/model/tests/test_branch.py b/lib/lp/code/model/tests/test_branch.py | |||
691 | index d31581b..6ea7f28 100644 | |||
692 | --- a/lib/lp/code/model/tests/test_branch.py | |||
693 | +++ b/lib/lp/code/model/tests/test_branch.py | |||
694 | @@ -60,6 +60,7 @@ from lp.code.interfaces.branchlookup import IBranchLookup | |||
695 | 60 | from lp.code.interfaces.branchmergeproposal import ( | 60 | from lp.code.interfaces.branchmergeproposal import ( |
696 | 61 | BRANCH_MERGE_PROPOSAL_FINAL_STATES as FINAL_STATES, | 61 | BRANCH_MERGE_PROPOSAL_FINAL_STATES as FINAL_STATES, |
697 | 62 | ) | 62 | ) |
698 | 63 | from lp.code.interfaces.branchmergeproposal import IBranchMergeProposalGetter | ||
699 | 63 | from lp.code.interfaces.branchnamespace import ( | 64 | from lp.code.interfaces.branchnamespace import ( |
700 | 64 | IBranchNamespacePolicy, | 65 | IBranchNamespacePolicy, |
701 | 65 | IBranchNamespaceSet, | 66 | IBranchNamespaceSet, |
702 | @@ -87,7 +88,6 @@ from lp.code.model.branchjob import ( | |||
703 | 87 | BranchScanJob, | 88 | BranchScanJob, |
704 | 88 | ReclaimBranchSpaceJob, | 89 | ReclaimBranchSpaceJob, |
705 | 89 | ) | 90 | ) |
706 | 90 | from lp.code.model.branchmergeproposal import BranchMergeProposal | ||
707 | 91 | from lp.code.model.branchrevision import BranchRevision | 91 | from lp.code.model.branchrevision import BranchRevision |
708 | 92 | from lp.code.model.codereviewcomment import CodeReviewComment | 92 | from lp.code.model.codereviewcomment import CodeReviewComment |
709 | 93 | from lp.code.model.revision import Revision | 93 | from lp.code.model.revision import Revision |
710 | @@ -110,7 +110,6 @@ from lp.registry.tests.test_accesspolicy import get_policies_for_artifact | |||
711 | 110 | from lp.services.config import config | 110 | from lp.services.config import config |
712 | 111 | from lp.services.database.constants import UTC_NOW | 111 | from lp.services.database.constants import UTC_NOW |
713 | 112 | from lp.services.database.interfaces import IStore | 112 | from lp.services.database.interfaces import IStore |
714 | 113 | from lp.services.database.sqlobject import SQLObjectNotFound | ||
715 | 114 | from lp.services.features.testing import FeatureFixture | 113 | from lp.services.features.testing import FeatureFixture |
716 | 115 | from lp.services.job.interfaces.job import JobStatus | 114 | from lp.services.job.interfaces.job import JobStatus |
717 | 116 | from lp.services.job.runner import JobRunner | 115 | from lp.services.job.runner import JobRunner |
718 | @@ -1701,20 +1700,24 @@ class TestBranchDeletionConsequences(TestCase): | |||
719 | 1701 | """Merge proposal source branches can be deleted with break_links.""" | 1700 | """Merge proposal source branches can be deleted with break_links.""" |
720 | 1702 | merge_proposal1, merge_proposal2 = self.makeMergeProposals() | 1701 | merge_proposal1, merge_proposal2 = self.makeMergeProposals() |
721 | 1703 | merge_proposal1_id = merge_proposal1.id | 1702 | merge_proposal1_id = merge_proposal1.id |
723 | 1704 | BranchMergeProposal.get(merge_proposal1_id) | 1703 | getUtility(IBranchMergeProposalGetter).get(merge_proposal1_id) |
724 | 1705 | self.branch.destroySelf(break_references=True) | 1704 | self.branch.destroySelf(break_references=True) |
725 | 1706 | self.assertRaises( | 1705 | self.assertRaises( |
727 | 1707 | SQLObjectNotFound, BranchMergeProposal.get, merge_proposal1_id | 1706 | NotFoundError, |
728 | 1707 | getUtility(IBranchMergeProposalGetter).get, | ||
729 | 1708 | merge_proposal1_id, | ||
730 | 1708 | ) | 1709 | ) |
731 | 1709 | 1710 | ||
732 | 1710 | def test_deleteMergeProposalTarget(self): | 1711 | def test_deleteMergeProposalTarget(self): |
733 | 1711 | """Merge proposal target branches can be deleted with break_links.""" | 1712 | """Merge proposal target branches can be deleted with break_links.""" |
734 | 1712 | merge_proposal1, merge_proposal2 = self.makeMergeProposals() | 1713 | merge_proposal1, merge_proposal2 = self.makeMergeProposals() |
735 | 1713 | merge_proposal1_id = merge_proposal1.id | 1714 | merge_proposal1_id = merge_proposal1.id |
737 | 1714 | BranchMergeProposal.get(merge_proposal1_id) | 1715 | getUtility(IBranchMergeProposalGetter).get(merge_proposal1_id) |
738 | 1715 | merge_proposal1.target_branch.destroySelf(break_references=True) | 1716 | merge_proposal1.target_branch.destroySelf(break_references=True) |
739 | 1716 | self.assertRaises( | 1717 | self.assertRaises( |
741 | 1717 | SQLObjectNotFound, BranchMergeProposal.get, merge_proposal1_id | 1718 | NotFoundError, |
742 | 1719 | getUtility(IBranchMergeProposalGetter).get, | ||
743 | 1720 | merge_proposal1_id, | ||
744 | 1718 | ) | 1721 | ) |
745 | 1719 | 1722 | ||
746 | 1720 | def test_deleteMergeProposalDependent(self): | 1723 | def test_deleteMergeProposalDependent(self): |
747 | diff --git a/lib/lp/code/model/tests/test_gitrepository.py b/lib/lp/code/model/tests/test_gitrepository.py | |||
748 | index f74776f..057c80a 100644 | |||
749 | --- a/lib/lp/code/model/tests/test_gitrepository.py | |||
750 | +++ b/lib/lp/code/model/tests/test_gitrepository.py | |||
751 | @@ -76,6 +76,7 @@ from lp.code.event.git import GitRefsUpdatedEvent | |||
752 | 76 | from lp.code.interfaces.branchmergeproposal import ( | 76 | from lp.code.interfaces.branchmergeproposal import ( |
753 | 77 | BRANCH_MERGE_PROPOSAL_FINAL_STATES as FINAL_STATES, | 77 | BRANCH_MERGE_PROPOSAL_FINAL_STATES as FINAL_STATES, |
754 | 78 | ) | 78 | ) |
755 | 79 | from lp.code.interfaces.branchmergeproposal import IBranchMergeProposalGetter | ||
756 | 79 | from lp.code.interfaces.cibuild import ( | 80 | from lp.code.interfaces.cibuild import ( |
757 | 80 | CI_WEBHOOKS_FEATURE_FLAG, | 81 | CI_WEBHOOKS_FEATURE_FLAG, |
758 | 81 | ICIBuild, | 82 | ICIBuild, |
759 | @@ -103,7 +104,6 @@ from lp.code.interfaces.revisionstatus import ( | |||
760 | 103 | IRevisionStatusArtifactSet, | 104 | IRevisionStatusArtifactSet, |
761 | 104 | IRevisionStatusReportSet, | 105 | IRevisionStatusReportSet, |
762 | 105 | ) | 106 | ) |
763 | 106 | from lp.code.model.branchmergeproposal import BranchMergeProposal | ||
764 | 107 | from lp.code.model.branchmergeproposaljob import ( | 107 | from lp.code.model.branchmergeproposaljob import ( |
765 | 108 | BranchMergeProposalJob, | 108 | BranchMergeProposalJob, |
766 | 109 | BranchMergeProposalJobType, | 109 | BranchMergeProposalJobType, |
767 | @@ -156,7 +156,6 @@ from lp.services.config import config | |||
768 | 156 | from lp.services.database.constants import UTC_NOW | 156 | from lp.services.database.constants import UTC_NOW |
769 | 157 | from lp.services.database.interfaces import IStore | 157 | from lp.services.database.interfaces import IStore |
770 | 158 | from lp.services.database.sqlbase import get_transaction_timestamp | 158 | from lp.services.database.sqlbase import get_transaction_timestamp |
771 | 159 | from lp.services.database.sqlobject import SQLObjectNotFound | ||
772 | 160 | from lp.services.features.testing import FeatureFixture | 159 | from lp.services.features.testing import FeatureFixture |
773 | 161 | from lp.services.identity.interfaces.account import AccountStatus | 160 | from lp.services.identity.interfaces.account import AccountStatus |
774 | 162 | from lp.services.job.interfaces.job import JobStatus | 161 | from lp.services.job.interfaces.job import JobStatus |
775 | @@ -1553,10 +1552,12 @@ class TestGitRepositoryDeletionConsequences(TestCaseWithFactory): | |||
776 | 1553 | # break_references. | 1552 | # break_references. |
777 | 1554 | merge_proposal1, merge_proposal2 = self.makeMergeProposals() | 1553 | merge_proposal1, merge_proposal2 = self.makeMergeProposals() |
778 | 1555 | merge_proposal1_id = merge_proposal1.id | 1554 | merge_proposal1_id = merge_proposal1.id |
780 | 1556 | BranchMergeProposal.get(merge_proposal1_id) | 1555 | getUtility(IBranchMergeProposalGetter).get(merge_proposal1_id) |
781 | 1557 | self.repository.destroySelf(break_references=True) | 1556 | self.repository.destroySelf(break_references=True) |
782 | 1558 | self.assertRaises( | 1557 | self.assertRaises( |
784 | 1559 | SQLObjectNotFound, BranchMergeProposal.get, merge_proposal1_id | 1558 | NotFoundError, |
785 | 1559 | getUtility(IBranchMergeProposalGetter).get, | ||
786 | 1560 | merge_proposal1_id, | ||
787 | 1560 | ) | 1561 | ) |
788 | 1561 | 1562 | ||
789 | 1562 | def test_delete_merge_proposal_target(self): | 1563 | def test_delete_merge_proposal_target(self): |
790 | @@ -1564,12 +1565,14 @@ class TestGitRepositoryDeletionConsequences(TestCaseWithFactory): | |||
791 | 1564 | # break_references. | 1565 | # break_references. |
792 | 1565 | merge_proposal1, merge_proposal2 = self.makeMergeProposals() | 1566 | merge_proposal1, merge_proposal2 = self.makeMergeProposals() |
793 | 1566 | merge_proposal1_id = merge_proposal1.id | 1567 | merge_proposal1_id = merge_proposal1.id |
795 | 1567 | BranchMergeProposal.get(merge_proposal1_id) | 1568 | getUtility(IBranchMergeProposalGetter).get(merge_proposal1_id) |
796 | 1568 | merge_proposal1.target_git_repository.destroySelf( | 1569 | merge_proposal1.target_git_repository.destroySelf( |
797 | 1569 | break_references=True | 1570 | break_references=True |
798 | 1570 | ) | 1571 | ) |
799 | 1571 | self.assertRaises( | 1572 | self.assertRaises( |
801 | 1572 | SQLObjectNotFound, BranchMergeProposal.get, merge_proposal1_id | 1573 | NotFoundError, |
802 | 1574 | getUtility(IBranchMergeProposalGetter).get, | ||
803 | 1575 | merge_proposal1_id, | ||
804 | 1573 | ) | 1576 | ) |
805 | 1574 | 1577 | ||
806 | 1575 | def test_delete_merge_proposal_prerequisite(self): | 1578 | def test_delete_merge_proposal_prerequisite(self): |
807 | @@ -1728,7 +1731,9 @@ class TestGitRepositoryDeletionConsequences(TestCaseWithFactory): | |||
808 | 1728 | merge_proposal, "blah", merge_proposal.deleteProposal | 1731 | merge_proposal, "blah", merge_proposal.deleteProposal |
809 | 1729 | )() | 1732 | )() |
810 | 1730 | self.assertRaises( | 1733 | self.assertRaises( |
812 | 1731 | SQLObjectNotFound, BranchMergeProposal.get, merge_proposal_id | 1734 | NotFoundError, |
813 | 1735 | getUtility(IBranchMergeProposalGetter).get, | ||
814 | 1736 | merge_proposal_id, | ||
815 | 1732 | ) | 1737 | ) |
816 | 1733 | 1738 | ||
817 | 1734 | def test_DeleteCodeImport(self): | 1739 | def test_DeleteCodeImport(self): |
LGTM 👍