Colin Watson has proposed merging ~cjwatson/launchpad:stormify-binarypackagerelease into launchpad:master.
Commit message: Convert BinaryPackageRelease to Storm Requested reviews: Launchpad code reviewers (launchpad-reviewers) For more details, see: https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/446851 -- Your team Launchpad code reviewers is requested to review the proposed merge of ~cjwatson/launchpad:stormify-binarypackagerelease into launchpad:master.
diff --git a/lib/lp/archivepublisher/domination.py b/lib/lp/archivepublisher/domination.py index a8df607..b8a8eeb 100644 --- a/lib/lp/archivepublisher/domination.py +++ b/lib/lp/archivepublisher/domination.py @@ -340,7 +340,7 @@ def find_live_binary_versions_pass_2(sorted_pubs, cache): bpbs = load_related( BinaryPackageBuild, [pub.binarypackagerelease for pub in arch_indep_pubs], - ["buildID"], + ["build_id"], ) load_related(SourcePackageRelease, bpbs, ["source_package_release_id"]) @@ -655,7 +655,7 @@ class Dominator: ) main_clauses = bpph_location_clauses + [ BPR.id == BPPH.binarypackagerelease_id, - BPR.binarypackagenameID.is_in(candidate_binary_names), + BPR.binarypackagename_id.is_in(candidate_binary_names), BPR.binpackageformat != BinaryPackageFormat.DDEB, ] diff --git a/lib/lp/archivepublisher/model/ftparchive.py b/lib/lp/archivepublisher/model/ftparchive.py index 3492a7a..2745cb1 100644 --- a/lib/lp/archivepublisher/model/ftparchive.py +++ b/lib/lp/archivepublisher/model/ftparchive.py @@ -361,7 +361,7 @@ class FTPArchiveHandler: Join( BinaryPackageName, BinaryPackageName.id - == BinaryPackageRelease.binarypackagenameID, + == BinaryPackageRelease.binarypackagename_id, ), Join( DistroArchSeries, @@ -715,7 +715,7 @@ class FTPArchiveHandler: == BinaryPackagePublishingHistory.binarypackagerelease_id, BinaryPackageFile.binarypackagerelease_id == BinaryPackagePublishingHistory.binarypackagerelease_id, - BinaryPackageBuild.id == BinaryPackageRelease.buildID, + BinaryPackageBuild.id == BinaryPackageRelease.build_id, SourcePackageName.id == BinaryPackageBuild.source_package_name_id, LibraryFileAlias.id == BinaryPackageFile.libraryfile_id, DistroArchSeries.id diff --git a/lib/lp/archiveuploader/tests/test_uploadprocessor.py b/lib/lp/archiveuploader/tests/test_uploadprocessor.py index 1c4c37f..665bc0b 100644 --- a/lib/lp/archiveuploader/tests/test_uploadprocessor.py +++ b/lib/lp/archiveuploader/tests/test_uploadprocessor.py @@ -1161,8 +1161,10 @@ class TestUploadProcessor(StatsMixin, TestUploadProcessorBase): # Find the binarypackagerelease and check its component. foocomm_binname = BinaryPackageName.selectOneBy(name="foocomm") - foocomm_bpr = BinaryPackageRelease.selectOneBy( - binarypackagename=foocomm_binname + foocomm_bpr = ( + IStore(BinaryPackageRelease) + .find(BinaryPackageRelease, binarypackagename=foocomm_binname) + .one() ) self.assertEqual(foocomm_bpr.component.name, "partner") diff --git a/lib/lp/soyuz/browser/build.py b/lib/lp/soyuz/browser/build.py index 91e1e4e..354c852 100644 --- a/lib/lp/soyuz/browser/build.py +++ b/lib/lp/soyuz/browser/build.py @@ -215,8 +215,9 @@ class BuildView(LaunchpadView): """Whether or not binaries were already published for this build.""" # Binaries imported by gina (missing `PackageUpload` record) # are always published. - imported_binaries = self.package_upload is None and bool( - self.context.binarypackages + imported_binaries = ( + self.package_upload is None + and not self.context.binarypackages.is_empty() ) # Binaries uploaded from the buildds are published when the # corresponding `PackageUpload` status is DONE. diff --git a/lib/lp/soyuz/browser/queue.py b/lib/lp/soyuz/browser/queue.py index 7f12bd3..d187d9f 100644 --- a/lib/lp/soyuz/browser/queue.py +++ b/lib/lp/soyuz/browser/queue.py @@ -223,7 +223,7 @@ class QueueItemsView(LaunchpadView): SourcePackageRelease, puses, ["sourcepackagerelease_id"] ) bpbs = load_related(BinaryPackageBuild, pubs, ["build_id"]) - bprs = load_referencing(BinaryPackageRelease, bpbs, ["buildID"]) + bprs = load_referencing(BinaryPackageRelease, bpbs, ["build_id"]) source_files = load_referencing( SourcePackageReleaseFile, source_sprs, ["sourcepackagerelease_id"] ) diff --git a/lib/lp/soyuz/browser/tests/binarypackagerelease-views.rst b/lib/lp/soyuz/browser/tests/binarypackagerelease-views.rst index 126cf7e..3b1089f 100644 --- a/lib/lp/soyuz/browser/tests/binarypackagerelease-views.rst +++ b/lib/lp/soyuz/browser/tests/binarypackagerelease-views.rst @@ -2,10 +2,13 @@ BinaryPackageRelease Pages ========================== >>> from zope.component import getMultiAdapter + >>> from lp.services.database.interfaces import IStore >>> from lp.services.webapp.servers import LaunchpadTestRequest >>> from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease - >>> pmount_bin = BinaryPackageRelease.get(15) + >>> pmount_bin = IStore(BinaryPackageRelease).get( + ... BinaryPackageRelease, 15 + ... ) >>> print(pmount_bin.name) pmount >>> print(pmount_bin.version) diff --git a/lib/lp/soyuz/doc/binarypackagerelease.rst b/lib/lp/soyuz/doc/binarypackagerelease.rst index 6417eae..ffa2f3a 100644 --- a/lib/lp/soyuz/doc/binarypackagerelease.rst +++ b/lib/lp/soyuz/doc/binarypackagerelease.rst @@ -5,12 +5,15 @@ BinaryPackageRelease stores unique versions of binarypackagenames across build records. >>> from lp.testing import verifyObject + >>> from lp.services.database.interfaces import IStore >>> from lp.soyuz.interfaces.binarypackagerelease import ( ... IBinaryPackageRelease, ... ) >>> from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease - >>> firefox_bin_release = BinaryPackageRelease.get(12) + >>> firefox_bin_release = IStore(BinaryPackageRelease).get( + ... BinaryPackageRelease, 12 + ... ) >>> verifyObject(IBinaryPackageRelease, firefox_bin_release) True @@ -42,7 +45,9 @@ be quickly ascertained through a set operation. ... IBinaryPackageNameSet, ... ) >>> foobar_name = getUtility(IBinaryPackageNameSet)["foobar"] - >>> pmount_bin_release = BinaryPackageRelease.get(20) + >>> pmount_bin_release = IStore(BinaryPackageRelease).get( + ... BinaryPackageRelease, 20 + ... ) >>> name_ids = ( ... foobar_name.id, ... pmount_bin_release.binarypackagename.id, diff --git a/lib/lp/soyuz/doc/distroarchseriesbinarypackagerelease.rst b/lib/lp/soyuz/doc/distroarchseriesbinarypackagerelease.rst index 2138dde..c307b56 100644 --- a/lib/lp/soyuz/doc/distroarchseriesbinarypackagerelease.rst +++ b/lib/lp/soyuz/doc/distroarchseriesbinarypackagerelease.rst @@ -1,6 +1,7 @@ Distro Arch Release Binary Package Release ========================================== + >>> from lp.services.database.interfaces import IStore >>> from lp.soyuz.model.distroarchseriesbinarypackagerelease import ( ... DistroArchSeriesBinaryPackageRelease as DARBPR, ... ) @@ -16,11 +17,11 @@ Grab the relevant DARs and BPRs: >>> print(hoary.distroseries.name) hoary - >>> mf = BinaryPackageRelease.get(12) + >>> mf = IStore(BinaryPackageRelease).get(BinaryPackageRelease, 12) >>> print(mf.binarypackagename.name) mozilla-firefox - >>> pm = BinaryPackageRelease.get(15) + >>> pm = IStore(BinaryPackageRelease).get(BinaryPackageRelease, 15) >>> print(pm.binarypackagename.name) pmount diff --git a/lib/lp/soyuz/doc/gina-multiple-arch.rst b/lib/lp/soyuz/doc/gina-multiple-arch.rst index fa9ca09..3d16759 100644 --- a/lib/lp/soyuz/doc/gina-multiple-arch.rst +++ b/lib/lp/soyuz/doc/gina-multiple-arch.rst @@ -22,7 +22,9 @@ Get the current counts of stuff in the database: >>> orig_person_count = Person.select().count() >>> orig_tp_count = TeamParticipation.select().count() >>> orig_email_count = EmailAddress.select().count() - >>> orig_bpr_count = BinaryPackageRelease.select().count() + >>> orig_bpr_count = ( + ... IStore(BinaryPackageRelease).find(BinaryPackageRelease).count() + ... ) >>> orig_build_count = BinaryPackageBuild.select().count() >>> orig_sbpph_count = IStore(SBPPH).find(SBPPH).count() @@ -145,7 +147,10 @@ There are 4 binary packages generated by the two builds of the two source packages. We should only be publishing them into one distroarchseries: - >>> BinaryPackageRelease.select().count() - orig_bpr_count + >>> ( + ... IStore(BinaryPackageRelease).find(BinaryPackageRelease).count() + ... - orig_bpr_count + ... ) 4 >>> BinaryPackageBuild.select().count() - orig_build_count 2 @@ -168,8 +173,14 @@ Check that the source package was correctly imported: And that one of the packages in main is here too: >>> n = BinaryPackageName.selectOneBy(name="libgadu-dev") - >>> ekg = BinaryPackageRelease.selectOneBy( - ... binarypackagenameID=n.id, version="1:1.5-4ubuntu1.2" + >>> ekg = ( + ... IStore(BinaryPackageRelease) + ... .find( + ... BinaryPackageRelease, + ... binarypackagename=n, + ... version="1:1.5-4ubuntu1.2", + ... ) + ... .one() ... ) >>> print(ekg.section.name) libdevel @@ -186,8 +197,14 @@ component name. >>> from lp.soyuz.enums import PackagePublishingPriority >>> n = BinaryPackageName.selectOneBy(name="ekg") - >>> ekg = BinaryPackageRelease.selectOneBy( - ... binarypackagenameID=n.id, version="1:1.5-4ubuntu1.2" + >>> ekg = ( + ... IStore(BinaryPackageRelease) + ... .find( + ... BinaryPackageRelease, + ... binarypackagename=n, + ... version="1:1.5-4ubuntu1.2", + ... ) + ... .one() ... ) >>> print(ekg.section.name) net @@ -203,8 +220,12 @@ right place, updates the component, and creates it with a semi-bogus DSC. >>> n = BinaryPackageName.selectOneBy(name="bdftopcf") - >>> ekg = BinaryPackageRelease.selectOneBy( - ... binarypackagenameID=n.id, version="0.99.0-1" + >>> ekg = ( + ... IStore(BinaryPackageRelease) + ... .find( + ... BinaryPackageRelease, binarypackagename=n, version="0.99.0-1" + ... ) + ... .one() ... ) >>> print(ekg.section.name) x11 diff --git a/lib/lp/soyuz/doc/gina.rst b/lib/lp/soyuz/doc/gina.rst index 405cf53..c225f5c 100644 --- a/lib/lp/soyuz/doc/gina.rst +++ b/lib/lp/soyuz/doc/gina.rst @@ -29,7 +29,9 @@ Get the current counts of stuff in the database: >>> orig_person_count = Person.select().count() >>> orig_tp_count = TeamParticipation.select().count() >>> orig_email_count = EmailAddress.select().count() - >>> orig_bpr_count = BinaryPackageRelease.select().count() + >>> orig_bpr_count = ( + ... IStore(BinaryPackageRelease).find(BinaryPackageRelease).count() + ... ) >>> orig_build_count = BinaryPackageBuild.select().count() >>> orig_sbpph_count = IStore(SBPPH).find(SBPPH).count() >>> orig_sspph_main_count = ( @@ -422,7 +424,10 @@ We have 23 binary packages in breezy. db1-compat, ed, the 3 libcap packages and python-pam is unchanged. python-sqlite fails. The 5 ubuntu-meta packages work. - >>> BinaryPackageRelease.select().count() - orig_bpr_count + >>> ( + ... IStore(BinaryPackageRelease).find(BinaryPackageRelease).count() + ... - orig_bpr_count + ... ) 40 >>> BinaryPackageBuild.select().count() - orig_build_count 13 @@ -434,7 +439,11 @@ expected: >>> from lp.soyuz.model.binarypackagename import BinaryPackageName >>> n = BinaryPackageName.selectOneBy(name="rioutil") - >>> rio = BinaryPackageRelease.selectOneBy(binarypackagenameID=n.id) + >>> rio = ( + ... IStore(BinaryPackageRelease) + ... .find(BinaryPackageRelease, binarypackagename=n) + ... .one() + ... ) >>> print(rio.shlibdeps) librioutil 1 rioutil >>> print(rio.version) @@ -446,7 +455,11 @@ Test all the data got to the ed BPR intact, and that the missing priority was correctly munged to "extra": >>> n = BinaryPackageName.selectOneBy(name="ed") - >>> ed = BinaryPackageRelease.selectOneBy(binarypackagenameID=n.id) + >>> ed = ( + ... IStore(BinaryPackageRelease) + ... .find(BinaryPackageRelease, binarypackagename=n) + ... .one() + ... ) >>> print(ed.version) 0.2-20 >>> print(ed.build.processor.name) @@ -480,8 +493,12 @@ Check binary package libgjc-dev in Breezy. Its version number must differ from its source version number. >>> n = BinaryPackageName.selectOneBy(name="libgcj-dev") - >>> lib = BinaryPackageRelease.selectOneBy( - ... binarypackagenameID=n.id, version="4:4.0.1-3" + >>> lib = ( + ... IStore(BinaryPackageRelease) + ... .find( + ... BinaryPackageRelease, binarypackagename=n, version="4:4.0.1-3" + ... ) + ... .one() ... ) >>> print(lib.version) 4:4.0.1-3 @@ -493,8 +510,10 @@ its source version number. Check if the udeb was properly parsed and identified: >>> n = BinaryPackageName.selectOneBy(name="archive-copier") - >>> ac = BinaryPackageRelease.selectOneBy( - ... binarypackagenameID=n.id, version="0.1.5" + >>> ac = ( + ... IStore(BinaryPackageRelease) + ... .find(BinaryPackageRelease, binarypackagename=n, version="0.1.5") + ... .one() ... ) >>> print(ac.version) 0.1.5 @@ -512,8 +531,12 @@ Check if the udeb was properly parsed and identified: We check that the binary package publishing override facility works: >>> n = BinaryPackageName.selectOneBy(name="libdb1-compat") - >>> db1 = BinaryPackageRelease.selectOneBy( - ... binarypackagenameID=n.id, version="2.1.3-7" + >>> db1 = ( + ... IStore(BinaryPackageRelease) + ... .find( + ... BinaryPackageRelease, binarypackagename=n, version="2.1.3-7" + ... ) + ... .one() ... ) >>> for pub in ( ... IStore(BinaryPackagePublishingHistory) @@ -645,7 +668,10 @@ changed, etc. 13 >>> print(EmailAddress.select().count() - orig_email_count) 13 - >>> BinaryPackageRelease.select().count() - orig_bpr_count + >>> ( + ... IStore(BinaryPackageRelease).find(BinaryPackageRelease).count() + ... - orig_bpr_count + ... ) 40 >>> BinaryPackageBuild.select().count() - orig_build_count 13 diff --git a/lib/lp/soyuz/interfaces/binarypackagerelease.py b/lib/lp/soyuz/interfaces/binarypackagerelease.py index 8ed59ff..22a0685 100644 --- a/lib/lp/soyuz/interfaces/binarypackagerelease.py +++ b/lib/lp/soyuz/interfaces/binarypackagerelease.py @@ -34,7 +34,7 @@ class BinaryPackageReleaseNameLinkageError(ValueError): class IBinaryPackageRelease(Interface): id = Int(title=_("ID"), required=True) binarypackagename = Int(required=True) - binarypackagenameID = Int(required=True) + binarypackagename_id = Int(required=True) version = TextLine(required=True, constraint=valid_debian_version) summary = Text(required=True) description = Text(required=True) diff --git a/lib/lp/soyuz/model/archive.py b/lib/lp/soyuz/model/archive.py index 505b278..72264d4 100644 --- a/lib/lp/soyuz/model/archive.py +++ b/lib/lp/soyuz/model/archive.py @@ -1111,8 +1111,8 @@ class Archive(SQLBase): bprs = load_related( BinaryPackageRelease, bpphs, ["binarypackagerelease_id"] ) - load_related(BinaryPackageName, bprs, ["binarypackagenameID"]) - bpbs = load_related(BinaryPackageBuild, bprs, ["buildID"]) + load_related(BinaryPackageName, bprs, ["binarypackagename_id"]) + bpbs = load_related(BinaryPackageBuild, bprs, ["build_id"]) sprs = load_related( SourcePackageRelease, bpbs, ["source_package_release_id"] ) @@ -2171,7 +2171,7 @@ class Archive(SQLBase): BinaryPackagePublishingHistory.binarypackagerelease_id == BinaryPackageRelease.id, Cast(BinaryPackageRelease.version, "text") == version, - BinaryPackageBuild.id == BinaryPackageRelease.buildID, + BinaryPackageBuild.id == BinaryPackageRelease.build_id, DistroArchSeries.id == BinaryPackageBuild.distro_arch_series_id, DistroArchSeries.architecturetag == archtag, diff --git a/lib/lp/soyuz/model/binarypackagebuild.py b/lib/lp/soyuz/model/binarypackagebuild.py index 22ca39a..b71a38d 100644 --- a/lib/lp/soyuz/model/binarypackagebuild.py +++ b/lib/lp/soyuz/model/binarypackagebuild.py @@ -81,9 +81,11 @@ from lp.soyuz.interfaces.packageset import IPackagesetSet from lp.soyuz.mail.binarypackagebuild import BinaryPackageBuildMailer from lp.soyuz.model.binarypackagename import BinaryPackageName from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease +from lp.soyuz.model.component import Component from lp.soyuz.model.files import BinaryPackageFile, SourcePackageReleaseFile from lp.soyuz.model.packageset import Packageset from lp.soyuz.model.queue import PackageUpload, PackageUploadBuild +from lp.soyuz.model.section import Section SCORE_BY_POCKET = { PackagePublishingPocket.BACKPORTS: 0, @@ -417,7 +419,7 @@ class BinaryPackageBuild(PackageBuildMixin, SQLBase): (BinaryPackageRelease, BinaryPackageName), BinaryPackageRelease.build == self, BinaryPackageRelease.binarypackagename == BinaryPackageName.id, - BinaryPackageName.id == BinaryPackageRelease.binarypackagenameID, + BinaryPackageName.id == BinaryPackageRelease.binarypackagename_id, ) return result.order_by( [BinaryPackageName.name, BinaryPackageRelease.id] @@ -446,15 +448,29 @@ class BinaryPackageBuild(PackageBuildMixin, SQLBase): @property def binarypackages(self): """See `IBuild`.""" - return BinaryPackageRelease.select( - """ - BinaryPackageRelease.build = %s AND - BinaryPackageRelease.binarypackagename = BinaryPackageName.id - """ - % sqlvalues(self), - clauseTables=["BinaryPackageName"], - orderBy=["BinaryPackageName.name", "BinaryPackageRelease.id"], - prejoins=["binarypackagename", "component", "section"], + return DecoratedResultSet( + Store.of(self) + .using( + BinaryPackageRelease, + LeftJoin( + BinaryPackageName, + BinaryPackageRelease.binarypackagename_id + == BinaryPackageName.id, + ), + LeftJoin( + Component, + BinaryPackageRelease.component_id == Component.id, + ), + LeftJoin( + Section, BinaryPackageRelease.section_id == Section.id + ), + ) + .find( + (BinaryPackageRelease, BinaryPackageName, Component, Section), + BinaryPackageRelease.build == self, + ) + .order_by(BinaryPackageName.name, BinaryPackageRelease.id), + result_decorator=itemgetter(0), ) @property diff --git a/lib/lp/soyuz/model/binarypackagerelease.py b/lib/lp/soyuz/model/binarypackagerelease.py index 0d97f44..a434f1b 100644 --- a/lib/lp/soyuz/model/binarypackagerelease.py +++ b/lib/lp/soyuz/model/binarypackagerelease.py @@ -8,25 +8,16 @@ __all__ = [ import json import re +from datetime import timezone from operator import attrgetter -from typing import Any -from storm.locals import Date, Int, Reference, Store +from storm.locals import Bool, Date, DateTime, Int, Reference, Store, Unicode from zope.component import getUtility from zope.interface import implementer from lp.app.validators.name import valid_name_pattern as debian_name_pattern from lp.services.database.constants import UTC_NOW -from lp.services.database.datetimecol import UtcDateTimeCol from lp.services.database.enumcol import DBEnum -from lp.services.database.interfaces import IStore -from lp.services.database.sqlbase import SQLBase -from lp.services.database.sqlobject import ( - BoolCol, - ForeignKey, - IntCol, - StringCol, -) from lp.services.database.stormbase import StormBase from lp.services.propertycache import cachedproperty, get_property_cache from lp.soyuz.enums import ( @@ -35,13 +26,13 @@ from lp.soyuz.enums import ( BinarySourceReferenceType, PackagePublishingPriority, ) +from lp.soyuz.interfaces.binarypackagename import IBinaryPackageName from lp.soyuz.interfaces.binarypackagerelease import ( BinaryPackageReleaseNameLinkageError, IBinaryPackageRelease, IBinaryPackageReleaseDownloadCount, ) from lp.soyuz.interfaces.binarysourcereference import IBinarySourceReferenceSet -from lp.soyuz.model.binarypackagename import BinaryPackageName from lp.soyuz.model.files import BinaryPackageFile # https://packaging.python.org/en/latest/specifications/core-metadata/#id6 @@ -60,70 +51,54 @@ wheel_name_pattern = re.compile( conda_name_pattern = re.compile(r"^[a-z0-9_][a-z0-9.+_-]*$") -def _validate_bpr_name(obj: IBinaryPackageRelease, attr: str, value: Any): +def _validate_bpr_name(bpr: IBinaryPackageRelease, bpn: IBinaryPackageName): """Validate that a BPR's BinaryPackageName is appropriate for its format. The constraints that apply to binary package names vary depending on the package format, so we enforce them when creating a `BinaryPackageRelease` since at that point we know the format. - The interface of this function is as required by Storm's property - validator system, although this function is currently called manually by - `BinaryPackageRelease.__init__` until such time as we port - `BinaryPackageRelease` to the native Storm model style in order that we - can control initialization order. - - :param obj: The context `IBinaryPackageRelease`. - :param attr: The name of the attribute being checked. - :param value: The ID of the `BinaryPackageName` being set. + :param bpr: The context `IBinaryPackageRelease`. + :param bpn: The `IBinaryPackageName` being set. """ - if not isinstance(value, int): - raise AssertionError( - "Expected int for BinaryPackageName foreign key reference, got %r" - % type(value) - ) - - name = IStore(BinaryPackageName).get(BinaryPackageName, value).name - if obj.binpackageformat == BinaryPackageFormat.WHL: - if not wheel_name_pattern.match(name): + if bpr.binpackageformat == BinaryPackageFormat.WHL: + if not wheel_name_pattern.match(bpn.name): raise BinaryPackageReleaseNameLinkageError( "Invalid Python wheel name '%s'; must match /%s/i" - % (name, wheel_name_pattern.pattern) + % (bpn.name, wheel_name_pattern.pattern) ) - elif obj.binpackageformat in ( + elif bpr.binpackageformat in ( BinaryPackageFormat.CONDA_V1, BinaryPackageFormat.CONDA_V2, ): - if not conda_name_pattern.match(name): + if not conda_name_pattern.match(bpn.name): raise BinaryPackageReleaseNameLinkageError( "Invalid Conda package name '%s'; must match /%s/" - % (name, conda_name_pattern.pattern) + % (bpn.name, conda_name_pattern.pattern) ) else: # Fall back to Launchpad's traditional name validation, which # coincides with the rules for Debian-format package names. - if not debian_name_pattern.match(name): + if not debian_name_pattern.match(bpn.name): raise BinaryPackageReleaseNameLinkageError( "Invalid package name '%s'; must match /%s/" - % (name, debian_name_pattern.pattern) + % (bpn.name, debian_name_pattern.pattern) ) @implementer(IBinaryPackageRelease) -class BinaryPackageRelease(SQLBase): - _table = "BinaryPackageRelease" - binarypackagename = ForeignKey( - dbName="binarypackagename", - notNull=True, - foreignKey="BinaryPackageName", - ) - version = StringCol(dbName="version", notNull=True) - summary = StringCol(dbName="summary", notNull=True, default="") - description = StringCol(dbName="description", notNull=True) +class BinaryPackageRelease(StormBase): + __storm_table__ = "BinaryPackageRelease" + + id = Int(primary=True) + binarypackagename_id = Int(name="binarypackagename", allow_none=False) + binarypackagename = Reference(binarypackagename_id, "BinaryPackageName.id") + version = Unicode(name="version", allow_none=False) + summary = Unicode(name="summary", allow_none=False, default="") + description = Unicode(name="description", allow_none=False) # DB constraint: exactly one of build and ci_build is non-NULL. - build = ForeignKey( - dbName="build", foreignKey="BinaryPackageBuild", notNull=False - ) + build_id = Int(name="build", allow_none=True) + build = Reference(build_id, "BinaryPackageBuild.id") ci_build_id = Int(name="ci_build", allow_none=True) ci_build = Reference(ci_build_id, "CIBuild.id") binpackageformat = DBEnum( @@ -139,42 +114,93 @@ class BinaryPackageRelease(SQLBase): priority = DBEnum( name="priority", allow_none=True, enum=PackagePublishingPriority ) - shlibdeps = StringCol(dbName="shlibdeps") - depends = StringCol(dbName="depends") - recommends = StringCol(dbName="recommends") - suggests = StringCol(dbName="suggests") - conflicts = StringCol(dbName="conflicts") - replaces = StringCol(dbName="replaces") - provides = StringCol(dbName="provides") - pre_depends = StringCol(dbName="pre_depends") - enhances = StringCol(dbName="enhances") - breaks = StringCol(dbName="breaks") - essential = BoolCol(dbName="essential", default=False) - installedsize = IntCol(dbName="installedsize") - architecturespecific = BoolCol(dbName="architecturespecific", notNull=True) - homepage = StringCol(dbName="homepage") - datecreated = UtcDateTimeCol(notNull=True, default=UTC_NOW) - debug_package = ForeignKey( - dbName="debug_package", foreignKey="BinaryPackageRelease" + shlibdeps = Unicode(name="shlibdeps") + depends = Unicode(name="depends") + recommends = Unicode(name="recommends") + suggests = Unicode(name="suggests") + conflicts = Unicode(name="conflicts") + replaces = Unicode(name="replaces") + provides = Unicode(name="provides") + pre_depends = Unicode(name="pre_depends") + enhances = Unicode(name="enhances") + breaks = Unicode(name="breaks") + essential = Bool(name="essential", default=False) + installedsize = Int(name="installedsize") + architecturespecific = Bool(name="architecturespecific", allow_none=False) + homepage = Unicode(name="homepage") + datecreated = DateTime( + allow_none=False, default=UTC_NOW, tzinfo=timezone.utc ) - - _user_defined_fields = StringCol(dbName="user_defined_fields") - - def __init__(self, *args, **kwargs): - if "user_defined_fields" in kwargs: - kwargs["_user_defined_fields"] = json.dumps( - kwargs["user_defined_fields"] - ) - del kwargs["user_defined_fields"] - super().__init__(*args, **kwargs) - # XXX cjwatson 2022-06-21: Ideally we'd set this up as a Storm - # validator, but that's difficult to arrange with SQLBase since we - # can't guarantee that self.binpackageformat will be set before - # self.binarypackagename, so just call it by hand here using the - # calling convention for validators. - _validate_bpr_name( - self, "binarypackagename", self.binarypackagename.id - ) + debug_package_id = Int(name="debug_package") + debug_package = Reference(debug_package_id, "BinaryPackageRelease.id") + + _user_defined_fields = Unicode(name="user_defined_fields") + + def __init__( + self, + binarypackagename, + version, + binpackageformat, + description, + architecturespecific, + summary="", + build=None, + ci_build=None, + component=None, + section=None, + priority=None, + shlibdeps=None, + depends=None, + recommends=None, + suggests=None, + conflicts=None, + replaces=None, + provides=None, + pre_depends=None, + enhances=None, + breaks=None, + essential=False, + installedsize=None, + homepage=None, + debug_package=None, + user_defined_fields=None, + ): + super().__init__() + self.binarypackagename = binarypackagename + self.version = version + self.binpackageformat = binpackageformat + self.description = description + self.architecturespecific = architecturespecific + self.summary = summary + self.build = build + self.ci_build = ci_build + self.component = component + self.section = section + self.priority = priority + self.shlibdeps = shlibdeps + self.depends = depends + self.recommends = recommends + self.suggests = suggests + self.conflicts = conflicts + self.replaces = replaces + self.provides = provides + self.pre_depends = pre_depends + self.enhances = enhances + self.breaks = breaks + self.essential = essential + self.installedsize = installedsize + self.homepage = homepage + self.debug_package = debug_package + if user_defined_fields is not None: + self._user_defined_fields = json.dumps(user_defined_fields) + + # Validate the package name. We can't use Storm's validator + # mechanism for this, because we need to validate the combination of + # binpackageformat and binarypackagename, and the way validators + # work for references mean that the validator would have to make a + # database query while the row is in an incomplete state of + # construction. + _validate_bpr_name(self, self.binarypackagename) @cachedproperty def built_using_references(self): diff --git a/lib/lp/soyuz/model/distributionsourcepackagecache.py b/lib/lp/soyuz/model/distributionsourcepackagecache.py index aba6e2d..29c3481 100644 --- a/lib/lp/soyuz/model/distributionsourcepackagecache.py +++ b/lib/lp/soyuz/model/distributionsourcepackagecache.py @@ -235,12 +235,12 @@ class DistributionSourcePackageCache(StormBase): all_binaries = list( IStore(BinaryPackageRelease).find( ( - BinaryPackageRelease.buildID, - BinaryPackageRelease.binarypackagenameID, + BinaryPackageRelease.build_id, + BinaryPackageRelease.binarypackagename_id, BinaryPackageRelease.summary, BinaryPackageRelease.description, ), - BinaryPackageRelease.buildID.is_in( + BinaryPackageRelease.build_id.is_in( [row[1] for row in all_builds] ), ) diff --git a/lib/lp/soyuz/model/distributionsourcepackagerelease.py b/lib/lp/soyuz/model/distributionsourcepackagerelease.py index 19eb9f3..d915c18 100644 --- a/lib/lp/soyuz/model/distributionsourcepackagerelease.py +++ b/lib/lp/soyuz/model/distributionsourcepackagerelease.py @@ -179,11 +179,11 @@ class DistributionSourcePackageRelease: Join( BinaryPackageName, BinaryPackageName.id - == BinaryPackageRelease.binarypackagenameID, + == BinaryPackageRelease.binarypackagename_id, ), Join( BinaryPackageBuild, - BinaryPackageBuild.id == BinaryPackageRelease.buildID, + BinaryPackageBuild.id == BinaryPackageRelease.build_id, ), LeftJoin( DistroSeriesPackageCache, @@ -231,7 +231,7 @@ class DistributionSourcePackageRelease: BinaryPackageRelease, Join( BinaryPackageBuild, - BinaryPackageBuild.id == BinaryPackageRelease.buildID, + BinaryPackageBuild.id == BinaryPackageRelease.build_id, ), Join( BinaryPackagePublishingHistory, @@ -246,7 +246,7 @@ class DistributionSourcePackageRelease: Join( BinaryPackageName, BinaryPackageName.id - == BinaryPackageRelease.binarypackagenameID, + == BinaryPackageRelease.binarypackagename_id, ), ) archive_ids = list(self.distribution.all_distro_archive_ids) diff --git a/lib/lp/soyuz/model/distroarchseries.py b/lib/lp/soyuz/model/distroarchseries.py index db9c6d8..15bd5ef 100644 --- a/lib/lp/soyuz/model/distroarchseries.py +++ b/lib/lp/soyuz/model/distroarchseries.py @@ -6,7 +6,7 @@ __all__ = ["DistroArchSeries", "PocketChroot"] import hashlib from io import BytesIO -from storm.locals import Int, Join, Or, Reference +from storm.locals import Int, Join, Or, Reference, ReferenceSet from storm.store import EmptyResultSet from zope.component import getUtility from zope.interface import implementer @@ -25,7 +25,6 @@ from lp.services.database.sqlobject import ( ForeignKey, IntCol, SQLObjectNotFound, - SQLRelatedJoin, StringCol, ) from lp.services.database.stormexpr import fti_search, rank_by_fti @@ -74,11 +73,11 @@ class DistroArchSeries(SQLBase): package_count = IntCol(notNull=True, default=DEFAULT) enabled = BoolCol(notNull=False, default=True) - packages = SQLRelatedJoin( - "BinaryPackageRelease", - joinColumn="distroarchseries", - intermediateTable="BinaryPackagePublishing", - otherColumn="binarypackagerelease", + packages = ReferenceSet( + "<primary key>", + "BinaryPackagePublishingHistory.distroarchseries_id", + "BinaryPackagePublishingHistory.binarypackagerelease_id", + "BinaryPackageRelease.id", ) def __getitem__(self, name): diff --git a/lib/lp/soyuz/model/distroseriespackagecache.py b/lib/lp/soyuz/model/distroseriespackagecache.py index 6c09b45..45a4692 100644 --- a/lib/lp/soyuz/model/distroseriespackagecache.py +++ b/lib/lp/soyuz/model/distroseriespackagecache.py @@ -149,7 +149,7 @@ class DistroSeriesPackageCache(StormBase): IStore(BinaryPackageRelease) .find( ( - BinaryPackageRelease.binarypackagenameID, + BinaryPackageRelease.binarypackagename_id, BinaryPackageRelease.summary, BinaryPackageRelease.description, Max(BinaryPackageRelease.datecreated), @@ -172,12 +172,12 @@ class DistroSeriesPackageCache(StormBase): ), ) .group_by( - BinaryPackageRelease.binarypackagenameID, + BinaryPackageRelease.binarypackagename_id, BinaryPackageRelease.summary, BinaryPackageRelease.description, ) .order_by( - BinaryPackageRelease.binarypackagenameID, + BinaryPackageRelease.binarypackagename_id, Desc(Max(BinaryPackageRelease.datecreated)), ) ) diff --git a/lib/lp/soyuz/model/publishing.py b/lib/lp/soyuz/model/publishing.py index 4d27562..470032d 100644 --- a/lib/lp/soyuz/model/publishing.py +++ b/lib/lp/soyuz/model/publishing.py @@ -392,7 +392,7 @@ class SourcePackagePublishingHistory(StormBase, ArchivePublisherBase): == DistroArchSeries.id, BinaryPackagePublishingHistory.archive == self.archive_id, BinaryPackagePublishingHistory.pocket == self.pocket, - BinaryPackageBuild.id == BinaryPackageRelease.buildID, + BinaryPackageBuild.id == BinaryPackageRelease.build_id, BinaryPackageBuild.source_package_release_id == self.sourcepackagerelease_id, DistroArchSeries.distroseriesID == self.distroseries_id, @@ -1449,7 +1449,7 @@ class PublishingSet: .find( ( BinaryPackagePublishingHistory.distroarchseries_id, - BinaryPackageRelease.binarypackagenameID, + BinaryPackageRelease.binarypackagename_id, BinaryPackageRelease.version, ), BinaryPackagePublishingHistory.pocket == pocket, @@ -1473,7 +1473,7 @@ class PublishingSet: needed = [ (das, bpr, overrides) for (das, bpr, overrides) in expanded - if (das.id, bpr.binarypackagenameID, bpr.version) + if (das.id, bpr.binarypackagename_id, bpr.version) not in already_published ] if not needed: @@ -1853,7 +1853,7 @@ class PublishingSet: SourcePackagePublishingHistory.sourcepackagerelease_id == BinaryPackageBuild.source_package_release_id, BinaryPackageRelease.build == BinaryPackageBuild.id, - BinaryPackageRelease.binarypackagenameID == BinaryPackageName.id, + BinaryPackageRelease.binarypackagename_id == BinaryPackageName.id, SourcePackagePublishingHistory.distroseries_id == DistroArchSeries.distroseriesID, BinaryPackagePublishingHistory.distroarchseries_id @@ -1933,7 +1933,7 @@ class PublishingSet: LibraryFileContent.id == LibraryFileAlias.contentID, LibraryFileAlias.id == BinaryPackageFile.libraryfile_id, BinaryPackageFile.binarypackagerelease == BinaryPackageRelease.id, - BinaryPackageRelease.buildID == BinaryPackageBuild.id, + BinaryPackageRelease.build_id == BinaryPackageBuild.id, SourcePackagePublishingHistory.sourcepackagerelease_id == BinaryPackageBuild.source_package_release_id, BinaryPackagePublishingHistory.binarypackagerelease_id @@ -2141,7 +2141,7 @@ class PublishingSet: bprs = bulk.load_related( BinaryPackageRelease, bpphs, ["binarypackagerelease_id"] ) - bpbs = bulk.load_related(BinaryPackageBuild, bprs, ["buildID"]) + bpbs = bulk.load_related(BinaryPackageBuild, bprs, ["build_id"]) sprs = bulk.load_related( SourcePackageRelease, bpbs, ["source_package_release_id"] ) @@ -2158,7 +2158,9 @@ class PublishingSet: ) bulk.load_related(LibraryFileContent, lfas, ["contentID"]) bulk.load_related(SourcePackageName, sprs, ["sourcepackagenameID"]) - bulk.load_related(BinaryPackageName, bprs, ["binarypackagenameID"]) + bulk.load_related( + BinaryPackageName, bprs, ["binarypackagename_id"] + ) return DecoratedResultSet(bpphs, pre_iter_hook=eager_load) @@ -2377,7 +2379,7 @@ class PublishingSet: Join( debug_bpph, debug_bpph.binarypackagerelease_id - == BinaryPackageRelease.debug_packageID, + == BinaryPackageRelease.debug_package_id, ), ] return ( diff --git a/lib/lp/soyuz/model/queue.py b/lib/lp/soyuz/model/queue.py index fd7b594..e686aa4 100644 --- a/lib/lp/soyuz/model/queue.py +++ b/lib/lp/soyuz/model/queue.py @@ -1882,8 +1882,8 @@ def prefill_packageupload_caches(uploads, puses, pubs, pucs, logs): binary_sprs = load_related( SourcePackageRelease, bpbs, ["source_package_release_id"] ) - bprs = load_referencing(BinaryPackageRelease, bpbs, ["buildID"]) - load_related(BinaryPackageName, bprs, ["binarypackagenameID"]) + bprs = load_referencing(BinaryPackageRelease, bpbs, ["build_id"]) + load_related(BinaryPackageName, bprs, ["binarypackagename_id"]) sprs = source_sprs + binary_sprs load_related(SourcePackageName, sprs, ["sourcepackagenameID"]) diff --git a/lib/lp/soyuz/scripts/gina/handlers.py b/lib/lp/soyuz/scripts/gina/handlers.py index fd62506..5af9a8b 100644 --- a/lib/lp/soyuz/scripts/gina/handlers.py +++ b/lib/lp/soyuz/scripts/gina/handlers.py @@ -862,8 +862,8 @@ class BinaryPackageHandler: to_upload = check_not_in_librarian([fname], bin.archive_root, fdir) fname, path = to_upload[0] - componentID = self.distro_handler.getComponentByName(bin.component).id - sectionID = self.distro_handler.ensureSection(bin.section).id + component = self.distro_handler.getComponentByName(bin.component) + section = self.distro_handler.ensureSection(bin.section) architecturespecific = bin.architecture != "all" bin_name = getUtility(IBinaryPackageNameSet).ensure(bin.package) @@ -874,14 +874,14 @@ class BinaryPackageHandler: if bin._user_defined: kwargs["user_defined_fields"] = bin._user_defined binpkg = BinaryPackageRelease( - binarypackagename=bin_name.id, - component=componentID, + binarypackagename=bin_name, + component=component, version=bin.version, description=bin.description, summary=bin.summary, build=build.id, binpackageformat=getBinaryPackageFormat(bin.filename), - section=sectionID, + section=section, priority=prioritymap[bin.priority], shlibdeps=bin.shlibs, depends=bin.depends, diff --git a/lib/lp/soyuz/stories/soyuz/xx-queue-pages-motu.rst b/lib/lp/soyuz/stories/soyuz/xx-queue-pages-motu.rst index 47887ea..076a1b3 100644 --- a/lib/lp/soyuz/stories/soyuz/xx-queue-pages-motu.rst +++ b/lib/lp/soyuz/stories/soyuz/xx-queue-pages-motu.rst @@ -74,6 +74,7 @@ permission to manipulate them. >>> from lp.registry.interfaces.sourcepackagename import ( ... ISourcePackageNameSet, ... ) + >>> from lp.services.database.interfaces import IStore >>> from lp.soyuz.interfaces.binarypackagename import ( ... IBinaryPackageNameSet, ... ) @@ -92,11 +93,12 @@ permission to manipulate them. ... sourcepackagename=alsa_utils ... ): ... source.component = universe - >>> for binary in BinaryPackageRelease.selectBy(binarypackagename=pmount): + >>> for binary in IStore(BinaryPackageRelease).find( + ... BinaryPackageRelease, binarypackagename=pmount + ... ): ... binary.component = universe - ... - >>> for binary in BinaryPackageRelease.selectBy( - ... binarypackagename=mozilla + >>> for binary in IStore(BinaryPackageRelease).find( + ... BinaryPackageRelease, binarypackagename=mozilla ... ): ... binary.component = universe >>> import transaction diff --git a/lib/lp/soyuz/templates/build-index.pt b/lib/lp/soyuz/templates/build-index.pt index 4910e03..e00428b 100644 --- a/lib/lp/soyuz/templates/build-index.pt +++ b/lib/lp/soyuz/templates/build-index.pt @@ -33,7 +33,7 @@ </div> <!-- yui-g --> - <tal:binaries condition="context/binarypackages"> + <tal:binaries condition="not: context/binarypackages/is_empty"> <div id="binaries" class="portlet"> <div metal:use-macro="template/macros/binaries" />
_______________________________________________ Mailing list: https://launchpad.net/~launchpad-reviewers Post to : launchpad-reviewers@lists.launchpad.net Unsubscribe : https://launchpad.net/~launchpad-reviewers More help : https://help.launchpad.net/ListHelp