Exemplo n.º 1
0
 def _teardown(_exit_st):
     if nsargs.post:
         _rc = PackageBuilder.teardown(
             nsargs.post, cwd, _exit_st)
         if _exit_st == 0 and _rc != 0:
             _exit_st = _rc
     return _exit_st
Exemplo n.º 2
0
 def _teardown(_exit_st):
     if nsargs.post:
         _rc = PackageBuilder.teardown(nsargs.post, cwd, _exit_st)
         if _exit_st == 0 and _rc != 0:
             _exit_st = _rc
     return _exit_st
Exemplo n.º 3
0
def matter_main(binary_pms, nsargs, cwd, specs):
    """
    Main application code run after all the resources setup.
    """

    try:
        binary_pms.validate_system()
    except BaseBinaryPMS.SystemValidationError as err:
        print_error("%s" % (err,))
        return 1

    print_info("matter loaded, starting to scan particles, pid: %s" % (
        os.getpid(),))

    def _teardown(_exit_st):
        if nsargs.post:
            _rc = PackageBuilder.teardown(
                nsargs.post, cwd, _exit_st)
            if _exit_st == 0 and _rc != 0:
                _exit_st = _rc
        return _exit_st

    # setup
    if nsargs.pre:
        _rc = PackageBuilder.setup(nsargs.pre, cwd)
        if _rc != 0:
            return _teardown(_rc)

    # sync portage
    if nsargs.sync:
        _rc = PackageBuilder.sync()
        if _rc != 0 and not nsargs.sync_best_effort:
            return _teardown(_rc)

    exit_st = 0
    completed = collections.deque()
    not_found = collections.deque()
    not_installed = collections.deque()
    not_merged = collections.deque()
    uninstalled = collections.deque()
    missing_use = {}
    unstable_keywords = set()
    pmask_changes = set()
    license_changes = {}
    tainted_repositories = set()
    spec_count = 0
    tot_spec = len(specs)
    preserved_libs = False
    emerge_config = binary_pms.load_emerge_config()

    for spec in specs:

        spec_count += 1
        keep_going = spec["keep-going"] == "yes"
        local_completed = []
        local_uninstalled = []

        tot_pkgs = len(spec["packages"])
        for pkg_count, packages in enumerate(spec["packages"], 1):

            builder = PackageBuilder(
                binary_pms, emerge_config, packages,
                spec, spec_count, tot_spec, pkg_count, tot_pkgs,
                nsargs.pretend)
            _rc = builder.run()

            not_found.extend(builder.get_not_found_packages())
            not_installed.extend(
                builder.get_not_installed_packages())
            not_merged.extend(
                builder.get_not_merged_packages())
            uninstalled = builder.get_uninstalled_packages()
            uninstalled.extend(uninstalled)
            local_uninstalled.extend(uninstalled)

            # Merge at least the first layer of dicts.
            for k, v in builder.get_missing_use_packages().items():
                obj = missing_use.setdefault(k, {})
                obj.update(v)

            unstable_keywords.update(
                builder.get_needed_unstable_keywords())
            pmask_changes.update(
                builder.get_needed_package_mask_changes())

            # We need to merge the two dicts, not just update()
            # or we can lose the full set of licenses associated
            # to a single cpv.
            for k, v in builder.get_needed_license_changes().items():
                obj = license_changes.setdefault(k, set())
                obj.update(v)

            preserved_libs = binary_pms.check_preserved_libraries(
                emerge_config)

            if preserved_libs and not nsargs.disable_preserved_libs:
                # abort, library breakages detected
                exit_st = 1
                print_error(
                    "preserved libraries detected, aborting")
                break

            # ignore _rc, we may have built pkgs even if _rc != 0
            built_packages = builder.get_built_packages()
            if built_packages:
                print_info("built packages, in queue: %s" % (
                        " ".join(built_packages),))
                local_completed.extend(
                    [x for x in built_packages \
                         if x not in local_completed])
                tainted_repositories.add(spec["repository"])

            # make some room
            print_info("")
            if _rc < 0:
                # ignore warning and go ahead
                continue
            else:
                exit_st = _rc
                if not keep_going:
                    break

        # call post-build cleanup operations
        if local_completed or local_uninstalled:
            PackageBuilder.post_build(spec, emerge_config)

        completed.extend([x for x in local_completed \
            if x not in completed])
        # portage calls setcwd()
        os.chdir(cwd)

        if preserved_libs and not nsargs.disable_preserved_libs:
            # completely abort
            break

        if local_completed and nsargs.commit:
            _rc = binary_pms.commit(
                spec,
                local_completed)
            if exit_st == 0 and _rc != 0:
                exit_st = _rc
                if not keep_going:
                    break

        PackageBuilder.clear_caches(emerge_config)

    if tainted_repositories and nsargs.push and nsargs.commit:
        if preserved_libs and nsargs.disable_preserved_libs:
            # cannot push anyway
            print_warning("Preserved libraries detected, cannot push !")
        elif not preserved_libs:
            for repository in tainted_repositories:
                _rc = binary_pms.push(repository)
                if exit_st == 0 and _rc != 0:
                    exit_st = _rc

    # print summary
    print_generic("")
    print_generic("Summary")
    print_generic("Packages built:\n  %s" % (
        "\n  ".join(sorted(completed)),))
    print_generic("Packages not built:\n  %s" % (
        "\n  ".join(sorted(not_merged)),))
    print_generic("Packages not found:\n  %s" % (
        "\n  ".join(sorted(not_found)),))
    print_generic("Packages not installed:\n  %s" % (
        "\n  ".join(sorted(not_installed)),))
    print_generic("Packages uninstalled:\n  %s" % (
        "\n  ".join(sorted(uninstalled)),))

    if missing_use:
        print_generic("Packages not built due to missing USE flags:")
        for atom in sorted(missing_use.keys()):
            use_data = missing_use[atom]
            use_l = []
            for use in sorted(use_data["changes"]):
                if use_data["changes"][use]:
                    use_l.append(use)
                else:
                    use_l.append("-" + use)
            print_generic("%s %s" % (
                    use_data["cp:slot"], " ".join(use_l)))
        print_generic("")

    if unstable_keywords:
        print_generic("Packages not built due to missing unstable keywords:")
        for atom in sorted(unstable_keywords):
            print_generic("%s" % (atom,))
        print_generic("")

    if pmask_changes:
        print_generic("Packages not built due to needed package.mask changes:")
        for atom in sorted(pmask_changes):
            print_generic("%s" % (atom,))
        print_generic("")

    print_generic("Preserved libs: %s" % (
        preserved_libs,))
    print_generic("")

    return _teardown(exit_st)
Exemplo n.º 4
0
def matter_main(binary_pms, nsargs, cwd, specs):
    """
    Main application code run after all the resources setup.
    """

    try:
        binary_pms.validate_system()
    except BaseBinaryPMS.SystemValidationError as err:
        print_error("%s" % (err, ))
        return 1

    print_info("matter loaded, starting to scan particles, pid: %s" %
               (os.getpid(), ))

    def _teardown(_exit_st):
        if nsargs.post:
            _rc = PackageBuilder.teardown(nsargs.post, cwd, _exit_st)
            if _exit_st == 0 and _rc != 0:
                _exit_st = _rc
        return _exit_st

    # setup
    if nsargs.pre:
        _rc = PackageBuilder.setup(nsargs.pre, cwd)
        if _rc != 0:
            return _teardown(_rc)

    # sync portage
    if nsargs.sync:
        _rc = PackageBuilder.sync()
        if _rc != 0 and not nsargs.sync_best_effort:
            return _teardown(_rc)

    exit_st = 0
    completed = collections.deque()
    not_found = collections.deque()
    not_installed = collections.deque()
    not_merged = collections.deque()
    uninstalled = collections.deque()
    missing_use = {}
    unstable_keywords = set()
    pmask_changes = set()
    license_changes = {}
    tainted_repositories = set()
    spec_count = 0
    tot_spec = len(specs)
    preserved_libs = False
    emerge_config = binary_pms.load_emerge_config()

    for spec in specs:

        spec_count += 1
        keep_going = spec["keep-going"] == "yes"
        local_completed = []
        local_uninstalled = []

        tot_pkgs = len(spec["packages"])
        for pkg_count, packages in enumerate(spec["packages"], 1):

            builder = PackageBuilder(binary_pms, emerge_config, packages, spec,
                                     spec_count, tot_spec, pkg_count, tot_pkgs,
                                     nsargs.pretend)
            _rc = builder.run()

            not_found.extend(builder.get_not_found_packages())
            not_installed.extend(builder.get_not_installed_packages())
            not_merged.extend(builder.get_not_merged_packages())
            uninstalled = builder.get_uninstalled_packages()
            uninstalled.extend(uninstalled)
            local_uninstalled.extend(uninstalled)

            # Merge at least the first layer of dicts.
            for k, v in builder.get_missing_use_packages().items():
                obj = missing_use.setdefault(k, {})
                obj.update(v)

            unstable_keywords.update(builder.get_needed_unstable_keywords())
            pmask_changes.update(builder.get_needed_package_mask_changes())

            # We need to merge the two dicts, not just update()
            # or we can lose the full set of licenses associated
            # to a single cpv.
            for k, v in builder.get_needed_license_changes().items():
                obj = license_changes.setdefault(k, set())
                obj.update(v)

            preserved_libs = binary_pms.check_preserved_libraries(
                emerge_config)

            if preserved_libs and not nsargs.disable_preserved_libs:
                # abort, library breakages detected
                exit_st = 1
                print_error("preserved libraries detected, aborting")
                break

            # ignore _rc, we may have built pkgs even if _rc != 0
            built_packages = builder.get_built_packages()
            if built_packages:
                print_info("built packages, in queue: %s" %
                           (" ".join(built_packages), ))
                local_completed.extend(
                    [x for x in built_packages \
                         if x not in local_completed])
                tainted_repositories.add(spec["repository"])

            # make some room
            print_info("")
            if _rc < 0:
                # ignore warning and go ahead
                continue
            else:
                exit_st = _rc
                if not keep_going:
                    break

        # call post-build cleanup operations
        if local_completed or local_uninstalled:
            PackageBuilder.post_build(spec, emerge_config)

        completed.extend([x for x in local_completed \
            if x not in completed])
        # portage calls setcwd()
        os.chdir(cwd)

        if preserved_libs and not nsargs.disable_preserved_libs:
            # completely abort
            break

        if local_completed and nsargs.commit:
            _rc = binary_pms.commit(spec, local_completed)
            if exit_st == 0 and _rc != 0:
                exit_st = _rc
                if not keep_going:
                    break

        PackageBuilder.clear_caches(emerge_config)

    if tainted_repositories and nsargs.push and nsargs.commit:
        if preserved_libs and nsargs.disable_preserved_libs:
            # cannot push anyway
            print_warning("Preserved libraries detected, cannot push !")
        elif not preserved_libs:
            for repository in tainted_repositories:
                _rc = binary_pms.push(repository)
                if exit_st == 0 and _rc != 0:
                    exit_st = _rc

    # print summary
    print_generic("")
    print_generic("Summary")
    print_generic("Packages built:\n  %s" % ("\n  ".join(sorted(completed)), ))
    print_generic("Packages not built:\n  %s" %
                  ("\n  ".join(sorted(not_merged)), ))
    print_generic("Packages not found:\n  %s" %
                  ("\n  ".join(sorted(not_found)), ))
    print_generic("Packages not installed:\n  %s" %
                  ("\n  ".join(sorted(not_installed)), ))
    print_generic("Packages uninstalled:\n  %s" %
                  ("\n  ".join(sorted(uninstalled)), ))

    if missing_use:
        print_generic("Packages not built due to missing USE flags:")
        for atom in sorted(missing_use.keys()):
            use_data = missing_use[atom]
            use_l = []
            for use in sorted(use_data["changes"]):
                if use_data["changes"][use]:
                    use_l.append(use)
                else:
                    use_l.append("-" + use)
            print_generic("%s %s" % (use_data["cp:slot"], " ".join(use_l)))
        print_generic("")

    if unstable_keywords:
        print_generic("Packages not built due to missing unstable keywords:")
        for atom in sorted(unstable_keywords):
            print_generic("%s" % (atom, ))
        print_generic("")

    if pmask_changes:
        print_generic("Packages not built due to needed package.mask changes:")
        for atom in sorted(pmask_changes):
            print_generic("%s" % (atom, ))
        print_generic("")

    print_generic("Preserved libs: %s" % (preserved_libs, ))
    print_generic("")

    return _teardown(exit_st)