Example #1
0
 def resolve_dependencies(self, sack, br, build_group):
     resolve_dependencies_time.start()
     deps = None
     resolved, problems, installs = depsolve.run_goal(sack, br, build_group)
     if resolved:
         problems = []
         deps = [DependencyWithDistance(name=pkg.name, epoch=pkg.epoch,
                                        version=pkg.version, release=pkg.release,
                                        arch=pkg.arch)
                 for pkg in installs if pkg.arch != 'src']
         depsolve.compute_dependency_distances(sack, br, deps)
     resolve_dependencies_time.stop()
     return (resolved, problems, deps)
Example #2
0
 def resolve_dependencies(self, sack, br, build_group):
     resolve_dependencies_time.start()
     deps = None
     resolved, problems, installs = depsolve.run_goal(sack, br, build_group)
     if resolved:
         problems = []
         deps = [
             DependencyWithDistance(name=pkg.name,
                                    epoch=pkg.epoch,
                                    version=pkg.version,
                                    release=pkg.release,
                                    arch=pkg.arch) for pkg in installs
             if pkg.arch != 'src'
         ]
         depsolve.compute_dependency_distances(sack, br, deps)
     resolve_dependencies_time.stop()
     return (resolved, problems, deps)
Example #3
0
    def resolve_dependencies(self, sack, br, build_group):
        """
        Does a resolution process to install given buildrequires and build
        group using given sack.

        :returns: A triple of (resolved:bool, problems:[str], installs:[str]).
        """
        deps = None
        resolved, problems, installs = depsolve.run_goal(sack, br, build_group)
        if resolved:
            problems = []
            deps = [
                depsolve.DependencyWithDistance(
                    name=pkg.name, epoch=pkg.epoch, version=pkg.version,
                    release=pkg.release, arch=pkg.arch,
                ) for pkg in installs if pkg.arch != 'src'
            ]
            depsolve.compute_dependency_distances(sack, br, deps)
        return resolved, problems, deps
Example #4
0
    def resolve_dependencies(self, sack, br, build_group):
        """
        Does a resolution process to install given buildrequires and build
        group using given sack.

        :returns: A triple of (resolved:bool, problems:[str], installs:[str]).
        """
        deps = None
        resolved, problems, installs = depsolve.run_goal(sack, br, build_group)
        if resolved:
            problems = []
            deps = [
                depsolve.DependencyWithDistance(
                    name=pkg.name, epoch=pkg.epoch, version=pkg.version,
                    release=pkg.release, arch=pkg.arch,
                ) for pkg in installs if pkg.arch != 'src'
            ]
            depsolve.compute_dependency_distances(sack, br, deps)
        return resolved, problems, deps
Example #5
0
    def resolve_request(self, request, sack_before, sack_after):
        self.log.info("Processing rebuild request id {}".format(request.id))

        # packages with no build have no srpm to fetch buildrequires, so filter them
        packages = self.db.query(Package)\
            .filter_by(tracked=True, blocked=False)\
            .filter(Package.collection_id == request.collection_id)\
            .filter(Package.last_complete_build_state != None)\
            .order_by(Package.id)\
            .all()

        br_gen = koji_util.get_rpm_requires_cached(
            self.session, self.session.secondary_koji_for(request.collection),
            [p.srpm_nvra for p in packages])
        rebuilds = []
        resolution_changes = []
        build_group = koji_util.get_build_group_cached(
            self.session,
            self.session.koji('primary'),
            request.collection.build_tag,
            request.collection.build_group,
            request.collection.latest_repo_id,
        )
        for package, brs in zip(packages, br_gen):
            resolved1, _, installs1 = \
                depsolve.run_goal(sack_before, brs, build_group)
            resolved2, problems2, installs2 = \
                depsolve.run_goal(sack_after, brs, build_group)
            if resolved1 != resolved2:
                change = dict(
                    request_id=request.id,
                    package_id=package.id,
                    prev_resolved=resolved1,
                    curr_resolved=resolved2,
                    problems=problems2,
                    # TODO compare problems as well?
                )
                resolution_changes.append(change)
            elif resolved2:
                installs1 = set(installs1)
                installs2 = set(installs2)
                if installs1 != installs2:
                    changed_deps = [
                        depsolve.DependencyWithDistance(
                            name=pkg.name,
                            epoch=pkg.epoch,
                            version=pkg.version,
                            release=pkg.release,
                            arch=pkg.arch,
                        ) for pkg in installs2 if pkg not in installs1
                    ]
                    depsolve.compute_dependency_distances(
                        sack_after, brs, changed_deps)
                    priority = sum(100 / (d.distance * 2) for d in changed_deps
                                   if d.distance)
                    rebuild = dict(
                        request_id=request.id,
                        package_id=package.id,
                        prev_state=package.last_complete_build_state,
                        priority=priority,
                    )
                    rebuilds.append(rebuild)
        if rebuilds:
            for i, rebuild in enumerate(
                    sorted(rebuilds, key=lambda x: -x['priority'])):
                del rebuild['priority']
                rebuild['order'] = i
            self.db.execute(insert(CoprRebuild, rebuilds))
        if resolution_changes:
            self.db.execute(insert(CoprResolutionChange, resolution_changes))

        if rebuilds or resolution_changes:
            request.state = 'in progress'
        else:
            request.state = 'finished'
        self.log.info("Rebuild request id {} processed".format(request.id))
Example #6
0
    def resolve_request(self, request, sack_before, sack_after):
        self.log.info("Processing rebuild request id {}".format(request.id))

        # packages with no build have no srpm to fetch buildrequires, so filter them
        packages = self.db.query(Package)\
            .filter_by(tracked=True, blocked=False)\
            .filter(Package.collection_id == request.collection_id)\
            .filter(Package.last_complete_build_state != None)\
            .order_by(Package.id)\
            .all()

        br_gen = koji_util.get_rpm_requires_cached(
            self.session,
            self.session.secondary_koji_for(request.collection),
            [p.srpm_nvra for p in packages]
        )
        rebuilds = []
        resolution_changes = []
        build_group = koji_util.get_build_group_cached(
            self.session,
            self.session.koji('primary'),
            request.collection.build_tag,
            request.collection.build_group,
            request.collection.latest_repo_id,
        )
        for package, brs in zip(packages, br_gen):
            resolved1, _, installs1 = \
                depsolve.run_goal(sack_before, brs, build_group)
            resolved2, problems2, installs2 = \
                depsolve.run_goal(sack_after, brs, build_group)
            if resolved1 != resolved2:
                change = dict(
                    request_id=request.id,
                    package_id=package.id,
                    prev_resolved=resolved1,
                    curr_resolved=resolved2,
                    problems=problems2,
                    # TODO compare problems as well?
                )
                resolution_changes.append(change)
            elif resolved2:
                installs1 = set(installs1)
                installs2 = set(installs2)
                if installs1 != installs2:
                    changed_deps = [
                        depsolve.DependencyWithDistance(
                            name=pkg.name, epoch=pkg.epoch,
                            version=pkg.version, release=pkg.release,
                            arch=pkg.arch,
                        ) for pkg in installs2 if pkg not in installs1
                    ]
                    depsolve.compute_dependency_distances(sack_after, brs, changed_deps)
                    priority = sum(100 / (d.distance * 2)
                                   for d in changed_deps if d.distance)
                    rebuild = dict(
                        request_id=request.id,
                        package_id=package.id,
                        prev_state=package.last_complete_build_state,
                        priority=priority,
                    )
                    rebuilds.append(rebuild)
        if rebuilds:
            for i, rebuild in enumerate(sorted(rebuilds, key=lambda x: -x['priority'])):
                del rebuild['priority']
                rebuild['order'] = i
            self.db.execute(insert(CoprRebuild, rebuilds))
        if resolution_changes:
            self.db.execute(insert(CoprResolutionChange, resolution_changes))

        if rebuilds or resolution_changes:
            request.state = 'in progress'
        else:
            request.state = 'finished'
        self.log.info("Rebuild request id {} processed".format(request.id))