Merge lp:~jtv/launchpad/bug-806946 into lp:launchpad

Proposed by Jeroen T. Vermeulen
Status: Merged
Approved by: Stuart Bishop
Approved revision: no longer in the source branch.
Merged at revision: 13417
Proposed branch: lp:~jtv/launchpad/bug-806946
Merge into: lp:launchpad
Diff against target: 189 lines (+71/-14)
7 files modified
lib/lp/registry/browser/distroseries.py (+1/-1)
lib/lp/registry/interfaces/distroseriesdifference.py (+5/-4)
lib/lp/registry/model/distroseries.py (+1/-1)
lib/lp/registry/model/distroseriesdifference.py (+20/-5)
lib/lp/registry/tests/test_distroseriesdifference.py (+41/-0)
lib/lp/soyuz/interfaces/packageset.py (+2/-1)
lib/lp/soyuz/model/packagecopyjob.py (+1/-2)
To merge this branch: bzr merge lp:~jtv/launchpad/bug-806946
Reviewer Review Type Date Requested Status
Stuart Bishop (community) Approve
Review via email: mp+67302@code.launchpad.net

Commit message

[r=stub][bug=806946] Packageset name search on +localpackagediffs.

Description of the change

= Summary =

There's a package-name search box on +localpackagediffs. When the name matches that of a packageset for the context distroseries, we want the page to show packages from that packageset.

== Proposed fix ==

This is a model change only. The UI and the web-service API may also need updating once we know that this performs well enough.

== Pre-implementation notes ==

It was wisely decided to honour only exact matches on packageset names. Ordering of results should not be affected.

== Implementation details ==

I did not widen the main search join, because it may affect ordering and uniqueness to a painful extent. Instead there's a one-off sub-query that I hope the query optimizer will execute separately, and quickly.

There was a weird failure on the JavaScript test test_distroseries.js, when run from the command line with -t test_distroseries. It does pass when run from the browser, or with -t javascript as a test selector. Ian's currently landing JS test cleanup may fix that; I am inclined to believe that it's not related to my changes here. An EC2 test is underway to verify this.

== Tests ==

{{{
./bin/test -vvc lp.registry.tests.test_distroseriesdifference
}}}

== Demo and Q/A ==

Go to https://dogfood.launchpad.net/ubuntu/oneiric/+localpackagediffs and try entering a packageset name, such as "core" into the package name filter.

Pay particular attention to performance. There probably won't be any noticeable effect if the name you enter is not a packageset name, but when it is, performance needs watching.

= Launchpad lint =

There's one bit of pre-existing lint where somebody else's branch had a problem. Rather than touching it myself, I notified the author and it's being fixed.

Checking for conflicts and issues in changed files.

Linting changed files:
  lib/lp/registry/tests/test_distroseriesdifference.py
  lib/lp/soyuz/model/packagecopyjob.py
  lib/lp/registry/interfaces/distroseriesdifference.py
  lib/lp/soyuz/interfaces/packageset.py
  lib/lp/registry/model/distroseriesdifference.py
  lib/lp/registry/model/distroseries.py
  lib/lp/registry/browser/distroseries.py

./lib/lp/soyuz/model/packagecopyjob.py
     487: W291 trailing whitespace

To post a comment you must log in.
Revision history for this message
Stuart Bishop (stub) wrote :

All good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/registry/browser/distroseries.py'
2--- lib/lp/registry/browser/distroseries.py 2011-07-07 18:02:34 +0000
3+++ lib/lp/registry/browser/distroseries.py 2011-07-08 10:08:21 +0000
4@@ -1054,7 +1054,7 @@
5 differences = getUtility(
6 IDistroSeriesDifferenceSource).getForDistroSeries(
7 self.context, difference_type=self.differences_type,
8- source_package_name_filter=self.specified_name_filter,
9+ name_filter=self.specified_name_filter,
10 status=status, child_version_higher=child_version_higher)
11 return BatchNavigator(differences, self.request)
12
13
14=== modified file 'lib/lp/registry/interfaces/distroseriesdifference.py'
15--- lib/lp/registry/interfaces/distroseriesdifference.py 2011-07-01 15:53:38 +0000
16+++ lib/lp/registry/interfaces/distroseriesdifference.py 2011-07-08 10:08:21 +0000
17@@ -294,7 +294,7 @@
18 def getForDistroSeries(
19 distro_series,
20 difference_type=None,
21- source_package_name_filter=None,
22+ name_filter=None,
23 status=None,
24 child_version_higher=False,
25 parent_series=None,
26@@ -308,9 +308,10 @@
27 :param difference_type: The type of difference to include in the
28 results.
29 :type difference_type: `DistroSeriesDifferenceType`.
30- :param source_package_name_filter: Name of a source package. If
31- given, restricts the search to this package.
32- :type source_package_name_filter: unicode.
33+ :param name_filter: Name of either a source package or a package set
34+ to look for. If given, return only packages whose name matches
35+ this string, or that are in a `Packageset` those name matches it.
36+ :type name_filter: unicode.
37 :param status: Only differences matching the status(es) will be
38 included.
39 :type status: `DistroSeriesDifferenceStatus`.
40
41=== modified file 'lib/lp/registry/model/distroseries.py'
42--- lib/lp/registry/model/distroseries.py 2011-07-07 08:56:35 +0000
43+++ lib/lp/registry/model/distroseries.py 2011-07-08 10:08:21 +0000
44@@ -1871,7 +1871,7 @@
45 IDistroSeriesDifferenceSource).getForDistroSeries(
46 self,
47 difference_type=difference_type,
48- source_package_name_filter=source_package_name_filter,
49+ name_filter=source_package_name_filter,
50 status=status,
51 child_version_higher=child_version_higher)
52
53
54=== modified file 'lib/lp/registry/model/distroseriesdifference.py'
55--- lib/lp/registry/model/distroseriesdifference.py 2011-07-01 15:53:38 +0000
56+++ lib/lp/registry/model/distroseriesdifference.py 2011-07-08 10:08:21 +0000
57@@ -25,6 +25,7 @@
58 And,
59 Column,
60 Desc,
61+ Or,
62 Select,
63 Table,
64 )
65@@ -88,7 +89,10 @@
66 PackagePublishingStatus,
67 )
68 from lp.soyuz.interfaces.packagediff import IPackageDiffSet
69-from lp.soyuz.interfaces.packageset import IPackagesetSet
70+from lp.soyuz.interfaces.packageset import (
71+ IPackagesetSet,
72+ NoSuchPackageSet,
73+ )
74 from lp.soyuz.model.archive import Archive
75 from lp.soyuz.model.distributionsourcepackagerelease import (
76 DistributionSourcePackageRelease,
77@@ -333,7 +337,7 @@
78 def getForDistroSeries(
79 distro_series,
80 difference_type=None,
81- source_package_name_filter=None,
82+ name_filter=None,
83 status=None,
84 child_version_higher=False,
85 parent_series=None,
86@@ -360,9 +364,20 @@
87 conditions.extend([
88 DistroSeriesDifference.parent_series == parent_series.id])
89
90- if source_package_name_filter:
91- conditions.extend([
92- SourcePackageName.name == source_package_name_filter])
93+ if name_filter:
94+ name_matches = [SourcePackageName.name == name_filter]
95+ try:
96+ packageset = getUtility(IPackagesetSet).getByName(
97+ name_filter, distroseries=distro_series)
98+ except NoSuchPackageSet:
99+ packageset = None
100+ if packageset is not None:
101+ name_matches.append(
102+ DistroSeriesDifference.source_package_name_id.is_in(
103+ Select(
104+ PackagesetSources.sourcepackagename_id,
105+ PackagesetSources.packageset == packageset)))
106+ conditions.extend([Or(*name_matches)])
107
108 if child_version_higher:
109 conditions.extend([
110
111=== modified file 'lib/lp/registry/tests/test_distroseriesdifference.py'
112--- lib/lp/registry/tests/test_distroseriesdifference.py 2011-07-01 15:53:38 +0000
113+++ lib/lp/registry/tests/test_distroseriesdifference.py 2011-07-08 10:08:21 +0000
114@@ -1023,6 +1023,47 @@
115
116 self.assertContentEqual(diffs['normal'] + diffs['ignored'], result)
117
118+ def test_getForDistroSeries_matches_by_package_name(self):
119+ dsd = self.factory.makeDistroSeriesDifference()
120+ series = dsd.derived_series
121+ package_name = dsd.source_package_name.name
122+ source = getUtility(IDistroSeriesDifferenceSource)
123+ self.assertContentEqual(
124+ [dsd],
125+ source.getForDistroSeries(series, name_filter=package_name))
126+
127+ def test_getForDistroSeries_matches_by_packageset_name(self):
128+ dsd = self.factory.makeDistroSeriesDifference()
129+ series = dsd.derived_series
130+ packageset = self.factory.makePackageset(
131+ distroseries=series, packages=[dsd.source_package_name])
132+ packageset_name = packageset.name
133+ source = getUtility(IDistroSeriesDifferenceSource)
134+ self.assertContentEqual(
135+ [dsd],
136+ source.getForDistroSeries(series, name_filter=packageset_name))
137+
138+ def test_getForDistroSeries_filters_by_package_and_packageset_name(self):
139+ dsd = self.factory.makeDistroSeriesDifference()
140+ series = dsd.derived_series
141+ other_name = self.factory.getUniqueUnicode()
142+ source = getUtility(IDistroSeriesDifferenceSource)
143+ self.assertContentEqual(
144+ [],
145+ source.getForDistroSeries(series, name_filter=other_name))
146+
147+ def test_getForDistroSeries_ignores_parent_packagesets(self):
148+ dsd = self.factory.makeDistroSeriesDifference()
149+ series = dsd.derived_series
150+ packageset = self.factory.makePackageset(
151+ distroseries=dsd.parent_series,
152+ packages=[dsd.source_package_name])
153+ packageset_name = packageset.name
154+ source = getUtility(IDistroSeriesDifferenceSource)
155+ self.assertContentEqual(
156+ [],
157+ source.getForDistroSeries(series, name_filter=packageset_name))
158+
159 def test_getForDistroSeries_sorted_by_package_name(self):
160 # The differences are sorted by package name.
161 derived_series = self.makeDerivedSeries()
162
163=== modified file 'lib/lp/soyuz/interfaces/packageset.py'
164--- lib/lp/soyuz/interfaces/packageset.py 2011-06-22 17:06:36 +0000
165+++ lib/lp/soyuz/interfaces/packageset.py 2011-07-08 10:08:21 +0000
166@@ -411,7 +411,8 @@
167 :param distroseries: the distroseries to which the new packageset
168 is related. Defaults to the current Ubuntu series.
169
170- :return: An `IPackageset` instance or None.
171+ :return: An `IPackageset` instance.
172+ :raise NoSuchPackageSet: if no package set is found.
173 """
174
175 @collection_default_content()
176
177=== modified file 'lib/lp/soyuz/model/packagecopyjob.py'
178--- lib/lp/soyuz/model/packagecopyjob.py 2011-07-07 10:31:38 +0000
179+++ lib/lp/soyuz/model/packagecopyjob.py 2011-07-08 10:08:21 +0000
180@@ -496,8 +496,7 @@
181 dsd_source = getUtility(IDistroSeriesDifferenceSource)
182 target_series = self.target_distroseries
183 candidates = dsd_source.getForDistroSeries(
184- distro_series=target_series,
185- source_package_name_filter=self.package_name)
186+ distro_series=target_series, name_filter=self.package_name)
187
188 # The job doesn't know what distroseries a given package is
189 # coming from, and the version number in the DSD may have