Merge ~cjwatson/launchpad:initialize-distroseries-proposed into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: e9da2379819721daeeec92deadb3203be17d84fd
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:initialize-distroseries-proposed
Merge into: launchpad:master
Diff against target: 237 lines (+106/-43)
2 files modified
lib/lp/soyuz/scripts/initialize_distroseries.py (+43/-37)
lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py (+63/-6)
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+374134@code.launchpad.net

Commit message

Fix source/target pocket handling in InitializeDistroSeries

Copy pockets other than RELEASE when using the cloner as well as when
using the copier; and copy packages from PROPOSED to PROPOSED rather
than to RELEASE, since (unlike UPDATES and SECURITY) the PROPOSED pocket
is modifiable in unreleased series.

LP: #1824966

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) :
review: Approve (code)
Revision history for this message
Adam Conrad (adconrad) :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/lib/lp/soyuz/scripts/initialize_distroseries.py b/lib/lp/soyuz/scripts/initialize_distroseries.py
index 6a9753e..d266a84 100644
--- a/lib/lp/soyuz/scripts/initialize_distroseries.py
+++ b/lib/lp/soyuz/scripts/initialize_distroseries.py
@@ -9,6 +9,7 @@ __all__ = [
9 'InitializeDistroSeries',9 'InitializeDistroSeries',
10 ]10 ]
1111
12from collections import OrderedDict
12from operator import methodcaller13from operator import methodcaller
1314
14import transaction15import transaction
@@ -54,13 +55,15 @@ class InitializationError(Exception):
54 """Raised when there is an exception during the initialization process."""55 """Raised when there is an exception during the initialization process."""
5556
5657
57# Pockets to consider when initializing the derived series from its parent(s).58# Pockets to consider when initializing the derived series from its
58INIT_POCKETS = [59# parent(s), mapped to the pockets that they should be cloned/copied to. We
59 PackagePublishingPocket.RELEASE,60# need this because some pockets are unmodifiable in unreleased series.
60 PackagePublishingPocket.SECURITY,61INIT_POCKETS = OrderedDict([
61 PackagePublishingPocket.UPDATES,62 (PackagePublishingPocket.RELEASE, PackagePublishingPocket.RELEASE),
62 PackagePublishingPocket.PROPOSED,63 (PackagePublishingPocket.SECURITY, PackagePublishingPocket.RELEASE),
63 ]64 (PackagePublishingPocket.UPDATES, PackagePublishingPocket.RELEASE),
65 (PackagePublishingPocket.PROPOSED, PackagePublishingPocket.PROPOSED),
66 ])
6467
6568
66class InitializeDistroSeries:69class InitializeDistroSeries:
@@ -233,7 +236,7 @@ class InitializeDistroSeries:
233236
234 arch_tags = self.arches if len(self.arches) != 0 else None237 arch_tags = self.arches if len(self.arches) != 0 else None
235 pending_builds = parent.getBuildRecords(238 pending_builds = parent.getBuildRecords(
236 BuildStatus.NEEDSBUILD, pocket=INIT_POCKETS,239 BuildStatus.NEEDSBUILD, pocket=list(INIT_POCKETS),
237 arch_tag=arch_tags, name=spns)240 arch_tag=arch_tags, name=spns)
238241
239 if not pending_builds.is_empty():242 if not pending_builds.is_empty():
@@ -263,7 +266,7 @@ class InitializeDistroSeries:
263 # all sources.266 # all sources.
264267
265 items = getUtility(IPackageUploadSet).getBuildsForSources(268 items = getUtility(IPackageUploadSet).getBuildsForSources(
266 parent, statuses, INIT_POCKETS, spns)269 parent, statuses, list(INIT_POCKETS), spns)
267 if not items.is_empty():270 if not items.is_empty():
268 raise InitializationError(271 raise InitializationError(
269 "The parent series has sources waiting in its upload "272 "The parent series has sources waiting in its upload "
@@ -548,40 +551,43 @@ class InitializeDistroSeries:
548 assert target_archive is not None, (551 assert target_archive is not None, (
549 "Target archive doesn't exist?")552 "Target archive doesn't exist?")
550 if self._use_cloner(target_archive, archive):553 if self._use_cloner(target_archive, archive):
551 origin = PackageLocation(554 for source_pocket, target_pocket in INIT_POCKETS.items():
552 archive, parent.distribution, parent,555 origin = PackageLocation(
553 PackagePublishingPocket.RELEASE)556 archive, parent.distribution, parent,
554 destination = PackageLocation(557 source_pocket)
555 target_archive, self.distroseries.distribution,558 destination = PackageLocation(
556 self.distroseries, PackagePublishingPocket.RELEASE)559 target_archive, self.distroseries.distribution,
557 processors = None560 self.distroseries, target_pocket)
558 if self.rebuild:561 processors = None
559 processors = [562 if self.rebuild:
560 das[1].processor for das in distroarchseries_list]563 processors = [
561 distroarchseries_list = ()564 das[1].processor
562 getUtility(IPackageCloner).clonePackages(565 for das in distroarchseries_list]
563 origin, destination, distroarchseries_list,566 distroarchseries_list = ()
564 processors, spns)567 getUtility(IPackageCloner).clonePackages(
568 origin, destination, distroarchseries_list,
569 processors, spns)
565 else:570 else:
566 # There is only one available pocket in an unreleased
567 # series.
568 target_pocket = PackagePublishingPocket.RELEASE
569 sources = archive.getPublishedSources(
570 distroseries=parent, pocket=INIT_POCKETS,
571 status=(PackagePublishingStatus.PENDING,
572 PackagePublishingStatus.PUBLISHED),
573 name=spns)
574 # XXX: rvb 2011-06-23 bug=801112: do_copy is atomic (all571 # XXX: rvb 2011-06-23 bug=801112: do_copy is atomic (all
575 # or none of the sources will be copied). This might572 # or none of the sources will be copied). This might
576 # lead to a partially initialised series if there is a573 # lead to a partially initialised series if there is a
577 # single conflict in the destination series.574 # single conflict in the destination series.
575 sources_published = []
578 try:576 try:
579 sources_published = do_copy(577 for source_pocket, target_pocket in (
580 sources, target_archive, self.distroseries,578 INIT_POCKETS.items()):
581 target_pocket, include_binaries=not self.rebuild,579 sources = archive.getPublishedSources(
582 check_permissions=False, strict_binaries=False,580 distroseries=parent, pocket=source_pocket,
583 close_bugs=False, create_dsd_job=False,581 status=(PackagePublishingStatus.PENDING,
584 person=None)582 PackagePublishingStatus.PUBLISHED),
583 name=spns)
584 sources_published.extend(do_copy(
585 sources, target_archive, self.distroseries,
586 target_pocket,
587 include_binaries=not self.rebuild,
588 check_permissions=False, strict_binaries=False,
589 close_bugs=False, create_dsd_job=False,
590 person=None))
585 if self.rebuild:591 if self.rebuild:
586 rebuilds = []592 rebuilds = []
587 for pubrec in sources_published:593 for pubrec in sources_published:
diff --git a/lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py b/lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py
index bd2cf15..25d2cb3 100644
--- a/lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py
+++ b/lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py
@@ -374,22 +374,74 @@ class TestInitializeDistroSeries(InitializationHelperTestCase):
374 # No exception should be raised.374 # No exception should be raised.
375 ids.check()375 ids.check()
376376
377 def test_success_with_updates_packages(self):377 def test_success_with_updates_packages_cloner(self):
378 # Initialization copies all the package from the UPDATES pocket.378 # Initialization using the cloner copies all the packages from the
379 # UPDATES pocket.
380 self.parent, self.parent_das = self.setupParent(
381 pocket=PackagePublishingPocket.UPDATES)
382 self.factory.makeSourcePackagePublishingHistory(
383 distroseries=self.parent)
384 child = self._fullInitialize(
385 [self.parent], previous_series=self.parent,
386 distribution=self.parent.distribution)
387 self.assertDistroSeriesInitializedCorrectly(
388 child, self.parent, self.parent_das)
389
390 def test_success_with_updates_packages_copier(self):
391 # Initialization using the copier copies all the packages from the
392 # UPDATES pocket.
379 self.parent, self.parent_das = self.setupParent(393 self.parent, self.parent_das = self.setupParent(
380 pocket=PackagePublishingPocket.UPDATES)394 pocket=PackagePublishingPocket.UPDATES)
381 child = self._fullInitialize([self.parent])395 child = self._fullInitialize([self.parent])
382 self.assertDistroSeriesInitializedCorrectly(396 self.assertDistroSeriesInitializedCorrectly(
383 child, self.parent, self.parent_das)397 child, self.parent, self.parent_das)
384398
385 def test_success_with_security_packages(self):399 def test_success_with_security_packages_cloner(self):
386 # Initialization copies all the package from the SECURITY pocket.400 # Initialization using the cloner copies all the packages from the
401 # SECURITY pocket.
402 self.parent, self.parent_das = self.setupParent(
403 pocket=PackagePublishingPocket.SECURITY)
404 self.factory.makeSourcePackagePublishingHistory(
405 distroseries=self.parent)
406 child = self._fullInitialize(
407 [self.parent], previous_series=self.parent,
408 distribution=self.parent.distribution)
409 self.assertDistroSeriesInitializedCorrectly(
410 child, self.parent, self.parent_das)
411
412 def test_success_with_security_packages_copier(self):
413 # Initialization using the copier copies all the packages from the
414 # SECURITY pocket.
387 self.parent, self.parent_das = self.setupParent(415 self.parent, self.parent_das = self.setupParent(
388 pocket=PackagePublishingPocket.SECURITY)416 pocket=PackagePublishingPocket.SECURITY)
389 child = self._fullInitialize([self.parent])417 child = self._fullInitialize([self.parent])
390 self.assertDistroSeriesInitializedCorrectly(418 self.assertDistroSeriesInitializedCorrectly(
391 child, self.parent, self.parent_das)419 child, self.parent, self.parent_das)
392420
421 def test_success_with_proposed_packages_cloner(self):
422 # Initialization using the cloner copies all the packages from the
423 # PROPOSED pocket.
424 self.parent, self.parent_das = self.setupParent(
425 pocket=PackagePublishingPocket.PROPOSED)
426 self.factory.makeSourcePackagePublishingHistory(
427 distroseries=self.parent)
428 child = self._fullInitialize(
429 [self.parent], previous_series=self.parent,
430 distribution=self.parent.distribution)
431 self.assertDistroSeriesInitializedCorrectly(
432 child, self.parent, self.parent_das,
433 child_pocket=PackagePublishingPocket.PROPOSED)
434
435 def test_success_with_proposed_packages_copier(self):
436 # Initialization using the copier copies all the packages from the
437 # PROPOSED pocket.
438 self.parent, self.parent_das = self.setupParent(
439 pocket=PackagePublishingPocket.PROPOSED)
440 child = self._fullInitialize([self.parent])
441 self.assertDistroSeriesInitializedCorrectly(
442 child, self.parent, self.parent_das,
443 child_pocket=PackagePublishingPocket.PROPOSED)
444
393 def test_do_not_copy_superseded_sources(self):445 def test_do_not_copy_superseded_sources(self):
394 # Make sure we don't copy superseded sources from the parent,446 # Make sure we don't copy superseded sources from the parent,
395 # we only want (pending, published).447 # we only want (pending, published).
@@ -578,8 +630,9 @@ class TestInitializeDistroSeries(InitializationHelperTestCase):
578 "queues that match your selection."),630 "queues that match your selection."),
579 ids.check)631 ids.check)
580632
581 def assertDistroSeriesInitializedCorrectly(self, child, parent,633 def assertDistroSeriesInitializedCorrectly(
582 parent_das):634 self, child, parent, parent_das,
635 child_pocket=PackagePublishingPocket.RELEASE):
583 # Check that 'udev' has been copied correctly.636 # Check that 'udev' has been copied correctly.
584 parent_udev_pubs = parent.main_archive.getPublishedSources(637 parent_udev_pubs = parent.main_archive.getPublishedSources(
585 u'udev', distroseries=parent)638 u'udev', distroseries=parent)
@@ -587,12 +640,16 @@ class TestInitializeDistroSeries(InitializationHelperTestCase):
587 u'udev', distroseries=child)640 u'udev', distroseries=child)
588 self.assertEqual(641 self.assertEqual(
589 parent_udev_pubs.count(), child_udev_pubs.count())642 parent_udev_pubs.count(), child_udev_pubs.count())
643 self.assertEqual(
644 {child_pocket}, set(pub.pocket for pub in child_udev_pubs))
590 parent_arch_udev_pubs = parent.main_archive.getAllPublishedBinaries(645 parent_arch_udev_pubs = parent.main_archive.getAllPublishedBinaries(
591 distroarchseries=parent[parent_das.architecturetag], name=u'udev')646 distroarchseries=parent[parent_das.architecturetag], name=u'udev')
592 child_arch_udev_pubs = child.main_archive.getAllPublishedBinaries(647 child_arch_udev_pubs = child.main_archive.getAllPublishedBinaries(
593 distroarchseries=child[parent_das.architecturetag], name=u'udev')648 distroarchseries=child[parent_das.architecturetag], name=u'udev')
594 self.assertEqual(649 self.assertEqual(
595 parent_arch_udev_pubs.count(), child_arch_udev_pubs.count())650 parent_arch_udev_pubs.count(), child_arch_udev_pubs.count())
651 self.assertEqual(
652 {child_pocket}, set(pub.pocket for pub in child_arch_udev_pubs))
596 # And the binary package, and linked source package look fine too.653 # And the binary package, and linked source package look fine too.
597 udev_bin = child_arch_udev_pubs[0].binarypackagerelease654 udev_bin = child_arch_udev_pubs[0].binarypackagerelease
598 self.assertEqual(udev_bin.title, u'udev-0.1-1')655 self.assertEqual(udev_bin.title, u'udev-0.1-1')

Subscribers

People subscribed via source and target branches

to status/vote changes: