Beispiel #1
0
    def sync_pr(self, pr_id, dist_git_branch: str, upstream_version: str = None):
        up = Upstream(config=self.config, package_config=self.package_config)

        dg = DistGit(config=self.config, package_config=self.package_config)

        up.checkout_pr(pr_id=pr_id)
        local_pr_branch = f"pull-request-{pr_id}-sync"
        # fetch and reset --hard upstream/$branch?
        dg.checkout_branch(dist_git_branch)
        dg.create_branch(local_pr_branch)
        dg.checkout_branch(local_pr_branch)

        dg.sync_files(up.local_project)

        patches = up.create_patches(
            upstream=upstream_version, destination=dg.local_project.working_dir
        )
        dg.add_patches_to_specfile(patches)

        description = (
            f"Upstream pr: {pr_id}\n"
            f"Upstream commit: {up.local_project.git_repo.head.commit}\n"
        )

        self.sync(
            distgit=dg,
            commit_msg=f"Sync upstream pr: {pr_id}",
            pr_title=f"Upstream pr: {pr_id}",
            pr_description=description,
            dist_git_branch="master",
            add_new_sources=False,
        )
Beispiel #2
0
    def sync_release(self, dist_git_branch: str, version: str = None):
        """
        Update given package in Fedora
        """
        up = Upstream(config=self.config, package_config=self.package_config)

        dg = DistGit(config=self.config, package_config=self.package_config)

        full_version = version or up.get_upstream_version()
        current_up_branch = up.active_branch
        try:
            # TODO: this is problematic, since we may overwrite stuff in the repo
            #       but the thing is that we need to do it
            #       I feel like the ideal thing to do would be to clone the repo and work in tmpdir
            # TODO: this is also naive, upstream may use different tagging scheme, e.g.
            #       release = 232, tag = v232
            up.checkout_release(full_version)

            local_pr_branch = f"{full_version}-{dist_git_branch}-update"
            # fetch and reset --hard upstream/$branch?
            logger.info(f'using "{dist_git_branch}" dist-git branch')
            dg.checkout_branch(dist_git_branch)
            dg.create_branch(local_pr_branch)
            dg.checkout_branch(local_pr_branch)

            description = (
                f"Upstream tag: {full_version}\n"
                f"Upstream commit: {up.local_project.git_repo.head.commit}\n"
            )

            dg.sync_files(up.local_project)

            self.sync(
                distgit=dg,
                commit_msg=f"{full_version} upstream release",
                pr_title=f"Update to upstream release {full_version}",
                pr_description=description,
                dist_git_branch=dist_git_branch,
                commit_msg_description=description,
                add_new_sources=True,
            )
        finally:
            current_up_branch.checkout()
Beispiel #3
0
class Status:
    """
    This class provides methods to obtain status of the package
    """
    def __init__(self, config: Config, package_config: PackageConfig):
        self.config = config
        self.package_config = package_config

        self.up = Upstream(config=self.config,
                           package_config=self.package_config)
        self.dg = DistGit(config=self.config,
                          package_config=self.package_config)

    def get_downstream_prs(self, number_of_prs: int = 5) -> None:
        """
        Get specific number of latest downstream PRs
        :param number_of_prs: int
        :return: None
        """
        pr_list = self.dg.local_project.git_project.get_pr_list()
        if len(pr_list) > 0:
            # take last `number_of_prs` PRs
            pr_list = (pr_list[:number_of_prs]
                       if len(pr_list) > number_of_prs else pr_list)
            logger.info("Downstream PRs:")
            table = [[pr.id, pr.title, pr.url] for pr in pr_list]
            logger.info(tabulate(table, headers=["ID", "Title", "URL"]))
        else:
            logger.info("Downstream PRs: No open PRs.")

    def get_dg_versions(self) -> None:
        """
        Get versions from all branches in Dist-git
        :return: None
        """
        branches = self.dg.local_project.git_project.get_branches()
        for branch in branches:
            try:
                self.dg.create_branch(branch,
                                      base=f"remotes/origin/{branch}",
                                      setup_tracking=False)
                self.dg.checkout_branch(branch)
            except Exception as ex:
                logger.debug(f"Branch {branch} is not present: {ex}")
                continue
            try:
                logger.info(f"{branch}: {self.dg.specfile.get_version()}")
            except PackitException:
                logger.debug(
                    f"Can't figure out the version of branch: {branch}")
        self.dg.checkout_branch("master")

    def get_up_releases(self, number_of_releases: int = 5) -> None:
        """
        Get specific number of latest upstream releases
        :param number_of_releases: int
        :return: None
        """
        latest_releases = self.up.local_project.git_project.get_releases()
        if len(latest_releases) > 0:
            logger.info("\nGitHub upstream releases:")
            # take last five releases
            latest_releases = (latest_releases[:number_of_releases]
                               if len(latest_releases) > number_of_releases
                               else latest_releases)
            upstream_releases_str = "\n".join(f"{release.tag_name}"
                                              for release in latest_releases)
            logger.info(upstream_releases_str)
        else:
            logger.info("\nGitHub upstream releases: No releases found.")

    def get_builds(self, number_of_builds: int = 3) -> None:
        """
        Get specific number of latest builds from koji
        :param number_of_builds: int
        :return: None
        """
        logger.info("\nLatest builds:")
        # https://github.com/fedora-infra/bodhi/issues/3058
        from bodhi.client.bindings import BodhiClient

        b = BodhiClient()
        builds_d = b.latest_builds(self.dg.package_name)

        branches = self.dg.local_project.git_project.get_branches()
        branches.remove("master")  # there is no master tag in koji
        for branch in branches:
            koji_tag = f"{branch}-updates-candidate"
            try:
                koji_builds = [builds_d[koji_tag]]
                # take last three builds
                koji_builds = (koji_builds[:number_of_builds]
                               if len(koji_builds) > number_of_builds else
                               koji_builds)
                koji_builds_str = "\n".join(f" - {b}" for b in koji_builds)
                logger.info(f"{branch}:\n{koji_builds_str}")
            except KeyError:
                logger.info(f"{branch}: No builds.")

    def get_updates(self, number_of_updates: int = 3) -> None:
        """
        Get specific number of latest updates in bodhi
        :param number_of_updates: int
        :return: None
        """
        logger.info("\nLatest bodhi updates:")
        # https://github.com/fedora-infra/bodhi/issues/3058
        from bodhi.client.bindings import BodhiClient

        b = BodhiClient()
        results = b.query(packages=self.dg.package_name)["updates"]
        if len(results) > number_of_updates:
            results = results[:number_of_updates]

        table = [[result["title"], result["karma"], result["status"]]
                 for result in results]
        logger.info(tabulate(table, headers=["Update", "Karma", "status"]))