Merge lp:~stevenk/launchpad/attemptcopy-no-source into lp:launchpad

Proposed by Steve Kowalik on 2012-10-04
Status: Merged
Approved by: Steve Kowalik on 2012-10-04
Approved revision: no longer in the source branch.
Merged at revision: 16087
Proposed branch: lp:~stevenk/launchpad/attemptcopy-no-source
Merge into: lp:launchpad
Diff against target: 100 lines (+54/-10)
2 files modified
lib/lp/soyuz/model/packagecopyjob.py (+16/-10)
lib/lp/soyuz/tests/test_packagecopyjob.py (+38/-0)
To merge this branch: bzr merge lp:~stevenk/launchpad/attemptcopy-no-source
Reviewer Review Type Date Requested Status
William Grant code 2012-10-04 Approve on 2012-10-04
Review via email: mp+127932@code.launchpad.net

Description of the Change

When a PCJ is created to copy just binaries from one pocket to another, the PCJ machinery attempts to update package diffs for the copied source publication. Except there isn't one and so it OOPSes.

I have corrected the lie that was the variable 'copied_sources' and now iterate all copied publications looking for sources and only perform package diff things if we found one.

I will claim LoC credit against https://code.launchpad.net/~stevenk/launchpad/destroy-simplified-branch-ff/+merge/127630 .

To post a comment you must log in.
William Grant (wgrant) wrote :

You can probably drop the explicit sourcepackagename and version from the test, but otherwise looks good.

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/soyuz/model/packagecopyjob.py'
2--- lib/lp/soyuz/model/packagecopyjob.py 2012-08-20 18:20:36 +0000
3+++ lib/lp/soyuz/model/packagecopyjob.py 2012-10-04 07:04:23 +0000
4@@ -76,6 +76,7 @@
5 PackageCopyJobType,
6 )
7 from lp.soyuz.interfaces.packagediff import PackageDiffAlreadyRequested
8+from lp.soyuz.interfaces.publishing import ISourcePackagePublishingHistory
9 from lp.soyuz.interfaces.queue import IPackageUploadSet
10 from lp.soyuz.interfaces.section import ISectionSet
11 from lp.soyuz.model.archive import Archive
12@@ -602,7 +603,7 @@
13 override = self.getSourceOverride()
14 copy_policy = self.getPolicyImplementation()
15 send_email = copy_policy.send_email(self.target_archive)
16- copied_sources = do_copy(
17+ copied_publications = do_copy(
18 sources=[source_package], archive=self.target_archive,
19 series=self.target_distroseries, pocket=self.target_pocket,
20 include_binaries=self.include_binaries, check_permissions=True,
21@@ -612,16 +613,21 @@
22 unembargo=self.unembargo)
23
24 # Add a PackageDiff for this new upload if it has ancestry.
25- if copied_sources and not ancestry.is_empty():
26- from_spr = copied_sources[0].sourcepackagerelease
27- for ancestor in ancestry:
28- to_spr = ancestor.sourcepackagerelease
29- if from_spr != to_spr:
30- try:
31- to_spr.requestDiffTo(self.requester, from_spr)
32- except PackageDiffAlreadyRequested:
33- pass
34+ if copied_publications and not ancestry.is_empty():
35+ from_spr = None
36+ for publication in copied_publications:
37+ if ISourcePackagePublishingHistory.providedBy(publication):
38+ from_spr = publication.sourcepackagerelease
39 break
40+ if from_spr:
41+ for ancestor in ancestry:
42+ to_spr = ancestor.sourcepackagerelease
43+ if from_spr != to_spr:
44+ try:
45+ to_spr.requestDiffTo(self.requester, from_spr)
46+ except PackageDiffAlreadyRequested:
47+ pass
48+ break
49
50 if pu is not None:
51 # A PackageUpload will only exist if the copy job had to be
52
53=== modified file 'lib/lp/soyuz/tests/test_packagecopyjob.py'
54--- lib/lp/soyuz/tests/test_packagecopyjob.py 2012-09-27 02:53:00 +0000
55+++ lib/lp/soyuz/tests/test_packagecopyjob.py 2012-10-04 07:04:23 +0000
56@@ -1494,6 +1494,44 @@
57 # The job should have set the PU status to REJECTED.
58 self.assertEqual(PackageUploadStatus.REJECTED, pu.status)
59
60+ def test_diffs_are_not_created_when_only_copying_binaries(self):
61+ # The job will not fail because a packagediff from a source that wasn't
62+ # copied could not be created.
63+ archive = self.distroseries.distribution.main_archive
64+ source = self.factory.makeSourcePackagePublishingHistory(
65+ distroseries=self.distroseries, sourcepackagename="copyme",
66+ version="2.8-1", status=PackagePublishingStatus.PUBLISHED,
67+ pocket=PackagePublishingPocket.RELEASE, archive=archive,
68+ component='multiverse')
69+ spph = self.factory.makeSourcePackagePublishingHistory(
70+ status=PackagePublishingStatus.PUBLISHED,
71+ pocket=PackagePublishingPocket.UPDATES, archive=archive,
72+ distroseries=self.distroseries,
73+ sourcepackagerelease=source.sourcepackagerelease)
74+ das = self.factory.makeDistroArchSeries(distroseries=self.distroseries)
75+ self.factory.makeBinaryPackagePublishingHistory(
76+ status=PackagePublishingStatus.PUBLISHED, distroarchseries=das,
77+ pocket=PackagePublishingPocket.UPDATES, archive=archive,
78+ source_package_release=spph.sourcepackagerelease)
79+ requester = self.factory.makePerson()
80+ with person_logged_in(archive.owner):
81+ archive.newComponentUploader(requester, 'multiverse')
82+ source = getUtility(IPlainPackageCopyJobSource)
83+ job = source.create(
84+ package_name="copyme", package_version="2.8-1",
85+ source_archive=archive, target_archive=archive,
86+ target_distroseries=self.distroseries,
87+ target_pocket=PackagePublishingPocket.RELEASE,
88+ include_binaries=True, requester=requester)
89+ self.runJob(job)
90+ self.assertEqual(JobStatus.COMPLETED, job.status)
91+ self.assertContentEqual(
92+ [], archive.getPublishedSources(
93+ status=PackagePublishingStatus.PENDING))
94+ self.assertEqual(
95+ 1, archive.getPublishedOnDiskBinaries(
96+ status=PackagePublishingStatus.PENDING).count())
97+
98
99 class TestViaCelery(TestCaseWithFactory):
100 """PackageCopyJob runs under Celery."""