Merge lp:~mwhudson/launchpad/no-hosted-area-scanner-tests into lp:launchpad/db-devel
- no-hosted-area-scanner-tests
- Merge into db-devel
Proposed by
Michael Hudson-Doyle
Status: | Merged |
---|---|
Approved by: | Michael Hudson-Doyle |
Approved revision: | no longer in the source branch. |
Merged at revision: | not available |
Proposed branch: | lp:~mwhudson/launchpad/no-hosted-area-scanner-tests |
Merge into: | lp:launchpad/db-devel |
Prerequisite: | lp:~mwhudson/launchpad/no-hosted-area-fix-useBzrBranch-users |
Diff against target: |
299 lines (+20/-137) 5 files modified
lib/lp/code/stories/branches/xx-branch-mirror-failures.txt (+3/-1) lib/lp/codehosting/scanner/bzrsync.py (+0/-33) lib/lp/codehosting/scanner/tests/test_buglinks.py (+1/-1) lib/lp/codehosting/scanner/tests/test_bzrsync.py (+14/-100) lib/lp/codehosting/scanner/tests/test_email.py (+2/-2) |
To merge this branch: | bzr merge lp:~mwhudson/launchpad/no-hosted-area-scanner-tests |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Tim Penhey (community) | conditional | Approve | |
Review via email: mp+24097@code.launchpad.net |
Commit message
Description of the change
Hi Tim,
This branch fixes the tests of the scanner, mostly by deleting obsolete code.
Cheers,
mwh
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 | === modified file 'lib/lp/code/stories/branches/xx-branch-mirror-failures.txt' | |||
2 | --- lib/lp/code/stories/branches/xx-branch-mirror-failures.txt 2010-04-27 02:23:41 +0000 | |||
3 | +++ lib/lp/code/stories/branches/xx-branch-mirror-failures.txt 2010-04-27 02:23:46 +0000 | |||
4 | @@ -163,7 +163,9 @@ | |||
5 | 163 | >>> login(ANONYMOUS) | 163 | >>> login(ANONYMOUS) |
6 | 164 | >>> mirror_branch = getUtility(IBranchLookup).getByUniqueName(mirror_name) | 164 | >>> mirror_branch = getUtility(IBranchLookup).getByUniqueName(mirror_name) |
7 | 165 | >>> mirror_branch.startMirroring() | 165 | >>> mirror_branch.startMirroring() |
9 | 166 | >>> mirror_branch.branchChanged('', 'some-revision-id', None, None, None) | 166 | >>> from zope.security.proxy import removeSecurityProxy |
10 | 167 | >>> removeSecurityProxy(mirror_branch).branchChanged( | ||
11 | 168 | ... '', 'some-revision-id', None, None, None) | ||
12 | 167 | >>> logout() | 169 | >>> logout() |
13 | 168 | 170 | ||
14 | 169 | >>> browser.open(branch_location) | 171 | >>> browser.open(branch_location) |
15 | 170 | 172 | ||
16 | === modified file 'lib/lp/codehosting/scanner/bzrsync.py' | |||
17 | --- lib/lp/codehosting/scanner/bzrsync.py 2010-04-27 02:23:41 +0000 | |||
18 | +++ lib/lp/codehosting/scanner/bzrsync.py 2010-04-27 02:23:46 +0000 | |||
19 | @@ -21,14 +21,8 @@ | |||
20 | 21 | from zope.component import getUtility | 21 | from zope.component import getUtility |
21 | 22 | from zope.event import notify | 22 | from zope.event import notify |
22 | 23 | 23 | ||
23 | 24 | from bzrlib import urlutils | ||
24 | 25 | |||
25 | 26 | from lazr.uri import URI | ||
26 | 27 | |||
27 | 28 | from lp.codehosting import iter_list_chunks | 24 | from lp.codehosting import iter_list_chunks |
28 | 29 | from lp.codehosting.puller.worker import BranchMirrorer | ||
29 | 30 | from lp.codehosting.scanner import events | 25 | from lp.codehosting.scanner import events |
30 | 31 | from lp.codehosting.vfs.branchfs import BranchPolicy | ||
31 | 32 | from lp.code.interfaces.branchjob import IRosettaUploadJobSource | 26 | from lp.code.interfaces.branchjob import IRosettaUploadJobSource |
32 | 33 | from lp.code.interfaces.branchrevision import IBranchRevisionSet | 27 | from lp.code.interfaces.branchrevision import IBranchRevisionSet |
33 | 34 | from lp.code.interfaces.revision import IRevisionSet | 28 | from lp.code.interfaces.revision import IRevisionSet |
34 | @@ -38,33 +32,6 @@ | |||
35 | 38 | UTC = pytz.timezone('UTC') | 32 | UTC = pytz.timezone('UTC') |
36 | 39 | 33 | ||
37 | 40 | 34 | ||
38 | 41 | class InvalidStackedBranchURL(Exception): | ||
39 | 42 | """Raised when we try to scan a branch stacked on an invalid URL.""" | ||
40 | 43 | |||
41 | 44 | |||
42 | 45 | class WarehouseBranchPolicy(BranchPolicy): | ||
43 | 46 | |||
44 | 47 | def checkOneURL(self, url): | ||
45 | 48 | """See `BranchOpener.checkOneURL`. | ||
46 | 49 | |||
47 | 50 | If the URLs we are mirroring from are anything but a | ||
48 | 51 | lp-mirrored:///~user/project/branch URLs, we don't want to scan them. | ||
49 | 52 | Opening branches on remote systems takes too long, and we want all of | ||
50 | 53 | our local access to be channelled through this transport. | ||
51 | 54 | """ | ||
52 | 55 | uri = URI(url) | ||
53 | 56 | if uri.scheme != 'lp-mirrored': | ||
54 | 57 | raise InvalidStackedBranchURL(url) | ||
55 | 58 | |||
56 | 59 | def transformFallbackLocation(self, branch, url): | ||
57 | 60 | """See `BranchPolicy.transformFallbackLocation`. | ||
58 | 61 | |||
59 | 62 | We're happy to open stacked branches in the usual manner, but want to | ||
60 | 63 | go on checking the URLs of any branches we then open. | ||
61 | 64 | """ | ||
62 | 65 | return urlutils.join(branch.base, url), True | ||
63 | 66 | |||
64 | 67 | |||
65 | 68 | class BzrSync: | 35 | class BzrSync: |
66 | 69 | """Import version control metadata from a Bazaar branch into the database. | 36 | """Import version control metadata from a Bazaar branch into the database. |
67 | 70 | """ | 37 | """ |
68 | 71 | 38 | ||
69 | === modified file 'lib/lp/codehosting/scanner/tests/test_buglinks.py' | |||
70 | --- lib/lp/codehosting/scanner/tests/test_buglinks.py 2010-03-02 18:56:25 +0000 | |||
71 | +++ lib/lp/codehosting/scanner/tests/test_buglinks.py 2010-04-27 02:23:46 +0000 | |||
72 | @@ -246,7 +246,7 @@ | |||
73 | 246 | 246 | ||
74 | 247 | def test_got_new_revision_subscribed(self): | 247 | def test_got_new_revision_subscribed(self): |
75 | 248 | """got_new_revision is subscribed to NewRevision.""" | 248 | """got_new_revision is subscribed to NewRevision.""" |
77 | 249 | self.useBzrBranches() | 249 | self.useBzrBranches(direct_database=True) |
78 | 250 | db_branch, tree = self.create_branch_and_tree() | 250 | db_branch, tree = self.create_branch_and_tree() |
79 | 251 | bug = self.factory.makeBug() | 251 | bug = self.factory.makeBug() |
80 | 252 | self.layer.txn.commit() | 252 | self.layer.txn.commit() |
81 | 253 | 253 | ||
82 | === modified file 'lib/lp/codehosting/scanner/tests/test_bzrsync.py' | |||
83 | --- lib/lp/codehosting/scanner/tests/test_bzrsync.py 2010-04-27 02:23:41 +0000 | |||
84 | +++ lib/lp/codehosting/scanner/tests/test_bzrsync.py 2010-04-27 02:23:46 +0000 | |||
85 | @@ -13,9 +13,6 @@ | |||
86 | 13 | import unittest | 13 | import unittest |
87 | 14 | 14 | ||
88 | 15 | from bzrlib.revision import NULL_REVISION, Revision as BzrRevision | 15 | from bzrlib.revision import NULL_REVISION, Revision as BzrRevision |
89 | 16 | from bzrlib.transport import ( | ||
90 | 17 | get_transport, register_transport, unregister_transport) | ||
91 | 18 | from bzrlib.transport.chroot import ChrootServer | ||
92 | 19 | from bzrlib.uncommit import uncommit | 16 | from bzrlib.uncommit import uncommit |
93 | 20 | from bzrlib.tests import TestCaseWithTransport | 17 | from bzrlib.tests import TestCaseWithTransport |
94 | 21 | import pytz | 18 | import pytz |
95 | @@ -32,9 +29,8 @@ | |||
96 | 32 | from lp.code.model.branchrevision import BranchRevision | 29 | from lp.code.model.branchrevision import BranchRevision |
97 | 33 | from lp.code.model.branchmergeproposaljob import IUpdatePreviewDiffJobSource | 30 | from lp.code.model.branchmergeproposaljob import IUpdatePreviewDiffJobSource |
98 | 34 | from lp.code.model.revision import Revision, RevisionAuthor, RevisionParent | 31 | from lp.code.model.revision import Revision, RevisionAuthor, RevisionParent |
102 | 35 | from lp.codehosting.scanner.bzrsync import ( | 32 | from lp.codehosting.scanner.bzrsync import BzrSync |
103 | 36 | BzrSync, InvalidStackedBranchURL) | 33 | from lp.testing import TestCaseWithFactory |
101 | 37 | from lp.testing.factory import LaunchpadObjectFactory | ||
104 | 38 | from canonical.testing import LaunchpadZopelessLayer | 34 | from canonical.testing import LaunchpadZopelessLayer |
105 | 39 | 35 | ||
106 | 40 | 36 | ||
107 | @@ -55,44 +51,7 @@ | |||
108 | 55 | return _run_with_different_user | 51 | return _run_with_different_user |
109 | 56 | 52 | ||
110 | 57 | 53 | ||
149 | 58 | class FakeTransportServer: | 54 | class BzrSyncTestCase(TestCaseWithTransport, TestCaseWithFactory): |
112 | 59 | """Set up a fake transport at a given URL prefix. | ||
113 | 60 | |||
114 | 61 | For testing purposes. | ||
115 | 62 | """ | ||
116 | 63 | |||
117 | 64 | def __init__(self, transport, url_prefix='lp-mirrored:///'): | ||
118 | 65 | """Constructor. | ||
119 | 66 | |||
120 | 67 | :param transport: The backing transport to store the data with. | ||
121 | 68 | :param url_prefix: The URL prefix to access this transport. | ||
122 | 69 | """ | ||
123 | 70 | self._transport = transport | ||
124 | 71 | self._url_prefix = url_prefix | ||
125 | 72 | self._chroot_server = None | ||
126 | 73 | |||
127 | 74 | def start_server(self): | ||
128 | 75 | """Activate the transport URL.""" | ||
129 | 76 | # The scanner tests assume that branches live on a Launchpad virtual | ||
130 | 77 | # filesystem rooted at 'lp-mirrored:///'. Rather than provide the | ||
131 | 78 | # entire virtual filesystem here, we fake it by having a chrooted | ||
132 | 79 | # transport do the work. | ||
133 | 80 | register_transport(self._url_prefix, self._transportFactory) | ||
134 | 81 | self._chroot_server = ChrootServer(self._transport) | ||
135 | 82 | self._chroot_server.start_server() | ||
136 | 83 | |||
137 | 84 | def stop_server(self): | ||
138 | 85 | """Deactivate the transport URL.""" | ||
139 | 86 | self._chroot_server.stop_server() | ||
140 | 87 | unregister_transport(self._url_prefix, self._transportFactory) | ||
141 | 88 | |||
142 | 89 | def _transportFactory(self, url): | ||
143 | 90 | assert url.startswith(self._url_prefix) | ||
144 | 91 | url = self._chroot_server.get_url() + url[len(self._url_prefix):] | ||
145 | 92 | return get_transport(url) | ||
146 | 93 | |||
147 | 94 | |||
148 | 95 | class BzrSyncTestCase(TestCaseWithTransport): | ||
150 | 96 | """Common base for BzrSync test cases.""" | 55 | """Common base for BzrSync test cases.""" |
151 | 97 | 56 | ||
152 | 98 | layer = LaunchpadZopelessLayer | 57 | layer = LaunchpadZopelessLayer |
153 | @@ -101,21 +60,17 @@ | |||
154 | 101 | 60 | ||
155 | 102 | def setUp(self): | 61 | def setUp(self): |
156 | 103 | TestCaseWithTransport.setUp(self) | 62 | TestCaseWithTransport.setUp(self) |
158 | 104 | self.factory = LaunchpadObjectFactory() | 63 | TestCaseWithFactory.setUp(self) |
159 | 64 | self.disable_directory_isolation() | ||
160 | 65 | self.useBzrBranches(direct_database=True) | ||
161 | 66 | self.lp_db_user = config.launchpad.dbuser | ||
162 | 105 | self.makeFixtures() | 67 | self.makeFixtures() |
163 | 106 | self.lp_db_user = config.launchpad.dbuser | ||
164 | 107 | LaunchpadZopelessLayer.switchDbUser(config.branchscanner.dbuser) | 68 | LaunchpadZopelessLayer.switchDbUser(config.branchscanner.dbuser) |
165 | 108 | # The lp-mirrored transport is set up by the branch_scanner module. | ||
166 | 109 | # Here we set up a fake so that we can test without worrying about | ||
167 | 110 | # authservers and the like. | ||
168 | 111 | server = FakeTransportServer(self.get_transport()) | ||
169 | 112 | server.start_server() | ||
170 | 113 | self.addCleanup(server.stop_server) | ||
171 | 114 | 69 | ||
172 | 115 | def makeFixtures(self): | 70 | def makeFixtures(self): |
173 | 116 | """Makes test fixtures before we switch to the scanner db user.""" | 71 | """Makes test fixtures before we switch to the scanner db user.""" |
176 | 117 | self.db_branch = self.makeDatabaseBranch() | 72 | self.db_branch, self.bzr_tree = self.create_branch_and_tree( |
177 | 118 | self.bzr_tree = self.makeBzrBranchAndTree(self.db_branch) | 73 | db_branch=self.makeDatabaseBranch()) |
178 | 119 | self.bzr_branch = self.bzr_tree.branch | 74 | self.bzr_branch = self.bzr_tree.branch |
179 | 120 | 75 | ||
180 | 121 | def syncBazaarBranchToDatabase(self, bzr_branch, db_branch): | 76 | def syncBazaarBranchToDatabase(self, bzr_branch, db_branch): |
181 | @@ -123,11 +78,6 @@ | |||
182 | 123 | syncer = self.makeBzrSync(db_branch) | 78 | syncer = self.makeBzrSync(db_branch) |
183 | 124 | syncer.syncBranchAndClose(bzr_branch) | 79 | syncer.syncBranchAndClose(bzr_branch) |
184 | 125 | 80 | ||
185 | 126 | def makeBzrBranchAndTree(self, db_branch, format=None): | ||
186 | 127 | """Make a Bazaar branch at the warehouse location of `db_branch`.""" | ||
187 | 128 | self.get_transport(db_branch.unique_name).create_prefix() | ||
188 | 129 | return self.make_branch_and_tree(db_branch.unique_name, format=format) | ||
189 | 130 | |||
190 | 131 | def makeDatabaseBranch(self, *args, **kwargs): | 81 | def makeDatabaseBranch(self, *args, **kwargs): |
191 | 132 | """Make an arbitrary branch in the database.""" | 82 | """Make an arbitrary branch in the database.""" |
192 | 133 | LaunchpadZopelessLayer.txn.begin() | 83 | LaunchpadZopelessLayer.txn.begin() |
193 | @@ -248,12 +198,14 @@ | |||
194 | 248 | 198 | ||
195 | 249 | # Make the base revision. | 199 | # Make the base revision. |
196 | 250 | db_branch = self.makeDatabaseBranch() | 200 | db_branch = self.makeDatabaseBranch() |
198 | 251 | trunk_tree = self.makeBzrBranchAndTree(db_branch) | 201 | db_branch, trunk_tree = self.create_branch_and_tree( |
199 | 202 | db_branch=db_branch) | ||
200 | 252 | trunk_tree.commit(u'base revision', rev_id=base_rev_id) | 203 | trunk_tree.commit(u'base revision', rev_id=base_rev_id) |
201 | 253 | 204 | ||
202 | 254 | # Branch from the base revision. | 205 | # Branch from the base revision. |
203 | 255 | new_db_branch = self.makeDatabaseBranch(product=db_branch.product) | 206 | new_db_branch = self.makeDatabaseBranch(product=db_branch.product) |
205 | 256 | branch_tree = self.makeBzrBranchAndTree(new_db_branch) | 207 | new_db_branch, branch_tree = self.create_branch_and_tree( |
206 | 208 | db_branch=new_db_branch) | ||
207 | 257 | branch_tree.pull(trunk_tree.branch) | 209 | branch_tree.pull(trunk_tree.branch) |
208 | 258 | 210 | ||
209 | 259 | # Commit to both branches. | 211 | # Commit to both branches. |
210 | @@ -517,7 +469,7 @@ | |||
211 | 517 | (branch_revision.revision.revision_id, branch_revision.id) | 469 | (branch_revision.revision.revision_id, branch_revision.id) |
212 | 518 | for branch_revision in sampledata) | 470 | for branch_revision in sampledata) |
213 | 519 | 471 | ||
215 | 520 | self.makeBzrBranchAndTree(branch) | 472 | self.create_branch_and_tree(db_branch=branch) |
216 | 521 | 473 | ||
217 | 522 | bzrsync = self.makeBzrSync(branch) | 474 | bzrsync = self.makeBzrSync(branch) |
218 | 523 | db_ancestry, db_history, db_branch_revision_map = ( | 475 | db_ancestry, db_history, db_branch_revision_map = ( |
219 | @@ -527,37 +479,6 @@ | |||
220 | 527 | self.assertEqual(expected_mapping, db_branch_revision_map) | 479 | self.assertEqual(expected_mapping, db_branch_revision_map) |
221 | 528 | 480 | ||
222 | 529 | 481 | ||
223 | 530 | class TestScanStackedBranches(BzrSyncTestCase): | ||
224 | 531 | """Tests for scanning stacked branches.""" | ||
225 | 532 | |||
226 | 533 | @run_as_db_user(config.launchpad.dbuser) | ||
227 | 534 | def testStackedBranchBadURL(self): | ||
228 | 535 | # The scanner will raise an InvalidStackedBranchURL when it tries to | ||
229 | 536 | # open a branch stacked on a non- lp-mirrored:// schema. | ||
230 | 537 | db_branch = self.makeDatabaseBranch() | ||
231 | 538 | stacked_on_branch = self.make_branch('stacked-on', format='1.6') | ||
232 | 539 | self.assertFalse(stacked_on_branch.base.startswith('lp-mirrored://')) | ||
233 | 540 | bzr_tree = self.makeBzrBranchAndTree(db_branch, format='1.6') | ||
234 | 541 | bzr_tree.branch.set_stacked_on_url(stacked_on_branch.base) | ||
235 | 542 | scanner = self.makeBzrSync(db_branch) | ||
236 | 543 | self.assertRaises(InvalidStackedBranchURL, scanner.syncBranchAndClose) | ||
237 | 544 | |||
238 | 545 | @run_as_db_user(config.launchpad.dbuser) | ||
239 | 546 | def testStackedBranch(self): | ||
240 | 547 | # We can scan a stacked branch that's stacked on a branch that has an | ||
241 | 548 | # lp-mirrored:// URL. | ||
242 | 549 | db_stacked_on_branch = self.factory.makeAnyBranch() | ||
243 | 550 | self.makeBzrBranchAndTree(db_stacked_on_branch, format='1.6') | ||
244 | 551 | db_stacked_branch = self.factory.makeAnyBranch() | ||
245 | 552 | stacked_tree = self.makeBzrBranchAndTree( | ||
246 | 553 | db_stacked_branch, format='1.6') | ||
247 | 554 | stacked_tree.branch.set_stacked_on_url( | ||
248 | 555 | 'lp-mirrored:///%s' % db_stacked_on_branch.unique_name) | ||
249 | 556 | scanner = self.makeBzrSync(db_stacked_branch) | ||
250 | 557 | # This does not raise an exception. | ||
251 | 558 | scanner.syncBranchAndClose() | ||
252 | 559 | |||
253 | 560 | |||
254 | 561 | class TestBzrSyncOneRevision(BzrSyncTestCase): | 482 | class TestBzrSyncOneRevision(BzrSyncTestCase): |
255 | 562 | """Tests for `BzrSync.syncOneRevision`.""" | 483 | """Tests for `BzrSync.syncOneRevision`.""" |
256 | 563 | 484 | ||
257 | @@ -594,9 +515,6 @@ | |||
258 | 594 | class TestBzrTranslationsUploadJob(BzrSyncTestCase): | 515 | class TestBzrTranslationsUploadJob(BzrSyncTestCase): |
259 | 595 | """Tests BzrSync support for generating TranslationsUploadJobs.""" | 516 | """Tests BzrSync support for generating TranslationsUploadJobs.""" |
260 | 596 | 517 | ||
261 | 597 | def setUp(self): | ||
262 | 598 | BzrSyncTestCase.setUp(self) | ||
263 | 599 | |||
264 | 600 | def _makeProductSeries(self, mode = None): | 518 | def _makeProductSeries(self, mode = None): |
265 | 601 | """Switch to the Launchpad db user to create and configure a | 519 | """Switch to the Launchpad db user to create and configure a |
266 | 602 | product series that is linked to the the branch. | 520 | product series that is linked to the the branch. |
267 | @@ -647,10 +565,6 @@ | |||
268 | 647 | class TestUpdatePreviewDiffJob(BzrSyncTestCase): | 565 | class TestUpdatePreviewDiffJob(BzrSyncTestCase): |
269 | 648 | """Test the scheduling of jobs to update preview diffs.""" | 566 | """Test the scheduling of jobs to update preview diffs.""" |
270 | 649 | 567 | ||
271 | 650 | def setUp(self): | ||
272 | 651 | """Set up `schedule_diff_updates` to handle tip changes.""" | ||
273 | 652 | BzrSyncTestCase.setUp(self) | ||
274 | 653 | |||
275 | 654 | @run_as_db_user(config.launchpad.dbuser) | 568 | @run_as_db_user(config.launchpad.dbuser) |
276 | 655 | def test_create_on_new_revision(self): | 569 | def test_create_on_new_revision(self): |
277 | 656 | """When branch tip changes, a job is created.""" | 570 | """When branch tip changes, a job is created.""" |
278 | 657 | 571 | ||
279 | === modified file 'lib/lp/codehosting/scanner/tests/test_email.py' | |||
280 | --- lib/lp/codehosting/scanner/tests/test_email.py 2010-02-26 21:40:42 +0000 | |||
281 | +++ lib/lp/codehosting/scanner/tests/test_email.py 2010-04-27 02:23:46 +0000 | |||
282 | @@ -142,7 +142,7 @@ | |||
283 | 142 | 142 | ||
284 | 143 | def test_queue_tip_changed_email_jobs_subscribed(self): | 143 | def test_queue_tip_changed_email_jobs_subscribed(self): |
285 | 144 | """A queue_tip_changed_email_jobs is run when TipChanged emitted.""" | 144 | """A queue_tip_changed_email_jobs is run when TipChanged emitted.""" |
287 | 145 | self.useBzrBranches() | 145 | self.useBzrBranches(direct_database=True) |
288 | 146 | db_branch, tree = self.create_branch_and_tree() | 146 | db_branch, tree = self.create_branch_and_tree() |
289 | 147 | db_branch.subscribe( | 147 | db_branch.subscribe( |
290 | 148 | db_branch.registrant, | 148 | db_branch.registrant, |
291 | @@ -155,7 +155,7 @@ | |||
292 | 155 | 155 | ||
293 | 156 | def test_send_removed_revision_emails_subscribed(self): | 156 | def test_send_removed_revision_emails_subscribed(self): |
294 | 157 | """send_removed_revision_emails run when RevisionsRemoved emitted.""" | 157 | """send_removed_revision_emails run when RevisionsRemoved emitted.""" |
296 | 158 | self.useBzrBranches() | 158 | self.useBzrBranches(direct_database=True) |
297 | 159 | db_branch, tree = self.create_branch_and_tree() | 159 | db_branch, tree = self.create_branch_and_tree() |
298 | 160 | db_branch.subscribe( | 160 | db_branch.subscribe( |
299 | 161 | db_branch.registrant, | 161 | db_branch.registrant, |
lib/lp/ codehosting/ scanner/ tests/test_ bzrsync. py
def makeFixtures(self): seBranch( ), just before branch_ and_tree. I'm pretty sure you can delete
- assigns self.db_branch to self.makeDataba
calling self.create_
the first one.
That's all for this one.