Merge lp:~jtv/launchpad/db-bug-788526 into lp:launchpad/db-devel

Proposed by Jeroen T. Vermeulen
Status: Merged
Approved by: Jeroen T. Vermeulen
Approved revision: no longer in the source branch.
Merged at revision: 10610
Proposed branch: lp:~jtv/launchpad/db-bug-788526
Merge into: lp:launchpad/db-devel
Diff against target: 455 lines (+233/-31)
6 files modified
lib/lp/registry/browser/distroseries.py (+52/-17)
lib/lp/registry/browser/tests/test_distroseries.py (+69/-0)
lib/lp/registry/templates/distroseries-localdifferences.pt (+6/-5)
lib/lp/soyuz/interfaces/distributionjob.py (+11/-0)
lib/lp/soyuz/model/distroseriesdifferencejob.py (+27/-1)
lib/lp/soyuz/tests/test_distroseriesdifferencejob.py (+68/-8)
To merge this branch: bzr merge lp:~jtv/launchpad/db-bug-788526
Reviewer Review Type Date Requested Status
Abel Deuring (community) code Approve
Review via email: mp+62623@code.launchpad.net

Commit message

[r=adeuring] Show updating as well as synchronizing DSDs in the UI.

Description of the change

= Summary =

When a DistroSeriesDifference on the DistroSeries:+localpackagediffs page is waiting for a sync to be completed, it is marked with "updating..."

We want that for pending DSD updates as well.

== Proposed fix ==

Very similar to what we already do for the package-copy jobs (the package syncs): add a "find jobs relevant to these DSDs" method to the job source. Call it once from a cachedproperty on the view, for the entire batch. Have a simple lookup method on the view to see whether a given DSD has jobs pending.

This was also a nice opportunity to decisions from TAL to the view class. I added a view method that computes the new string (and note that a DSD may be syncing and updating at the same time).

== Pre-implementation notes ==

Discussed with Julian. Note that a pending DSD update should not stop the user from requesting a sync for that DSD. In that respect this change differs from the one for pending syncs.

== Implementation details ==

I cleaned up some "if/elif/elif" code in cached_differences, replacing it with a dict. One of the items in the code was a bit irregular (a mono-tuple instead of an item, which in this case looks like it does the same thing) but I was too lazy to check whether that could be cleaned up as well. I left it in.

The set_derived_series_difference_jobs_feature_flag in lib/lp/registry/browser/tests/test_distroseries.py conforms to other similar functions right above it in the same module.

In lib/lp/soyuz/tests.test_distroseriesdifference.py I found a few test methods that were wrongly named so that they weren't run as tests. (Probably my fault; I've caught myself doing that a few times. I've made it a point to watch tests fail before I start making them succeed.) One needed a change to the test, but not one with any semantic implications. Otherwise, no surprises.

Something I kept running into is that DistroSeriesDifferenceJobs are not aware of multi-parent derived series yet. That change is going to affect this code in several places.

== Tests ==

{{{
./bin/test -vvc lp.registry.browser.tests.test_distroseries
./bin/test -vvc lp.soyuz.tests.test_distroseriesdifferencejob
}}}

== Demo and Q/A ==

Look at a DSDs page such as https://staging.launchpad.net/ubuntu/oneiric/+localpackagediffs

Requesting asynchronous package syncs for DSDs should cause them to be marked as "synchronizing..."

Updating a package and reloading +localpackagediffs should cause the corresponding DSD to be marked as "updating..."

The two messages may also combine.

= Launchpad lint =

I added no lint and I fixed some pre-existing lint, but left some in place as well:

Checking for conflicts and issues in changed files.

Linting changed files:
  lib/lp/registry/templates/distroseries-localdifferences.pt
  lib/lp/soyuz/model/distroseriesdifferencejob.py
  lib/lp/registry/browser/tests/test_distroseries.py
  lib/lp/soyuz/interfaces/distributionjob.py
  lib/lp/soyuz/tests/test_distroseriesdifferencejob.py
  lib/lp/registry/browser/distroseries.py

./lib/lp/soyuz/tests/test_distroseriesdifferencejob.py
     259: E261 at least two spaces before inline comment
     283: E261 at least two spaces before inline comment
     399: E261 at least two spaces before inline comment
     417: E261 at least two spaces before inline comment
     423: E261 at least two spaces before inline comment

To post a comment you must log in.
Revision history for this message
Abel Deuring (adeuring) :
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/registry/browser/distroseries.py'
2--- lib/lp/registry/browser/distroseries.py 2011-05-24 10:08:33 +0000
3+++ lib/lp/registry/browser/distroseries.py 2011-05-27 08:21:17 +0000
4@@ -104,6 +104,9 @@
5 from lp.services.worlddata.interfaces.language import ILanguageSet
6 from lp.soyuz.browser.archive import PackageCopyingMixin
7 from lp.soyuz.browser.packagesearch import PackageSearchViewBase
8+from lp.soyuz.interfaces.distributionjob import (
9+ IDistroSeriesDifferenceJobSource,
10+ )
11 from lp.soyuz.interfaces.packagecopyjob import IPlainPackageCopyJobSource
12 from lp.soyuz.interfaces.queue import IPackageUploadSet
13 from lp.soyuz.model.packagecopyjob import specify_dsd_package
14@@ -863,6 +866,21 @@
15 job_source = getUtility(IPlainPackageCopyJobSource)
16 return job_source.getPendingJobsPerPackage(self.context)
17
18+ @cachedproperty
19+ def pending_dsd_updates(self):
20+ """Pending `DistroSeriesDifference` update jobs.
21+
22+ :return: A `set` of `DistroSeriesDifference`s that have pending
23+ `DistroSeriesDifferenceJob`s.
24+ """
25+ job_source = getUtility(IDistroSeriesDifferenceJobSource)
26+ return job_source.getPendingJobsForDifferences(
27+ self.context, self.cached_differences.batch)
28+
29+ def hasPendingDSDUpdate(self, dsd):
30+ """Have there been changes that `dsd` is still being updated for?"""
31+ return dsd in self.pending_dsd_updates
32+
33 def hasPendingSync(self, dsd):
34 """Is there a package-copying job pending to resolve `dsd`?"""
35 return self.pending_syncs.get(specify_dsd_package(dsd)) is not None
36@@ -898,6 +916,28 @@
37 return (
38 not self.isNewerThanParent(dsd) and not self.hasPendingSync(dsd))
39
40+ def describeJobs(self, dsd):
41+ """Describe any jobs that may be pending for `dsd`.
42+
43+ Shows "synchronizing..." if the entry is being synchronized, and
44+ "updating..." if the DSD is being updated with package changes.
45+
46+ :param dsd: A `DistroSeriesDifference` on the page.
47+ :return: An HTML text describing work that is pending or in
48+ progress for `dsd`; or None.
49+ """
50+ has_pending_dsd_update = self.hasPendingDSDUpdate(dsd)
51+ has_pending_sync = self.hasPendingSync(dsd)
52+ if not has_pending_dsd_update and not has_pending_sync:
53+ return None
54+
55+ description = []
56+ if has_pending_dsd_update:
57+ description.append("updating")
58+ if has_pending_sync:
59+ description.append("synchronizing")
60+ return " and ".join(description) + "…"
61+
62 @property
63 def specified_name_filter(self):
64 """If specified, return the name filter from the GET form data."""
65@@ -924,23 +964,18 @@
66 @cachedproperty
67 def cached_differences(self):
68 """Return a batch navigator of filtered results."""
69- if self.specified_package_type == NON_IGNORED:
70- status = (
71- DistroSeriesDifferenceStatus.NEEDS_ATTENTION,)
72- child_version_higher = False
73- elif self.specified_package_type == IGNORED:
74- status = (
75- DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT)
76- child_version_higher = False
77- elif self.specified_package_type == HIGHER_VERSION_THAN_PARENT:
78- status = (
79- DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT)
80- child_version_higher = True
81- elif self.specified_package_type == RESOLVED:
82- status = DistroSeriesDifferenceStatus.RESOLVED
83- child_version_higher = False
84- else:
85- raise AssertionError('specified_package_type unknown')
86+ package_type_dsd_status = {
87+ NON_IGNORED: (
88+ DistroSeriesDifferenceStatus.NEEDS_ATTENTION,),
89+ IGNORED: DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT,
90+ HIGHER_VERSION_THAN_PARENT: (
91+ DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT),
92+ RESOLVED: DistroSeriesDifferenceStatus.RESOLVED,
93+ }
94+
95+ status = package_type_dsd_status[self.specified_package_type]
96+ child_version_higher = (
97+ self.specified_package_type == HIGHER_VERSION_THAN_PARENT)
98
99 differences = getUtility(
100 IDistroSeriesDifferenceSource).getForDistroSeries(
101
102=== modified file 'lib/lp/registry/browser/tests/test_distroseries.py'
103--- lib/lp/registry/browser/tests/test_distroseries.py 2011-05-24 14:22:31 +0000
104+++ lib/lp/registry/browser/tests/test_distroseries.py 2011-05-27 08:21:17 +0000
105@@ -66,6 +66,7 @@
106 )
107 from lp.soyuz.interfaces.component import IComponentSet
108 from lp.soyuz.interfaces.distributionjob import (
109+ IDistroSeriesDifferenceJobSource,
110 IInitialiseDistroSeriesJobSource,
111 )
112 from lp.soyuz.interfaces.packagecopyjob import IPlainPackageCopyJobSource
113@@ -73,6 +74,7 @@
114 ISourcePackageFormatSelectionSet,
115 )
116 from lp.soyuz.model.archivepermission import ArchivePermission
117+from lp.soyuz.model import distroseriesdifferencejob
118 from lp.soyuz.model.packagecopyjob import specify_dsd_package
119 from lp.testing import (
120 anonymous_logged_in,
121@@ -85,6 +87,7 @@
122 TestCaseWithFactory,
123 with_celebrity_logged_in,
124 )
125+from lp.testing.fakemethod import FakeMethod
126 from lp.testing.matchers import HasQueryCount
127 from lp.testing.views import create_initialized_view
128
129@@ -102,6 +105,12 @@
130 }))
131
132
133+def set_derived_series_difference_jobs_feature_flag(test_case):
134+ test_case.useFixture(FeatureFixture({
135+ distroseriesdifferencejob.FEATURE_FLAG_ENABLE_MODULE: u'on',
136+ }))
137+
138+
139 class TestDistroSeriesView(TestCaseWithFactory):
140 """Test the distroseries +index view."""
141
142@@ -1095,6 +1104,14 @@
143
144 layer = LaunchpadFunctionalLayer
145
146+ def makeDSDJob(self, dsd):
147+ """Create a `DistroSeriesDifferenceJob` to update `dsd`."""
148+ job_source = getUtility(IDistroSeriesDifferenceJobSource)
149+ jobs = job_source.createForPackagePublication(
150+ dsd.derived_series, dsd.source_package_name,
151+ PackagePublishingPocket.RELEASE)
152+ return jobs[0]
153+
154 def test_higher_radio_mentions_parent(self):
155 # The user is shown an option to display only the blacklisted
156 # package with a higer version than in the parent.
157@@ -1345,6 +1362,20 @@
158
159 self.assertFalse(view.canPerformSync())
160
161+ def test_hasPendingDSDUpdate_returns_False_if_no_pending_update(self):
162+ dsd = self.factory.makeDistroSeriesDifference()
163+ view = create_initialized_view(
164+ dsd.derived_series, '+localpackagediffs')
165+ self.assertFalse(view.hasPendingDSDUpdate(dsd))
166+
167+ def test_hasPendingDSDUpdate_returns_True_if_pending_update(self):
168+ set_derived_series_difference_jobs_feature_flag(self)
169+ dsd = self.factory.makeDistroSeriesDifference()
170+ self.makeDSDJob(dsd)
171+ view = create_initialized_view(
172+ dsd.derived_series, '+localpackagediffs')
173+ self.assertTrue(view.hasPendingDSDUpdate(dsd))
174+
175 def test_hasPendingSync_returns_False_if_no_pending_sync(self):
176 dsd = self.factory.makeDistroSeriesDifference()
177 view = create_initialized_view(
178@@ -1423,6 +1454,44 @@
179 dsd.derived_series, '+localpackagediffs')
180 self.assertTrue(view.canRequestSync(dsd))
181
182+ def test_canRequestSync_ignores_DSDJobs(self):
183+ dsd = self.factory.makeDistroSeriesDifference()
184+ view = create_initialized_view(
185+ dsd.derived_series, '+localpackagediffs')
186+ view.hasPendingDSDUpdate = FakeMethod(result=True)
187+ self.assertTrue(view.canRequestSync(dsd))
188+
189+ def test_describeJobs_returns_None_if_no_jobs(self):
190+ dsd = self.factory.makeDistroSeriesDifference()
191+ view = create_initialized_view(
192+ dsd.derived_series, '+localpackagediffs')
193+ self.assertIs(None, view.describeJobs(dsd))
194+
195+ def test_describeJobs_reports_pending_update(self):
196+ dsd = self.factory.makeDistroSeriesDifference()
197+ view = create_initialized_view(
198+ dsd.derived_series, '+localpackagediffs')
199+ view.hasPendingDSDUpdate = FakeMethod(result=True)
200+ view.hasPendingSync = FakeMethod(result=False)
201+ self.assertEqual("updating…", view.describeJobs(dsd))
202+
203+ def test_describeJobs_reports_pending_sync(self):
204+ dsd = self.factory.makeDistroSeriesDifference()
205+ view = create_initialized_view(
206+ dsd.derived_series, '+localpackagediffs')
207+ view.hasPendingDSDUpdate = FakeMethod(result=False)
208+ view.hasPendingSync = FakeMethod(result=True)
209+ self.assertEqual("synchronizing…", view.describeJobs(dsd))
210+
211+ def test_describeJobs_reports_pending_sync_and_update(self):
212+ dsd = self.factory.makeDistroSeriesDifference()
213+ view = create_initialized_view(
214+ dsd.derived_series, '+localpackagediffs')
215+ view.hasPendingDSDUpdate = FakeMethod(result=True)
216+ view.hasPendingSync = FakeMethod(result=True)
217+ self.assertEqual(
218+ "updating and synchronizing…", view.describeJobs(dsd))
219+
220 def _syncAndGetView(self, derived_series, person, sync_differences,
221 difference_type=None, view_name='+localpackagediffs'):
222 # A helper to get the POST'ed sync view.
223
224=== modified file 'lib/lp/registry/templates/distroseries-localdifferences.pt'
225--- lib/lp/registry/templates/distroseries-localdifferences.pt 2011-05-24 11:32:34 +0000
226+++ lib/lp/registry/templates/distroseries-localdifferences.pt 2011-05-27 08:21:17 +0000
227@@ -94,11 +94,12 @@
228 class="js-action toggle-extra"
229 tal:content="src_name">Foo</a>
230
231- <span
232- class="lowlight"
233- tal:condition="python: view.hasPendingSync(difference)">
234- &nbsp;&nbsp;synchronizing&hellip;
235- </span>
236+ <tal:activity
237+ define="activity python:view.describeJobs(difference)"
238+ condition="activity">
239+ &nbsp;&nbsp;
240+ <span class="lowlight" tal:content="structure activity"></span>
241+ </tal:activity>
242 </td>
243 <td tal:condition="python: not(view.has_unique_parent) and view.show_parent_version">
244 <a tal:attributes="href difference/parent_series/fmt:url"
245
246=== modified file 'lib/lp/soyuz/interfaces/distributionjob.py'
247--- lib/lp/soyuz/interfaces/distributionjob.py 2011-05-13 10:00:02 +0000
248+++ lib/lp/soyuz/interfaces/distributionjob.py 2011-05-27 08:21:17 +0000
249@@ -104,6 +104,17 @@
250 :param pocket: The `PackagePublishingPocket` for the publication.
251 """
252
253+ def getPendingJobsForDifferences(derived_series, distroseriesdifferences):
254+ """Find `DistroSeriesDifferenceJob`s for `DistroSeriesDifference`s.
255+
256+ :param derived_series: The derived `DistroSeries` that the
257+ differences (and jobs) must be for.
258+ :param distroseriesdifferences:
259+ An iterable of `DistroSeriesDifference`s.
260+ :return: A dict mapping each of `distroseriesdifferences` that has
261+ pending jobs to a list of its jobs.
262+ """
263+
264
265 class IDistroSeriesDifferenceJob(IRunnableJob):
266 """A Job that performs actions related to DSDs."""
267
268=== modified file 'lib/lp/soyuz/model/distroseriesdifferencejob.py'
269--- lib/lp/soyuz/model/distroseriesdifferencejob.py 2011-05-20 14:36:26 +0000
270+++ lib/lp/soyuz/model/distroseriesdifferencejob.py 2011-05-27 08:21:17 +0000
271@@ -14,7 +14,10 @@
272 implements,
273 )
274
275-from canonical.launchpad.interfaces.lpstorm import IMasterStore
276+from canonical.launchpad.interfaces.lpstorm import (
277+ IMasterStore,
278+ IStore,
279+ )
280 from lp.registry.interfaces.distroseriesdifference import (
281 IDistroSeriesDifferenceSource,
282 )
283@@ -139,6 +142,29 @@
284 jobs.append(create_job(relative, sourcepackagename))
285 return jobs
286
287+ @classmethod
288+ def getPendingJobsForDifferences(cls, derived_series,
289+ distroseriesdifferences):
290+ """See `IDistroSeriesDifferenceJobSource`."""
291+ jobs = IStore(DistributionJob).find(
292+ DistributionJob,
293+ DistributionJob.job_type == cls.class_job_type,
294+ Job.id == DistributionJob.job_id,
295+ Job._status.is_in(Job.PENDING_STATUSES),
296+ DistributionJob.distroseries == derived_series)
297+
298+ # XXX JeroenVermeulen 2011-05-26 bug=758906: Check for parent
299+ # series once it becomes available.
300+ keyed_dsds = dict(
301+ (dsd.source_package_name.id, dsd)
302+ for dsd in distroseriesdifferences)
303+ jobs_by_dsd = {}
304+ for job in jobs:
305+ dsd = keyed_dsds.get(job.metadata["sourcepackagename"])
306+ if dsd is not None:
307+ jobs_by_dsd.setdefault(dsd, []).append(cls(job))
308+ return jobs_by_dsd
309+
310 @property
311 def sourcepackagename(self):
312 return SourcePackageName.get(self.metadata['sourcepackagename'])
313
314=== modified file 'lib/lp/soyuz/tests/test_distroseriesdifferencejob.py'
315--- lib/lp/soyuz/tests/test_distroseriesdifferencejob.py 2011-05-23 10:54:01 +0000
316+++ lib/lp/soyuz/tests/test_distroseriesdifferencejob.py 2011-05-27 08:21:17 +0000
317@@ -9,6 +9,7 @@
318 from psycopg2 import ProgrammingError
319 from zope.component import getUtility
320 from zope.interface.verify import verifyObject
321+from zope.security.proxy import removeSecurityProxy
322
323 from canonical.launchpad.interfaces.lpstorm import IMasterStore
324 from canonical.launchpad.scripts.tests import run_script
325@@ -26,8 +27,10 @@
326 from lp.services.job.interfaces.job import JobStatus
327 from lp.soyuz.enums import PackagePublishingStatus
328 from lp.soyuz.interfaces.distributionjob import (
329+ DistributionJobType,
330 IDistroSeriesDifferenceJobSource,
331 )
332+from lp.soyuz.model.distributionjob import DistributionJob
333 from lp.soyuz.model.distroseriesdifferencejob import (
334 create_job,
335 DistroSeriesDifferenceJob,
336@@ -108,15 +111,17 @@
337 dsdjob = create_job(distroseries, package)
338 self.assertEqual(JobStatus.WAITING, dsdjob.job.status)
339
340- def find_waiting_jobs_finds_waiting_jobs(self):
341+ def test_find_waiting_jobs_finds_waiting_jobs(self):
342 sourcepackage = self.factory.makeSourcePackage()
343 distroseries, sourcepackagename = (
344 sourcepackage.distroseries, sourcepackage.distroseries)
345 job = create_job(distroseries, sourcepackagename)
346- self.assertContentEqual(
347- [job], find_waiting_jobs(distroseries, sourcepackagename))
348+ found_jobs = find_waiting_jobs(distroseries, sourcepackagename)
349+ self.assertEqual([job], [
350+ DistroSeriesDifferenceJob(found_job)
351+ for found_job in found_jobs])
352
353- def find_waiting_jobs_ignores_other_series(self):
354+ def test_find_waiting_jobs_ignores_other_series(self):
355 sourcepackage = self.factory.makeSourcePackage()
356 distroseries, sourcepackagename = (
357 sourcepackage.distroseries, sourcepackage.distroseries)
358@@ -125,7 +130,7 @@
359 self.assertContentEqual(
360 [], find_waiting_jobs(other_series, sourcepackagename))
361
362- def find_waiting_jobs_ignores_other_packages(self):
363+ def test_find_waiting_jobs_ignores_other_packages(self):
364 sourcepackage = self.factory.makeSourcePackage()
365 distroseries, sourcepackagename = (
366 sourcepackage.distroseries, sourcepackage.distroseries)
367@@ -134,7 +139,7 @@
368 self.assertContentEqual(
369 [], find_waiting_jobs(distroseries, other_spn))
370
371- def find_waiting_jobs_considers_only_waiting_jobs(self):
372+ def test_find_waiting_jobs_considers_only_waiting_jobs(self):
373 sourcepackage = self.factory.makeSourcePackage()
374 distroseries, sourcepackagename = (
375 sourcepackage.distroseries, sourcepackage.distroseries)
376@@ -192,6 +197,60 @@
377 distroseries, package, PackagePublishingPocket.PROPOSED)
378 self.assertContentEqual([], find_waiting_jobs(distroseries, package))
379
380+ def test_getPendingJobsForDifferences_finds_job(self):
381+ dsd = self.factory.makeDistroSeriesDifference()
382+ job = create_job(dsd.derived_series, dsd.source_package_name)
383+ self.assertEqual(
384+ {dsd: [job]},
385+ self.getJobSource().getPendingJobsForDifferences(
386+ dsd.derived_series, [dsd]))
387+
388+ def test_getPendingJobsForDifferences_ignores_other_package(self):
389+ dsd = self.factory.makeDistroSeriesDifference()
390+ create_job(dsd.derived_series, self.factory.makeSourcePackageName())
391+ self.assertEqual(
392+ {},
393+ self.getJobSource().getPendingJobsForDifferences(
394+ dsd.derived_series, [dsd]))
395+
396+ def test_getPendingJobsForDifferences_ignores_other_derived_series(self):
397+ dsd = self.factory.makeDistroSeriesDifference()
398+ create_job(self.makeDerivedDistroSeries(), dsd.source_package_name)
399+ self.assertEqual(
400+ {},
401+ self.getJobSource().getPendingJobsForDifferences(
402+ dsd.derived_series, [dsd]))
403+
404+ def test_getPendingJobsForDifferences_ignores_other_parent_series(self):
405+ # XXX JeroenVermeulen 2011-05-26 bug=758906: Can't test this
406+ # until we can specify the right parent series when creating a
407+ # job.
408+ return
409+
410+ def test_getPendingJobsForDifferences_ignores_non_pending_jobs(self):
411+ dsd = self.factory.makeDistroSeriesDifference()
412+ job = create_job(dsd.derived_series, dsd.source_package_name)
413+ removeSecurityProxy(job).job._status = JobStatus.COMPLETED
414+ self.assertEqual(
415+ {},
416+ self.getJobSource().getPendingJobsForDifferences(
417+ dsd.derived_series, [dsd]))
418+
419+ def test_getPendingJobsForDifferences_ignores_other_job_types(self):
420+ # XXX JeroenVermeulen 2011-05-26 bug=758906: Once parent_series
421+ # is incorporated into the job type, set it to dsd.parent_series
422+ # on the fake job, or this test will become silently meaningless.
423+ dsd = self.factory.makeDistroSeriesDifference()
424+ DistributionJob(
425+ distribution=dsd.derived_series.distribution,
426+ distroseries=dsd.derived_series,
427+ job_type=DistributionJobType.INITIALISE_SERIES,
428+ metadata={"sourcepackagename": dsd.source_package_name.id})
429+ self.assertEqual(
430+ {},
431+ self.getJobSource().getPendingJobsForDifferences(
432+ dsd.derived_series, [dsd]))
433+
434 def test_cronscript(self):
435 derived_series = self.makeDerivedDistroSeries()
436 package = self.factory.makeSourcePackageName()
437@@ -285,7 +344,7 @@
438 parent_packageset = self.factory.makePackageset(
439 distroseries=distro_series_parent.parent_series,
440 packages=packages)
441- derived_packageset = self.factory.makePackageset(
442+ self.factory.makePackageset(
443 distroseries=distro_series_parent.derived_series,
444 packages=packages, name=parent_packageset.name,
445 owner=parent_packageset.owner, related_set=parent_packageset)
446@@ -414,7 +473,8 @@
447 jobs = find_waiting_jobs(derived_series, source_package_name)
448 self.runJob(jobs[0])
449 self.assertEqual(
450- DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT, ds_diff[0].status)
451+ DistroSeriesDifferenceStatus.BLACKLISTED_CURRENT,
452+ ds_diff[0].status)
453 self.assertEqual('1.0-1', ds_diff[0].base_version)
454
455 def test_child_is_synced(self):

Subscribers

People subscribed via source and target branches

to status/vote changes: