Merge ~cjwatson/launchpad:version-lookup-as-text into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 609e834528f76747ca4e8ea7b2121451e74c611c
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:version-lookup-as-text
Merge into: launchpad:master
Prerequisite: ~cjwatson/launchpad:db-xpr-version-text
Diff against target: 368 lines (+114/-28)
10 files modified
lib/lp/registry/model/distributionsourcepackage.py (+1/-1)
lib/lp/registry/model/distroseriesdifference.py (+2/-1)
lib/lp/registry/model/sourcepackage.py (+4/-16)
lib/lp/registry/tests/test_distributionsourcepackage.py (+19/-1)
lib/lp/soyuz/model/archive.py (+7/-4)
lib/lp/soyuz/model/distroarchseriesbinarypackage.py (+2/-1)
lib/lp/soyuz/model/publishing.py (+2/-1)
lib/lp/soyuz/model/queue.py (+2/-1)
lib/lp/soyuz/scripts/gina/handlers.py (+2/-2)
lib/lp/soyuz/tests/test_archive.py (+73/-0)
Reviewer Review Type Date Requested Status
Ioana Lasc (community) Approve
Review via email: mp+389597@code.launchpad.net

Commit message

Match source/binary versions as exact strings

Description of the change

There is one case in the primary archive of a package (libapache-authznetldap-perl) with both 0.7-4 and 0.07-4 versions, which compare equal according to Debian version comparison rules and thus the debversion type, but are obviously unequal strings. Adjust version-based lookups to match versions as text strings rather than as versions.

To post a comment you must log in.
Revision history for this message
Ioana Lasc (ilasc) wrote :

nice set of tests as usual.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/lib/lp/registry/model/distributionsourcepackage.py b/lib/lp/registry/model/distributionsourcepackage.py
index 9e40f02..da4a021 100644
--- a/lib/lp/registry/model/distributionsourcepackage.py
+++ b/lib/lp/registry/model/distributionsourcepackage.py
@@ -261,7 +261,7 @@ class DistributionSourcePackage(BugTargetBase,
261 SourcePackageRelease.id AND261 SourcePackageRelease.id AND
262 SourcePackagePublishingHistory.sourcepackagename = %s AND262 SourcePackagePublishingHistory.sourcepackagename = %s AND
263 SourcePackageRelease.sourcepackagename = %s AND263 SourcePackageRelease.sourcepackagename = %s AND
264 SourcePackageRelease.version = %s264 SourcePackageRelease.version::text = %s
265 """ % sqlvalues(self.distribution,265 """ % sqlvalues(self.distribution,
266 self.distribution.all_distro_archive_ids,266 self.distribution.all_distro_archive_ids,
267 self.sourcepackagename,267 self.sourcepackagename,
diff --git a/lib/lp/registry/model/distroseriesdifference.py b/lib/lp/registry/model/distroseriesdifference.py
index 1735ea6..3cdcd16 100644
--- a/lib/lp/registry/model/distroseriesdifference.py
+++ b/lib/lp/registry/model/distroseriesdifference.py
@@ -23,6 +23,7 @@ import six
23from sqlobject import StringCol23from sqlobject import StringCol
24from storm.expr import (24from storm.expr import (
25 And,25 And,
26 Cast,
26 Column,27 Column,
27 Desc,28 Desc,
28 Or,29 Or,
@@ -147,7 +148,7 @@ def most_recent_publications(dsds, in_parent, statuses, match_version=False):
147 conditions,148 conditions,
148 SourcePackageRelease.id ==149 SourcePackageRelease.id ==
149 SourcePackagePublishingHistory.sourcepackagereleaseID,150 SourcePackagePublishingHistory.sourcepackagereleaseID,
150 SourcePackageRelease.version == version_col,151 Cast(SourcePackageRelease.version, "text") == version_col,
151 )152 )
152 # The sort order is critical so that the DISTINCT ON clause selects the153 # The sort order is critical so that the DISTINCT ON clause selects the
153 # most recent publication (i.e. the one with the highest id).154 # most recent publication (i.e. the one with the highest id).
diff --git a/lib/lp/registry/model/sourcepackage.py b/lib/lp/registry/model/sourcepackage.py
index 42da907..9e40417 100644
--- a/lib/lp/registry/model/sourcepackage.py
+++ b/lib/lp/registry/model/sourcepackage.py
@@ -217,12 +217,11 @@ class SourcePackage(BugTargetBase, HasCodeImportsMixin,
217 return '<%s %r %r %r>' % (self.__class__.__name__,217 return '<%s %r %r %r>' % (self.__class__.__name__,
218 self.distribution, self.distroseries, self.sourcepackagename)218 self.distribution, self.distroseries, self.sourcepackagename)
219219
220 def _getPublishingHistory(self, version=None, include_status=None,220 def _getPublishingHistory(self, include_status=None, order_by=None):
221 exclude_status=None, order_by=None):
222 """Build a query and return a list of SourcePackagePublishingHistory.221 """Build a query and return a list of SourcePackagePublishingHistory.
223222
224 This is mainly a helper function for this class so that code is223 This is mainly a helper function for this class so that code is
225 not duplicated. include_status and exclude_status must be a sequence.224 not duplicated. include_status must be a sequence.
226 """225 """
227 clauses = []226 clauses = []
228 clauses.append(227 clauses.append(
@@ -235,9 +234,6 @@ class SourcePackage(BugTargetBase, HasCodeImportsMixin,
235 self.sourcepackagename,234 self.sourcepackagename,
236 self.distroseries,235 self.distroseries,
237 self.distribution.all_distro_archive_ids))236 self.distribution.all_distro_archive_ids))
238 if version:
239 clauses.append(
240 "SourcePackageRelease.version = %s" % sqlvalues(version))
241237
242 if include_status:238 if include_status:
243 if not isinstance(include_status, list):239 if not isinstance(include_status, list):
@@ -245,12 +241,6 @@ class SourcePackage(BugTargetBase, HasCodeImportsMixin,
245 clauses.append("SourcePackagePublishingHistory.status IN %s"241 clauses.append("SourcePackagePublishingHistory.status IN %s"
246 % sqlvalues(include_status))242 % sqlvalues(include_status))
247243
248 if exclude_status:
249 if not isinstance(exclude_status, list):
250 exclude_status = list(exclude_status)
251 clauses.append("SourcePackagePublishingHistory.status NOT IN %s"
252 % sqlvalues(exclude_status))
253
254 query = " AND ".join(clauses)244 query = " AND ".join(clauses)
255245
256 if not order_by:246 if not order_by:
@@ -260,12 +250,10 @@ class SourcePackage(BugTargetBase, HasCodeImportsMixin,
260 query, orderBy=order_by, clauseTables=['SourcePackageRelease'],250 query, orderBy=order_by, clauseTables=['SourcePackageRelease'],
261 prejoinClauseTables=['SourcePackageRelease'])251 prejoinClauseTables=['SourcePackageRelease'])
262252
263 def _getFirstPublishingHistory(self, version=None, include_status=None,253 def _getFirstPublishingHistory(self, include_status=None, order_by=None):
264 exclude_status=None, order_by=None):
265 """As _getPublishingHistory, but just returns the first item."""254 """As _getPublishingHistory, but just returns the first item."""
266 try:255 try:
267 package = self._getPublishingHistory(256 package = self._getPublishingHistory(include_status, order_by)[0]
268 version, include_status, exclude_status, order_by)[0]
269 except IndexError:257 except IndexError:
270 return None258 return None
271 else:259 else:
diff --git a/lib/lp/registry/tests/test_distributionsourcepackage.py b/lib/lp/registry/tests/test_distributionsourcepackage.py
index 15da65e..677d080 100644
--- a/lib/lp/registry/tests/test_distributionsourcepackage.py
+++ b/lib/lp/registry/tests/test_distributionsourcepackage.py
@@ -6,7 +6,10 @@
6__metaclass__ = type6__metaclass__ = type
77
8from storm.store import Store8from storm.store import Store
9from testtools.matchers import Equals9from testtools.matchers import (
10 Equals,
11 MatchesStructure,
12 )
10import transaction13import transaction
11from zope.component import getUtility14from zope.component import getUtility
12from zope.security.proxy import removeSecurityProxy15from zope.security.proxy import removeSecurityProxy
@@ -165,6 +168,21 @@ class TestDistributionSourcePackage(TestCaseWithFactory):
165 driver = distribution.drivers[0]168 driver = distribution.drivers[0]
166 self.assertTrue(dsp.personHasDriverRights(driver))169 self.assertTrue(dsp.personHasDriverRights(driver))
167170
171 def test_getVersion_matches_version_as_text(self):
172 # Versions such as 0.7-4 and 0.07-4 are equal according to the
173 # "debversion" type, but for lookup purposes we compare the text of
174 # the version strings exactly.
175 distribution = self.factory.makeDistribution()
176 dsp = self.factory.makeDistributionSourcePackage(
177 distribution=distribution)
178 spph = self.factory.makeSourcePackagePublishingHistory(
179 archive=distribution.main_archive,
180 sourcepackagename=dsp.sourcepackagename, version="0.7-4")
181 self.assertThat(dsp.getVersion("0.7-4"), MatchesStructure.byEquality(
182 distribution=distribution,
183 sourcepackagerelease=spph.sourcepackagerelease))
184 self.assertIsNone(dsp.getVersion("0.07-4"))
185
168186
169class TestDistributionSourcePackageFindRelatedArchives(TestCaseWithFactory):187class TestDistributionSourcePackageFindRelatedArchives(TestCaseWithFactory):
170188
diff --git a/lib/lp/soyuz/model/archive.py b/lib/lp/soyuz/model/archive.py
index f5f711b..3217e1d 100644
--- a/lib/lp/soyuz/model/archive.py
+++ b/lib/lp/soyuz/model/archive.py
@@ -26,6 +26,7 @@ from sqlobject import (
26from storm.base import Storm26from storm.base import Storm
27from storm.expr import (27from storm.expr import (
28 And,28 And,
29 Cast,
29 Count,30 Count,
30 Desc,31 Desc,
31 Join,32 Join,
@@ -656,7 +657,8 @@ class Archive(SQLBase):
656 raise VersionRequiresName(657 raise VersionRequiresName(
657 "The 'version' parameter can be used only together with"658 "The 'version' parameter can be used only together with"
658 " the 'name' parameter.")659 " the 'name' parameter.")
659 clauses.append(SourcePackageRelease.version == version)660 clauses.append(
661 Cast(SourcePackageRelease.version, "text") == version)
660 elif not order_by_date:662 elif not order_by_date:
661 order_by.insert(1, Desc(SourcePackageRelease.version))663 order_by.insert(1, Desc(SourcePackageRelease.version))
662664
@@ -854,7 +856,8 @@ class Archive(SQLBase):
854 "The 'version' parameter can be used only together with"856 "The 'version' parameter can be used only together with"
855 " the 'name' parameter.")857 " the 'name' parameter.")
856858
857 clauses.append(BinaryPackageRelease.version == version)859 clauses.append(
860 Cast(BinaryPackageRelease.version, "text") == version)
858 elif ordered:861 elif ordered:
859 order_by.insert(1, Desc(BinaryPackageRelease.version))862 order_by.insert(1, Desc(BinaryPackageRelease.version))
860863
@@ -1726,7 +1729,7 @@ class Archive(SQLBase):
1726 SourcePackageRelease.id,1729 SourcePackageRelease.id,
1727 SourcePackageRelease.sourcepackagename == SourcePackageName.id,1730 SourcePackageRelease.sourcepackagename == SourcePackageName.id,
1728 SourcePackageName.name == name,1731 SourcePackageName.name == name,
1729 SourcePackageRelease.version == version,1732 Cast(SourcePackageRelease.version, "text") == version,
1730 SourcePackageRelease.id ==1733 SourcePackageRelease.id ==
1731 SourcePackageReleaseFile.sourcepackagereleaseID,1734 SourcePackageReleaseFile.sourcepackagereleaseID,
1732 SourcePackageReleaseFile.libraryfileID == LibraryFileAlias.id,1735 SourcePackageReleaseFile.libraryfileID == LibraryFileAlias.id,
@@ -1750,7 +1753,7 @@ class Archive(SQLBase):
1750 BinaryPackagePublishingHistory.binarypackagename == name,1753 BinaryPackagePublishingHistory.binarypackagename == name,
1751 BinaryPackagePublishingHistory.binarypackagereleaseID ==1754 BinaryPackagePublishingHistory.binarypackagereleaseID ==
1752 BinaryPackageRelease.id,1755 BinaryPackageRelease.id,
1753 BinaryPackageRelease.version == version,1756 Cast(BinaryPackageRelease.version, "text") == version,
1754 BinaryPackageBuild.id == BinaryPackageRelease.buildID,1757 BinaryPackageBuild.id == BinaryPackageRelease.buildID,
1755 DistroArchSeries.id == BinaryPackageBuild.distro_arch_series_id,1758 DistroArchSeries.id == BinaryPackageBuild.distro_arch_series_id,
1756 DistroArchSeries.architecturetag == archtag,1759 DistroArchSeries.architecturetag == archtag,
diff --git a/lib/lp/soyuz/model/distroarchseriesbinarypackage.py b/lib/lp/soyuz/model/distroarchseriesbinarypackage.py
index 180a874..a2a92f5 100644
--- a/lib/lp/soyuz/model/distroarchseriesbinarypackage.py
+++ b/lib/lp/soyuz/model/distroarchseriesbinarypackage.py
@@ -9,6 +9,7 @@ __all__ = [
9 'DistroArchSeriesBinaryPackage',9 'DistroArchSeriesBinaryPackage',
10 ]10 ]
1111
12from storm.expr import Cast
12from storm.locals import Desc13from storm.locals import Desc
13from zope.interface import implementer14from zope.interface import implementer
1415
@@ -120,7 +121,7 @@ class DistroArchSeriesBinaryPackage:
120 """See IDistroArchSeriesBinaryPackage."""121 """See IDistroArchSeriesBinaryPackage."""
121 bpph = IStore(BinaryPackagePublishingHistory).find(122 bpph = IStore(BinaryPackagePublishingHistory).find(
122 BinaryPackagePublishingHistory,123 BinaryPackagePublishingHistory,
123 BinaryPackageRelease.version == version,124 Cast(BinaryPackageRelease.version, "text") == version,
124 *self._getPublicationJoins()125 *self._getPublicationJoins()
125 ).order_by(Desc(BinaryPackagePublishingHistory.datecreated)126 ).order_by(Desc(BinaryPackagePublishingHistory.datecreated)
126 ).first()127 ).first()
diff --git a/lib/lp/soyuz/model/publishing.py b/lib/lp/soyuz/model/publishing.py
index 5e6173a..52ffae4 100644
--- a/lib/lp/soyuz/model/publishing.py
+++ b/lib/lp/soyuz/model/publishing.py
@@ -30,6 +30,7 @@ from sqlobject import (
30 )30 )
31from storm.expr import (31from storm.expr import (
32 And,32 And,
33 Cast,
33 Desc,34 Desc,
34 Join,35 Join,
35 LeftJoin,36 LeftJoin,
@@ -1061,7 +1062,7 @@ class PublishingSet:
1061 BinaryPackagePublishingHistory.distroarchseriesID == das.id,1062 BinaryPackagePublishingHistory.distroarchseriesID == das.id,
1062 BinaryPackagePublishingHistory.binarypackagenameID ==1063 BinaryPackagePublishingHistory.binarypackagenameID ==
1063 bpr.binarypackagenameID,1064 bpr.binarypackagenameID,
1064 BinaryPackageRelease.version == bpr.version,1065 Cast(BinaryPackageRelease.version, "text") == bpr.version,
1065 )1066 )
10661067
1067 candidates = (1068 candidates = (
diff --git a/lib/lp/soyuz/model/queue.py b/lib/lp/soyuz/model/queue.py
index 82e02a9..6465bd8 100644
--- a/lib/lp/soyuz/model/queue.py
+++ b/lib/lp/soyuz/model/queue.py
@@ -23,6 +23,7 @@ from sqlobject import (
23 SQLObjectNotFound,23 SQLObjectNotFound,
24 StringCol,24 StringCol,
25 )25 )
26from storm.expr import Cast
26from storm.locals import (27from storm.locals import (
27 And,28 And,
28 Desc,29 Desc,
@@ -1487,7 +1488,7 @@ class PackageUploadSet:
1487 PackageUpload.status.is_in(approved_status),1488 PackageUpload.status.is_in(approved_status),
1488 PackageUpload.archive == archive,1489 PackageUpload.archive == archive,
1489 DistroSeries.distribution == distribution,1490 DistroSeries.distribution == distribution,
1490 SourcePackageRelease.version == version,1491 Cast(SourcePackageRelease.version, "text") == version,
1491 SourcePackageName.name == name)1492 SourcePackageName.name == name)
14921493
1493 return conflicts.one()1494 return conflicts.one()
diff --git a/lib/lp/soyuz/scripts/gina/handlers.py b/lib/lp/soyuz/scripts/gina/handlers.py
index 597e5aa..99c8166 100644
--- a/lib/lp/soyuz/scripts/gina/handlers.py
+++ b/lib/lp/soyuz/scripts/gina/handlers.py
@@ -560,7 +560,7 @@ class SourcePackageHandler:
560 # the distribution, no matter what status.560 # the distribution, no matter what status.
561 query = """561 query = """
562 SourcePackageRelease.sourcepackagename = %s AND562 SourcePackageRelease.sourcepackagename = %s AND
563 SourcePackageRelease.version = %s AND563 SourcePackageRelease.version::text = %s AND
564 SourcePackagePublishingHistory.sourcepackagerelease =564 SourcePackagePublishingHistory.sourcepackagerelease =
565 SourcePackageRelease.id AND565 SourcePackageRelease.id AND
566 SourcePackagePublishingHistory.distroseries =566 SourcePackagePublishingHistory.distroseries =
@@ -762,7 +762,7 @@ class BinaryPackageHandler:
762 "BinaryPackageRelease.id ="762 "BinaryPackageRelease.id ="
763 " BinaryPackagePublishingHistory.binarypackagerelease AND "763 " BinaryPackagePublishingHistory.binarypackagerelease AND "
764 "BinaryPackageRelease.binarypackagename=%s AND "764 "BinaryPackageRelease.binarypackagename=%s AND "
765 "BinaryPackageRelease.version=%s AND "765 "BinaryPackageRelease.version::text = %s AND "
766 "BinaryPackageRelease.build = BinaryPackageBuild.id AND "766 "BinaryPackageRelease.build = BinaryPackageBuild.id AND "
767 "BinaryPackageBuild.distro_arch_series = DistroArchSeries.id AND "767 "BinaryPackageBuild.distro_arch_series = DistroArchSeries.id AND "
768 "DistroArchSeries.distroseries = DistroSeries.id AND "768 "DistroArchSeries.distroseries = DistroSeries.id AND "
diff --git a/lib/lp/soyuz/tests/test_archive.py b/lib/lp/soyuz/tests/test_archive.py
index b015953..91acf53 100644
--- a/lib/lp/soyuz/tests/test_archive.py
+++ b/lib/lp/soyuz/tests/test_archive.py
@@ -1565,6 +1565,23 @@ class TestGetBinaryPackageRelease(TestCaseWithFactory):
1565 self.factory.makeArchive().getBinaryPackageRelease(1565 self.factory.makeArchive().getBinaryPackageRelease(
1566 self.bpns['foo-bin'], '1.2.3-4', 'i386'))1566 self.bpns['foo-bin'], '1.2.3-4', 'i386'))
15671567
1568 def test_matches_version_as_text(self):
1569 # Versions such as 1.2.3-4 and 1.02.003-4 are equal according to the
1570 # "debversion" type, but for lookup purposes we compare the text of
1571 # the version strings exactly.
1572 other_i386_pub, other_hppa_pub = self.publisher.getPubBinaries(
1573 version='1.02.003-4', archive=self.archive, binaryname='foo-bin',
1574 status=PackagePublishingStatus.PUBLISHED,
1575 architecturespecific=True)
1576 self.assertEqual(
1577 self.i386_pub.binarypackagerelease,
1578 self.archive.getBinaryPackageRelease(
1579 self.bpns['foo-bin'], '1.2.3-4', 'i386'))
1580 self.assertEqual(
1581 other_i386_pub.binarypackagerelease,
1582 self.archive.getBinaryPackageRelease(
1583 self.bpns['foo-bin'], '1.02.003-4', 'i386'))
1584
15681585
1569class TestGetBinaryPackageReleaseByFileName(TestCaseWithFactory):1586class TestGetBinaryPackageReleaseByFileName(TestCaseWithFactory):
1570 """Ensure that getBinaryPackageReleaseByFileName works as expected."""1587 """Ensure that getBinaryPackageReleaseByFileName works as expected."""
@@ -2594,6 +2611,28 @@ class TestGetSourceFileByName(TestCaseWithFactory):
2594 pub2.source_package_name, pub2.source_package_version,2611 pub2.source_package_name, pub2.source_package_version,
2595 dsc2.filename))2612 dsc2.filename))
25962613
2614 def test_matches_version_as_text(self):
2615 # Versions such as 0.7-4 and 0.7-04 are equal according to the
2616 # "debversion" type, but for lookup purposes we compare the text of
2617 # the version strings exactly.
2618 pub = self.factory.makeSourcePackagePublishingHistory(
2619 archive=self.archive, version='0.7-4')
2620 orig = self.factory.makeLibraryFileAlias(
2621 filename='foo_0.7.orig.tar.gz')
2622 pub.sourcepackagerelease.addFile(orig)
2623 pub2 = self.factory.makeSourcePackagePublishingHistory(
2624 archive=self.archive, sourcepackagename=pub.sourcepackagename.name,
2625 version='0.7-04')
2626 orig2 = self.factory.makeLibraryFileAlias(
2627 filename='foo_0.7.orig.tar.gz')
2628 pub2.sourcepackagerelease.addFile(orig2)
2629 self.assertEqual(
2630 orig, self.archive.getSourceFileByName(
2631 pub.sourcepackagename.name, '0.7-4', orig.filename))
2632 self.assertEqual(
2633 orig2, self.archive.getSourceFileByName(
2634 pub.sourcepackagename.name, '0.7-04', orig2.filename))
2635
25972636
2598class TestGetPublishedSources(TestCaseWithFactory):2637class TestGetPublishedSources(TestCaseWithFactory):
25992638
@@ -2744,6 +2783,22 @@ class TestGetPublishedSources(TestCaseWithFactory):
2744 [pubs[i] for i in (3, 2, 1, 0, 4)],2783 [pubs[i] for i in (3, 2, 1, 0, 4)],
2745 list(archive.getPublishedSources(order_by_date=True)))2784 list(archive.getPublishedSources(order_by_date=True)))
27462785
2786 def test_matches_version_as_text(self):
2787 # Versions such as 0.7-4 and 0.07-4 are equal according to the
2788 # "debversion" type, but for lookup purposes we compare the text of
2789 # the version strings exactly.
2790 archive = self.factory.makeArchive()
2791 pub = self.factory.makeSourcePackagePublishingHistory(
2792 archive=archive, version='0.7-4')
2793 self.assertEqual(
2794 [pub], list(archive.getPublishedSources(
2795 name=pub.sourcepackagename.name, version='0.7-4',
2796 exact_match=True)))
2797 self.assertEqual(
2798 [], list(archive.getPublishedSources(
2799 name=pub.sourcepackagename.name, version='0.07-4',
2800 exact_match=True)))
2801
27472802
2748class TestGetPublishedSourcesWebService(TestCaseWithFactory):2803class TestGetPublishedSourcesWebService(TestCaseWithFactory):
27492804
@@ -3499,6 +3554,24 @@ class TestgetAllPublishedBinaries(TestCaseWithFactory):
3499 [pubs[i] for i in (3, 2, 1, 0, 4)],3554 [pubs[i] for i in (3, 2, 1, 0, 4)],
3500 list(archive.getAllPublishedBinaries(order_by_date=True)))3555 list(archive.getAllPublishedBinaries(order_by_date=True)))
35013556
3557 def test_matches_version_as_text(self):
3558 # Versions such as 0.7-4 and 0.07-4 are equal according to the
3559 # "debversion" type, but for lookup purposes we compare the text of
3560 # the version strings exactly.
3561 archive = self.factory.makeArchive()
3562 pub = self.factory.makeBinaryPackagePublishingHistory(
3563 archive=archive, version='0.7-4')
3564 self.assertEqual(
3565 [pub],
3566 list(archive.getAllPublishedBinaries(
3567 name=pub.binarypackagename.name, version='0.7-4',
3568 exact_match=True)))
3569 self.assertEqual(
3570 [],
3571 list(archive.getAllPublishedBinaries(
3572 name=pub.binarypackagename.name, version='0.07-4',
3573 exact_match=True)))
3574
35023575
3503class TestRemovingPermissions(TestCaseWithFactory):3576class TestRemovingPermissions(TestCaseWithFactory):
35043577

Subscribers

People subscribed via source and target branches

to status/vote changes: