← Back to team overview

launchpad-reviewers team mailing list archive

[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