launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #23944
[Merge] lp:~cjwatson/launchpad/das-filter-initialize-ds into lp:launchpad
Colin Watson has proposed merging lp:~cjwatson/launchpad/das-filter-initialize-ds into lp:launchpad with lp:~cjwatson/launchpad/das-filter-honour as a prerequisite.
Commit message:
Copy forward DistroArchSeriesFilter rows when initialising a new distro series.
Requested reviews:
Launchpad code reviewers (launchpad-reviewers)
Related bugs:
Bug #1842658 in Launchpad itself: "Support central filtering of which packages build for some architectures"
https://bugs.launchpad.net/launchpad/+bug/1842658
For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/das-filter-initialize-ds/+merge/372264
--
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~cjwatson/launchpad/das-filter-initialize-ds into lp:launchpad.
=== modified file 'database/schema/security.cfg'
--- database/schema/security.cfg 2019-09-04 14:14:56 +0000
+++ database/schema/security.cfg 2019-09-04 14:14:56 +0000
@@ -1064,6 +1064,7 @@
public.distributionsourcepackage = SELECT, INSERT
public.distributionsourcepackagecache = SELECT, INSERT, UPDATE
public.distroarchseries = SELECT, INSERT
+public.distroarchseriesfilter = SELECT, INSERT
public.distroseries = SELECT, UPDATE
public.distroseriesdifference = SELECT, INSERT, UPDATE
public.distroseriesparent = SELECT, INSERT, UPDATE
=== modified file 'lib/lp/soyuz/scripts/initialize_distroseries.py'
--- lib/lp/soyuz/scripts/initialize_distroseries.py 2019-04-16 10:29:22 +0000
+++ lib/lp/soyuz/scripts/initialize_distroseries.py 2019-09-04 14:14:56 +0000
@@ -693,8 +693,8 @@
Packageset,
Packageset.distroseries_id.is_in(self.derivation_parent_ids))
parent_to_child = {}
- # Create the packagesets and any archivepermissions if we're not
- # copying cross-distribution.
+ # Create the packagesets and any archivepermissions and filters if
+ # we're not copying cross-distribution.
parent_distro_ids = [
parent.distribution.id for parent in self.derivation_parents]
for parent_ps in packagesets:
@@ -718,7 +718,7 @@
new_owner, distroseries=self.distroseries,
related_set=parent_ps)
parent_to_child[parent_ps] = child_ps
- # Copy archivepermissions if we're not copying
+ # Copy archivepermissions and filters if we're not copying
# cross-distribution.
if (self.distroseries.distribution ==
parent_ps.distroseries.distribution):
@@ -730,6 +730,28 @@
""" % sqlvalues(
self.distroseries.main_archive, child_ps.id,
parent_ps.id))
+ self._store.execute("""
+ INSERT INTO DistroArchSeriesFilter
+ (distroarchseries, packageset, sense,
+ creator, date_created, date_last_modified)
+ SELECT
+ newdas.id AS distroarchseries,
+ %s AS packageset, dasf.sense, dasf.creator,
+ CURRENT_TIMESTAMP AT TIME ZONE 'UTC',
+ CURRENT_TIMESTAMP AT TIME ZONE 'UTC'
+ FROM DistroArchSeriesFilter AS dasf
+ LEFT JOIN DistroArchSeries AS olddas ON
+ dasf.distroarchseries = olddas.id
+ LEFT JOIN DistroArchSeries AS newdas ON
+ newdas.distroseries = %s
+ AND newdas.architecturetag = olddas.architecturetag
+ WHERE
+ dasf.packageset = %s
+ AND olddas.distroseries = %s
+ AND newdas.id IS NOT NULL
+ """ % sqlvalues(
+ child_ps.id, self.distroseries.id,
+ parent_ps.id, parent_ps.distroseries.id))
# Copy the relations between sets, and the contents.
for old_series_ps, new_series_ps in parent_to_child.items():
old_series_sets = old_series_ps.setsIncluded(
=== modified file 'lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py'
--- lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py 2019-04-16 10:29:22 +0000
+++ lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py 2019-09-04 14:14:56 +0000
@@ -5,6 +5,7 @@
__metaclass__ = type
+from testtools.matchers import MatchesStructure
import transaction
from zope.component import getUtility
@@ -22,6 +23,7 @@
from lp.services.database.interfaces import IStore
from lp.soyuz.enums import (
ArchivePurpose,
+ DistroArchSeriesFilterSense,
IndexCompressionType,
PackageUploadStatus,
SourcePackageFormat,
@@ -829,6 +831,56 @@
releaser, pocket=PackagePublishingPocket.RELEASE,
distroseries=series))
+ def test_intra_distro_filter_copying(self):
+ # If child.distribution equals parent.distribution, we also copy any
+ # DAS filters.
+ parent, parent_das1 = self.setupParent(proc='386', arch_tag='i386')
+ _, parent_das2 = self.setupParent(
+ parent=parent, proc='amd64', arch_tag='amd64')
+ _, parent_das3 = self.setupParent(
+ parent=parent, proc='hppa', arch_tag='hppa')
+ parent_dasf1 = self.factory.makeDistroArchSeriesFilter(
+ distroarchseries=parent_das1,
+ sense=DistroArchSeriesFilterSense.INCLUDE)
+ parent_dasf2 = self.factory.makeDistroArchSeriesFilter(
+ distroarchseries=parent_das2,
+ sense=DistroArchSeriesFilterSense.EXCLUDE)
+ # Create child series in the same distribution.
+ child = self.factory.makeDistroSeries(
+ distribution=parent.distribution, previous_series=parent)
+ self._fullInitialize([parent], child=child)
+
+ # The child series has corresponding packagesets and DAS filters.
+ parent_set1 = parent_dasf1.packageset
+ parent_set2 = parent_dasf2.packageset
+ child_set1 = getUtility(IPackagesetSet).getByName(
+ child, parent_set1.name)
+ child_set2 = getUtility(IPackagesetSet).getByName(
+ child, parent_set2.name)
+ self.assertEqual(parent_set1.description, child_set1.description)
+ self.assertEqual(parent_set2.description, child_set2.description)
+ self.assertEqual(parent_set1, child_set1.relatedSets().one())
+ self.assertEqual(parent_set2, child_set2.relatedSets().one())
+ self.assertThat(
+ child['i386'].getFilter(), MatchesStructure.byEquality(
+ packageset=child_set1,
+ sense=DistroArchSeriesFilterSense.INCLUDE,
+ creator=parent_dasf1.creator))
+ self.assertThat(
+ child['amd64'].getFilter(), MatchesStructure.byEquality(
+ packageset=child_set2,
+ sense=DistroArchSeriesFilterSense.EXCLUDE,
+ creator=parent_dasf2.creator))
+ self.assertIsNone(child['hppa'].getFilter())
+
+ def test_no_cross_distro_filter_copying(self):
+ # No cross-distro DAS filter copying should happen.
+ parent, parent_das = self.setupParent()
+ self.factory.makeDistroArchSeriesFilter(distroarchseries=parent_das)
+ child = self._fullInitialize([parent])
+ for child_das in child.architectures:
+ self.assertIsNone(child_das.getFilter())
+
def test_packageset_owner_preserved_within_distro(self):
# When initializing a new series within a distro, the copied
# packagesets have ownership preserved.
Follow ups