def getBuildByArch(self, distroarchseries, archive):
        """See ISourcePackageRelease."""
        # First we try to follow any binaries built from the given source
        # in a distroarchseries with the given architecturetag and published
        # in the given (distroarchseries, archive) location.
        # (Querying all architectures and then picking the right one out
        # of the result turns out to be much faster than querying for
        # just the architecture we want).
        builds_by_arch = self.findBuildsByArchitecture(
            distroarchseries.distroseries, archive)
        build = builds_by_arch.get(distroarchseries.architecturetag)
        if build is not None:
            # If there was any published binary we can use its original build.
            # This case covers the situations when both source and binaries
            # got copied from another location.
            return build

        # If there was no published binary we have to try to find a
        # suitable build in all possible location across the distroseries
        # inheritance tree. See below.
        clause_tables = ['DistroArchSeries']
        queries = [
            "DistroArchSeries.id = BinaryPackageBuild.distro_arch_series AND "
            "BinaryPackageBuild.archive = %s AND "
            "DistroArchSeries.architecturetag = %s AND "
            "BinaryPackageBuild.source_package_release = %s" % (
            sqlvalues(archive.id, distroarchseries.architecturetag, self))]

        # Query only the last build record for this sourcerelease
        # across all possible locations.
        query = " AND ".join(queries)

        return BinaryPackageBuild.selectFirst(
            query, clauseTables=clause_tables,
            orderBy=['-date_created'])
Example #2
0
    def ensureBuild(self, binary, srcpkg, distroarchinfo, archtag):
        """Ensure a build record."""
        distroarchseries = distroarchinfo['distroarchseries']
        distribution = distroarchseries.distroseries.distribution
        clauseTables = [
            "BinaryPackageBuild",
            "DistroArchSeries",
            "DistroSeries",
        ]

        # XXX kiko 2006-02-03:
        # This method doesn't work for real bin-only NMUs that are
        # new versions of packages that were picked up by Gina before.
        # The reason for that is that these bin-only NMUs' corresponding
        # source package release will already have been built at least
        # once, and the two checks below will of course blow up when
        # doing it the second time.

        query = ("BinaryPackageBuild.source_package_release = %d AND "
                 "BinaryPackageBuild.distro_arch_series = "
                 "    DistroArchSeries.id AND "
                 "DistroArchSeries.distroseries = DistroSeries.id AND "
                 "DistroSeries.distribution = %d" %
                 (srcpkg.id, distribution.id))

        if archtag != "all":
            query += ("AND DistroArchSeries.architecturetag = %s" %
                      quote(archtag))

        try:
            build = BinaryPackageBuild.selectOne(query, clauseTables)
        except SQLObjectMoreThanOneResultError:
            # XXX kiko 2005-10-27: Untested.
            raise MultipleBuildError("More than one build was found "
                                     "for package %s (%s)" %
                                     (binary.package, binary.version))

        if build:
            for bpr in build.binarypackages:
                if bpr.binarypackagename.name == binary.package:
                    # XXX kiko 2005-10-27: Untested.
                    raise MultipleBuildError(
                        "Build %d was already found "
                        "for package %s (%s)" %
                        (build.id, binary.package, binary.version))
        else:
            processor = distroarchinfo['processor']
            build = getUtility(IBinaryPackageBuildSet).new(
                processor=processor,
                distro_arch_series=distroarchseries,
                status=BuildStatus.FULLYBUILT,
                source_package_release=srcpkg,
                pocket=self.pocket,
                archive=distroarchseries.main_archive)
        return build
Example #3
0
    def ensureBuild(self, binary, srcpkg, distroarchinfo, archtag):
        """Ensure a build record."""
        distroarchseries = distroarchinfo['distroarchseries']
        distribution = distroarchseries.distroseries.distribution
        clauseTables = [
            "BinaryPackageBuild",
            "DistroArchSeries",
            "DistroSeries",
            ]

        # XXX kiko 2006-02-03:
        # This method doesn't work for real bin-only NMUs that are
        # new versions of packages that were picked up by Gina before.
        # The reason for that is that these bin-only NMUs' corresponding
        # source package release will already have been built at least
        # once, and the two checks below will of course blow up when
        # doing it the second time.

        query = ("BinaryPackageBuild.source_package_release = %d AND "
                 "BinaryPackageBuild.distro_arch_series = "
                 "    DistroArchSeries.id AND "
                 "DistroArchSeries.distroseries = DistroSeries.id AND "
                 "DistroSeries.distribution = %d"
                 % (srcpkg.id, distribution.id))

        if archtag != "all":
            query += ("AND DistroArchSeries.architecturetag = %s"
                      % quote(archtag))

        try:
            build = BinaryPackageBuild.selectOne(query, clauseTables)
        except SQLObjectMoreThanOneResultError:
            # XXX kiko 2005-10-27: Untested.
            raise MultipleBuildError("More than one build was found "
                "for package %s (%s)" % (binary.package, binary.version))

        if build:
            for bpr in build.binarypackages:
                if bpr.binarypackagename.name == binary.package:
                    # XXX kiko 2005-10-27: Untested.
                    raise MultipleBuildError("Build %d was already found "
                        "for package %s (%s)" %
                        (build.id, binary.package, binary.version))
        else:
            processor = distroarchinfo['processor']
            build = getUtility(IBinaryPackageBuildSet).new(
                        processor=processor,
                        distro_arch_series=distroarchseries,
                        status=BuildStatus.FULLYBUILT,
                        source_package_release=srcpkg,
                        pocket=self.pocket,
                        archive=distroarchseries.main_archive)
        return build
 def builds(self):
     """See `ISourcePackageRelease`."""
     # Excluding PPA builds may seem like a strange thing to do, but,
     # since Archive.copyPackage can copy packages across archives, a
     # build may well have a different archive to the corresponding
     # sourcepackagerelease.
     return BinaryPackageBuild.select("""
         source_package_release = %s AND
         archive.id = binarypackagebuild.archive AND
         archive.purpose IN %s
         """ % sqlvalues(self.id, MAIN_ARCHIVE_PURPOSES),
                                      orderBy=['-date_created', 'id'],
                                      clauseTables=['Archive'])
 def builds(self):
     """See `ISourcePackageRelease`."""
     # Excluding PPA builds may seem like a strange thing to do, but,
     # since Archive.copyPackage can copy packages across archives, a
     # build may well have a different archive to the corresponding
     # sourcepackagerelease.
     return BinaryPackageBuild.select("""
         source_package_release = %s AND
         archive.id = binarypackagebuild.archive AND
         archive.purpose IN %s
         """ % sqlvalues(self.id, MAIN_ARCHIVE_PURPOSES),
         orderBy=['-date_created', 'id'],
         clauseTables=['Archive'])
    def setUp(self):
        """Setup environment for staged binaries upload via security policy.

        1. Setup queue directory and other basic attributes
        2. Override policy options to get security policy and not send emails
        3. Setup a common UploadProcessor with the overridden options
        4. Store number of build present before issuing any upload
        5. Upload the source package via security policy
        6. Clean log messages.
        7. Commit transaction, so the upload source can be seen.
        """
        super(TestStagedBinaryUploadBase, self).setUp()
        self.options.context = self.policy
        self.options.nomails = self.no_mails
        # Set up the uploadprocessor with appropriate options and logger
        self.uploadprocessor = self.getUploadProcessor(self.layer.txn)
        self.build_uploadprocessor = self.getUploadProcessor(self.layer.txn,
                                                             builds=True)
        self.builds_before_upload = BinaryPackageBuild.select().count()
        self.source_queue = None
        self._uploadSource()
        self.layer.txn.commit()
    def getBuildByArch(self, distroarchseries, archive):
        """See ISourcePackageRelease."""
        # First we try to follow any binaries built from the given source
        # in a distroarchseries with the given architecturetag and published
        # in the given (distroarchseries, archive) location.
        # (Querying all architectures and then picking the right one out
        # of the result turns out to be much faster than querying for
        # just the architecture we want).
        builds_by_arch = self.findBuildsByArchitecture(
            distroarchseries.distroseries, archive)
        build = builds_by_arch.get(distroarchseries.architecturetag)
        if build is not None:
            # If there was any published binary we can use its original build.
            # This case covers the situations when both source and binaries
            # got copied from another location.
            return build

        # If there was no published binary we have to try to find a
        # suitable build in all possible location across the distroseries
        # inheritance tree. See below.
        clause_tables = ['DistroArchSeries']
        queries = [
            "DistroArchSeries.id = BinaryPackageBuild.distro_arch_series AND "
            "BinaryPackageBuild.archive = %s AND "
            "DistroArchSeries.architecturetag = %s AND "
            "BinaryPackageBuild.source_package_release = %s" %
            (sqlvalues(archive.id, distroarchseries.architecturetag, self))
        ]

        # Query only the last build record for this sourcerelease
        # across all possible locations.
        query = " AND ".join(queries)

        return BinaryPackageBuild.selectFirst(query,
                                              clauseTables=clause_tables,
                                              orderBy=['-date_created'])
 def assertBuildsCreated(self, amount):
     """Assert that a given 'amount' of build records was created."""
     builds_count = BinaryPackageBuild.select().count()
     self.assertEqual(self.builds_before_upload + amount, builds_count)