Merge lp:~cjwatson/launchpad/das-filter-initialize-ds into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 19062
Proposed branch: lp:~cjwatson/launchpad/das-filter-initialize-ds
Merge into: lp:launchpad
Prerequisite: lp:~cjwatson/launchpad/das-filter-honour
Diff against target: 142 lines (+78/-4)
3 files modified
database/schema/security.cfg (+1/-1)
lib/lp/soyuz/scripts/initialize_distroseries.py (+25/-3)
lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py (+52/-0)
To merge this branch: bzr merge lp:~cjwatson/launchpad/das-filter-initialize-ds
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+372264@code.launchpad.net

Commit message

Copy forward DistroArchSeriesFilter rows when initialising a new distro series.

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'database/schema/security.cfg'
2--- database/schema/security.cfg 2019-09-27 11:42:24 +0000
3+++ database/schema/security.cfg 2019-09-27 12:36:02 +0000
4@@ -1064,7 +1064,7 @@
5 public.distributionsourcepackage = SELECT, INSERT
6 public.distributionsourcepackagecache = SELECT, INSERT, UPDATE
7 public.distroarchseries = SELECT, INSERT
8-public.distroarchseriesfilter = SELECT
9+public.distroarchseriesfilter = SELECT, INSERT
10 public.distroseries = SELECT, UPDATE
11 public.distroseriesdifference = SELECT, INSERT, UPDATE
12 public.distroseriesparent = SELECT, INSERT, UPDATE
13
14=== modified file 'lib/lp/soyuz/scripts/initialize_distroseries.py'
15--- lib/lp/soyuz/scripts/initialize_distroseries.py 2019-04-16 10:29:22 +0000
16+++ lib/lp/soyuz/scripts/initialize_distroseries.py 2019-09-27 12:36:02 +0000
17@@ -693,8 +693,8 @@
18 Packageset,
19 Packageset.distroseries_id.is_in(self.derivation_parent_ids))
20 parent_to_child = {}
21- # Create the packagesets and any archivepermissions if we're not
22- # copying cross-distribution.
23+ # Create the packagesets and any archivepermissions and filters if
24+ # we're not copying cross-distribution.
25 parent_distro_ids = [
26 parent.distribution.id for parent in self.derivation_parents]
27 for parent_ps in packagesets:
28@@ -718,7 +718,7 @@
29 new_owner, distroseries=self.distroseries,
30 related_set=parent_ps)
31 parent_to_child[parent_ps] = child_ps
32- # Copy archivepermissions if we're not copying
33+ # Copy archivepermissions and filters if we're not copying
34 # cross-distribution.
35 if (self.distroseries.distribution ==
36 parent_ps.distroseries.distribution):
37@@ -730,6 +730,28 @@
38 """ % sqlvalues(
39 self.distroseries.main_archive, child_ps.id,
40 parent_ps.id))
41+ self._store.execute("""
42+ INSERT INTO DistroArchSeriesFilter
43+ (distroarchseries, packageset, sense,
44+ creator, date_created, date_last_modified)
45+ SELECT
46+ newdas.id AS distroarchseries,
47+ %s AS packageset, dasf.sense, dasf.creator,
48+ CURRENT_TIMESTAMP AT TIME ZONE 'UTC',
49+ CURRENT_TIMESTAMP AT TIME ZONE 'UTC'
50+ FROM DistroArchSeriesFilter AS dasf
51+ LEFT JOIN DistroArchSeries AS olddas ON
52+ dasf.distroarchseries = olddas.id
53+ LEFT JOIN DistroArchSeries AS newdas ON
54+ newdas.distroseries = %s
55+ AND newdas.architecturetag = olddas.architecturetag
56+ WHERE
57+ dasf.packageset = %s
58+ AND olddas.distroseries = %s
59+ AND newdas.id IS NOT NULL
60+ """ % sqlvalues(
61+ child_ps.id, self.distroseries.id,
62+ parent_ps.id, parent_ps.distroseries.id))
63 # Copy the relations between sets, and the contents.
64 for old_series_ps, new_series_ps in parent_to_child.items():
65 old_series_sets = old_series_ps.setsIncluded(
66
67=== modified file 'lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py'
68--- lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py 2019-04-16 10:29:22 +0000
69+++ lib/lp/soyuz/scripts/tests/test_initialize_distroseries.py 2019-09-27 12:36:02 +0000
70@@ -5,6 +5,7 @@
71
72 __metaclass__ = type
73
74+from testtools.matchers import MatchesStructure
75 import transaction
76 from zope.component import getUtility
77
78@@ -22,6 +23,7 @@
79 from lp.services.database.interfaces import IStore
80 from lp.soyuz.enums import (
81 ArchivePurpose,
82+ DistroArchSeriesFilterSense,
83 IndexCompressionType,
84 PackageUploadStatus,
85 SourcePackageFormat,
86@@ -829,6 +831,56 @@
87 releaser, pocket=PackagePublishingPocket.RELEASE,
88 distroseries=series))
89
90+ def test_intra_distro_filter_copying(self):
91+ # If child.distribution equals parent.distribution, we also copy any
92+ # DAS filters.
93+ parent, parent_das1 = self.setupParent(proc='386', arch_tag='i386')
94+ _, parent_das2 = self.setupParent(
95+ parent=parent, proc='amd64', arch_tag='amd64')
96+ _, parent_das3 = self.setupParent(
97+ parent=parent, proc='hppa', arch_tag='hppa')
98+ parent_dasf1 = self.factory.makeDistroArchSeriesFilter(
99+ distroarchseries=parent_das1,
100+ sense=DistroArchSeriesFilterSense.INCLUDE)
101+ parent_dasf2 = self.factory.makeDistroArchSeriesFilter(
102+ distroarchseries=parent_das2,
103+ sense=DistroArchSeriesFilterSense.EXCLUDE)
104+ # Create child series in the same distribution.
105+ child = self.factory.makeDistroSeries(
106+ distribution=parent.distribution, previous_series=parent)
107+ self._fullInitialize([parent], child=child)
108+
109+ # The child series has corresponding packagesets and DAS filters.
110+ parent_set1 = parent_dasf1.packageset
111+ parent_set2 = parent_dasf2.packageset
112+ child_set1 = getUtility(IPackagesetSet).getByName(
113+ child, parent_set1.name)
114+ child_set2 = getUtility(IPackagesetSet).getByName(
115+ child, parent_set2.name)
116+ self.assertEqual(parent_set1.description, child_set1.description)
117+ self.assertEqual(parent_set2.description, child_set2.description)
118+ self.assertEqual(parent_set1, child_set1.relatedSets().one())
119+ self.assertEqual(parent_set2, child_set2.relatedSets().one())
120+ self.assertThat(
121+ child['i386'].getFilter(), MatchesStructure.byEquality(
122+ packageset=child_set1,
123+ sense=DistroArchSeriesFilterSense.INCLUDE,
124+ creator=parent_dasf1.creator))
125+ self.assertThat(
126+ child['amd64'].getFilter(), MatchesStructure.byEquality(
127+ packageset=child_set2,
128+ sense=DistroArchSeriesFilterSense.EXCLUDE,
129+ creator=parent_dasf2.creator))
130+ self.assertIsNone(child['hppa'].getFilter())
131+
132+ def test_no_cross_distro_filter_copying(self):
133+ # No cross-distro DAS filter copying should happen.
134+ parent, parent_das = self.setupParent()
135+ self.factory.makeDistroArchSeriesFilter(distroarchseries=parent_das)
136+ child = self._fullInitialize([parent])
137+ for child_das in child.architectures:
138+ self.assertIsNone(child_das.getFilter())
139+
140 def test_packageset_owner_preserved_within_distro(self):
141 # When initializing a new series within a distro, the copied
142 # packagesets have ownership preserved.