コード例 #1
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _search_descriptions(self, descriptions, entropy_client, entropy_repository, quiet, verbose):

        key_sorter = lambda x: entropy_repository.retrieveAtom(x)
        found = 0
        for desc in descriptions:

            pkg_ids = entropy_repository.searchDescription(desc, just_id=True)
            if not pkg_ids:
                continue

            found += len(pkg_ids)
            for pkg_id in sorted(pkg_ids, key=key_sorter):
                if quiet:
                    entropy_client.output(entropy_repository.retrieveAtom(pkg_id))
                else:
                    print_package_info(
                        pkg_id, entropy_client, entropy_repository, extended=verbose, strict_output=False, quiet=False
                    )

            if not quiet:
                toc = []
                toc.append(("%s:" % (blue(_("Keyword")),), purple(desc)))
                toc.append(
                    (
                        "%s:" % (blue(_("Found")),),
                        "%s %s" % (len(pkg_ids), brown(ngettext("entry", "entries", len(pkg_ids)))),
                    )
                )
                print_table(entropy_client, toc)

        return found
コード例 #2
0
ファイル: match.py プロジェクト: skwerlman/entropy
    def match(self, entropy_client, inst_repo):
        """
        Solo Match command.
        """
        if not self._quiet:
            entropy_client.output(
                "%s..." % (darkgreen(_("Matching")),),
                header=darkred(" @@ "))

        matches_found = 0
        for string in self._packages:
            results = self._match(
                entropy_client, inst_repo, string)
            matches_found += len(results)

        if not self._quiet:
            toc = []
            toc.append(("%s:" % (blue(_("Keywords")),),
                purple(', '.join(self._packages))))
            toc.append(("%s:" % (blue(_("Found")),), "%s %s" % (
                matches_found,
                brown(ngettext("entry", "entries", matches_found)),)))
            print_table(entropy_client, toc)

        if not matches_found:
            return 1
        return 0
コード例 #3
0
ファイル: match.py プロジェクト: dMaggot/entropy
    def match(self, entropy_client):
        """
        Solo Match command.
        """
        if not self._quiet:
            entropy_client.output(
                "%s..." % (darkgreen(_("Matching")),),
                header=darkred(" @@ "))

        matches_found = 0
        for string in self._packages:
            results = self._match(
                entropy_client, string)
            matches_found += len(results)

        if not self._quiet:
            toc = []
            toc.append(("%s:" % (blue(_("Keywords")),),
                purple(', '.join(self._packages))))
            toc.append(("%s:" % (blue(_("Found")),), "%s %s" % (
                matches_found,
                brown(ngettext("entry", "entries", matches_found)),)))
            print_table(entropy_client, toc)

        if not matches_found:
            return 1
        return 0
コード例 #4
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _updates(self, entropy_client):
        """
        Solo Query Updates command.
        """
        quiet = self._nsargs.quiet
        verbose = self._nsargs.verbose

        if not quiet:
            entropy_client.output(brown(_("Available Updates")), header=darkred(" @@ "))

        outcome = entropy_client.calculate_updates(quiet=True)
        update, remove = outcome["update"], outcome["remove"]
        fine, critical_f = outcome["fine"], outcome["critical_found"]

        if quiet:
            entropy_client.output("%d" % (len(update),), level="generic")
            return 0

        toc = []
        toc.append((darkgreen(_("Packages to update:")), bold(const_convert_to_unicode(len(update)))))
        toc.append((darkred(_("Packages to remove:")), bold(const_convert_to_unicode(len(remove)))))
        if verbose:
            toc.append((blue(_("Packages already up-to-date:")), bold(const_convert_to_unicode(len(fine)))))
            toc.append((purple(_("Critical updates found:")), teal(const_convert_to_unicode(str(critical_f)))))
        print_table(entropy_client, toc)

        return 0
コード例 #5
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _needed(self, entropy_client, inst_repo):
        """
        Solo Query Needed command.
        """
        quiet = self._nsargs.quiet
        verbose = self._nsargs.verbose
        packages = self._nsargs.packages

        if not quiet:
            entropy_client.output(darkgreen(_("Needed Libraries Search")), header=darkred(" @@ "))

        for package in packages:
            pkg_id, pkg_rc = inst_repo.atomMatch(package)
            if pkg_id == -1:
                continue

            atom = inst_repo.retrieveAtom(pkg_id)
            neededs = inst_repo.retrieveNeededLibraries(pkg_id)
            for usr_path, usr_soname, soname, elfclass, rpath in neededs:
                out_str = "%s:%s" % (soname, elfclass)
                if verbose:
                    out_str = "%s:%s:%s:%s:%s" % (usr_path, usr_soname, soname, elfclass, rpath)

                if quiet:
                    entropy_client.output(out_str, level="generic")
                else:
                    entropy_client.output(darkred(const_convert_to_unicode(out_str)), header=blue("  # "))

            if not quiet:
                toc = []
                toc.append(("%s:" % (blue(_("Package")),), purple(atom)))
                toc.append(("%s:" % (blue(_("Found")),), "%s %s" % (len(neededs), brown(_("libraries")))))
                print_table(entropy_client, toc)

        return 0
コード例 #6
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _required(self, entropy_client, inst_repo):
        """
        Solo Query Required command.
        """
        quiet = self._nsargs.quiet
        verbose = self._nsargs.verbose
        libraries = self._nsargs.libraries

        if not quiet:
            entropy_client.output(darkgreen(_("Required Packages Search")), header=darkred(" @@ "))

        key_sorter = lambda x: inst_repo.retrieveAtom(x)
        for library in libraries:
            results = inst_repo.searchNeeded(library, like=True)

            for pkg_id in sorted(results, key=key_sorter):
                print_package_info(
                    pkg_id,
                    entropy_client,
                    inst_repo,
                    installed_search=True,
                    strict_output=True,
                    extended=verbose,
                    quiet=quiet,
                )

            if not quiet:
                toc = []
                entity_str = ngettext("package", "packages", len(results))
                toc.append(("%s:" % (blue(_("Library")),), purple(library)))
                toc.append(("%s:" % (blue(_("Found")),), "%s %s" % (len(results), brown(entity_str))))
                print_table(entropy_client, toc)

        return 0
コード例 #7
0
ファイル: repo.py プロジェクト: skwerlman/entropy
    def _add(self, entropy_client):
        """
        Solo Repo Add command.
        """
        settings = entropy_client.Settings()
        current_branch = settings['repositories']['branch']
        current_product = settings['repositories']['product']
        available_repos = settings['repositories']['available']

        repository_id = self._nsargs.id
        repos = self._nsargs.repo
        pkgs = self._nsargs.pkg
        desc = self._nsargs.desc
        cformat = self._nsargs.cformat

        # show info
        toc = []
        toc.append((purple(_("Repository id:")), teal(repository_id)))
        toc.append((darkgreen(_("Description:")), teal(desc)))
        toc.append((purple(_("Repository format:")), darkgreen(cformat)))

        for pkg_url in pkgs:
            toc.append((purple(_("Packages URL:")), pkg_url))
        for repo_url in repos:
            toc.append((purple(_("Repository URL:")), repo_url))

        toc.append(" ")
        print_table(entropy_client, toc)

        try:
            repodata = settings._generate_repository_metadata(
                repository_id, desc, pkgs, repos, current_product,
                current_branch)
        except AttributeError as err:
            entropy_client.output("[%s] %s" % (
                purple(repository_id),
                err,
            ),
                                  level="error",
                                  importance=1)
            return 1

        added = entropy_client.add_repository(repodata)
        if added:
            entropy_client.output("[%s] %s" % (
                purple(repository_id),
                blue(_("repository added succesfully")),
            ))
        else:
            entropy_client.output("[%s] %s" % (
                purple(repository_id),
                blue(_("cannot add repository")),
            ),
                                  level="warning",
                                  importance=1)

        return 0
コード例 #8
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _search_mimetype(self, entropy_client, inst_repo, associate=False):
        """
        Solo Query Mimetype command.
        """
        installed = self._nsargs.installed
        quiet = self._nsargs.quiet
        verbose = self._nsargs.verbose
        settings = entropy_client.Settings()
        inst_repo_id = inst_repo.repository_id()
        if associate:
            mimetypes = self._nsargs.files
        else:
            mimetypes = self._nsargs.mimes

        if not quiet:
            entropy_client.output(darkgreen(_("Searching Mimetype")), header=darkred(" @@ "))

        found = False
        for mimetype in mimetypes:

            if associate:
                # consider mimetype a file path
                mimetype = get_file_mime(mimetype)
                if mimetype is None:
                    continue

            if not quiet:
                entropy_client.output(bold(mimetype), header=blue("  # "))

            if installed:

                matches = [(x, inst_repo_id) for x in entropy_client.search_installed_mimetype(mimetype)]
            else:
                matches = entropy_client.search_available_mimetype(mimetype)

            if matches:
                found = True

            key_sorter = lambda x: entropy_client.open_repository(x[1]).retrieveAtom(x[0])
            for pkg_id, pkg_repo in sorted(matches, key=key_sorter):
                repo = entropy_client.open_repository(pkg_repo)
                print_package_info(pkg_id, entropy_client, repo, extended=verbose, quiet=quiet)

            if not quiet:
                entry_str = ngettext("entry", "entries", len(matches))
                toc = []
                toc.append(("%s:" % (blue(_("Keyword")),), purple(mimetype)))
                toc.append(("%s:" % (blue(_("Found")),), "%s %s" % (len(matches), brown(entry_str))))
                print_table(entropy_client, toc)

        if not quiet and not found:
            entropy_client.output(darkgreen("%s." % (_("No matches"),)), header=darkred(" @@ "))

        return 0
コード例 #9
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _license(self, entropy_client):
        """
        Solo Query License command.
        """
        quiet = self._nsargs.quiet
        verbose = self._nsargs.verbose
        licenses = self._nsargs.licenses
        settings = entropy_client.Settings()

        if not quiet:
            entropy_client.output(darkgreen(_("License Search")), header=darkred(" @@ "))

        found = False
        repo_number = 0
        for repo_id in entropy_client.repositories():
            repo_number += 1
            repo_data = settings["repositories"]["available"][repo_id]

            if not quiet:
                header = (
                    const_convert_to_unicode("  #")
                    + const_convert_to_unicode(repo_number)
                    + const_convert_to_unicode(" ")
                )
                entropy_client.output("%s" % (bold(repo_data["description"]),), header=blue(header))

            repo = entropy_client.open_repository(repo_id)
            key_sorter = lambda x: repo.retrieveAtom(x)
            for mylicense in licenses:

                results = repo.searchLicense(mylicense, just_id=True)
                if not results:
                    continue

                found = True
                for pkg_id in sorted(results, key=key_sorter):
                    print_package_info(pkg_id, entropy_client, repo, extended=verbose, strict_output=quiet, quiet=quiet)

                if not quiet:
                    res_txt = ngettext("entry", "entries", len(results))
                    toc = []
                    toc.append(("%s:" % (blue(_("Keyword")),), purple(mylicense)))
                    toc.append(("%s:" % (blue(_("Found")),), "%s %s" % (len(results), brown(res_txt))))

                    print_table(entropy_client, toc)

        if not quiet and not found:
            entropy_client.output(darkgreen("%s." % (_("No matches"),)), header=darkred(" @@ "))

        return 0
コード例 #10
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _tags(self, entropy_client):
        """
        Solo Query Tags command.
        """
        quiet = self._nsargs.quiet
        verbose = self._nsargs.verbose
        tags = self._nsargs.tags
        settings = entropy_client.Settings()

        if not quiet:
            entropy_client.output(darkgreen(_("Tag Search")), header=darkred(" @@ "))

        found = False
        # search inside each available database
        repo_number = 0

        for repo_id in entropy_client.repositories():
            repo_number += 1
            repo_data = settings["repositories"]["available"][repo_id]

            if not quiet:
                header = (
                    const_convert_to_unicode("  #")
                    + const_convert_to_unicode(repo_number)
                    + const_convert_to_unicode(" ")
                )
                entropy_client.output("%s" % (bold(repo_data["description"]),), header=blue(header))

            repo = entropy_client.open_repository(repo_id)
            for tag in tags:

                results = repo.searchTaggedPackages(tag)
                key_sorter = lambda x: repo.retrieveAtom(x)
                for pkg_id in sorted(results, key=key_sorter):
                    found = True
                    print_package_info(pkg_id, entropy_client, repo, extended=verbose, strict_output=quiet, quiet=quiet)

                if not quiet:
                    toc = []
                    entity_str = ngettext("entry", "entries", len(results))
                    toc.append(("%s:" % (blue(_("Keyword")),), purple(tag)))
                    toc.append(("%s:" % (blue(_("Found")),), "%s %s" % (len(results), brown(entity_str))))
                    print_table(entropy_client, toc)

        if not quiet and not found:
            entropy_client.output(darkgreen("%s." % (_("No matches"),)), header=darkred(" @@ "))
        return 0
コード例 #11
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _sets(self, entropy_client):
        """
        Solo Query Sets command.
        """
        quiet = self._nsargs.quiet
        verbose = self._nsargs.verbose
        items = self._nsargs.sets
        if not items:
            items.append("*")

        if not quiet:
            entropy_client.output(darkgreen(_("Package Set Search")), header=darkred(" @@ "))

        sets = entropy_client.Sets()

        count = 0
        found = False
        for item in items:
            results = sets.search(item)
            key_sorter = lambda x: x[1]
            for repo, set_name, set_data in sorted(results, key=key_sorter):
                count += 1
                found = True

                if not quiet:
                    entropy_client.output(bold(set_name), header=blue("  #%d " % (count,)))

                    elements = sorted(set_data)
                    for element in elements:
                        entropy_client.output(brown(element), header="    ")
                else:
                    for element in sorted(set_data):
                        entropy_client.output(element, level="generic")

            if not quiet:
                toc = []
                entity_str = ngettext("entry", "entries", count)
                toc.append(("%s:" % (blue(_("Keyword")),), purple(item)))
                toc.append(("%s:" % (blue(_("Found")),), "%s %s" % (count, brown(entity_str))))
                print_table(entropy_client, toc)

        if not quiet and not found:
            entropy_client.output(darkgreen("%s." % (_("No matches"),)), header=darkred(" @@ "))

        return 0
コード例 #12
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _revisions(self, entropy_client, inst_repo):
        """
        Solo Query Revisions command.
        """
        quiet = self._nsargs.quiet
        verbose = self._nsargs.verbose
        revisions = self._nsargs.revisions
        settings = entropy_client.Settings()

        if not quiet:
            entropy_client.output(darkgreen(_("Revision Search")), header=darkred(" @@ "))

        found = False
        key_sorter = lambda x: inst_repo.retrieveAtom(x)

        for revision in revisions:
            results = inst_repo.searchRevisionedPackages(revision)

            found = True
            for pkg_id in sorted(results, key=key_sorter):
                print_package_info(
                    pkg_id,
                    entropy_client,
                    inst_repo,
                    extended=verbose,
                    strict_output=quiet,
                    installed_search=True,
                    quiet=quiet,
                )

            if not quiet:
                toc = []
                entity_str = ngettext("entry", "entries", len(results))
                toc.append(("%s:" % (blue(_("Keyword")),), purple(revision)))
                toc.append(("%s:" % (blue(_("Found")),), "%s %s" % (len(results), brown(entity_str))))
                print_table(entropy_client, toc)

        if not quiet and not found:
            entropy_client.output(darkgreen("%s." % (_("No matches"),)), header=darkred(" @@ "))
        return 0
コード例 #13
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _files(self, entropy_client, inst_repo):
        """
        Solo Query Files command.
        """
        quiet = self._nsargs.quiet
        verbose = self._nsargs.verbose
        packages = self._nsargs.packages

        if not quiet:
            entropy_client.output(darkgreen(_("Files Search")), header=darkred(" @@ "))

        for package in packages:

            pkg_id, pkg_rc = inst_repo.atomMatch(package)
            if pkg_id == -1:
                continue

            atom = inst_repo.retrieveAtom(pkg_id)
            files = inst_repo.retrieveContentIter(pkg_id, order_by="file")
            files_len = 0
            if quiet:
                for xfile, ftype in files:
                    files_len += 1
                    entropy_client.output(xfile, level="generic")
            else:
                for xfile, ftype in files:
                    files_len += 1
                    entropy_client.output(brown(xfile), header=blue(" ### "))

            if not quiet:
                toc = []
                toc.append(("%s:" % (blue(_("Package")),), purple(atom)))
                toc.append(("%s:" % (blue(_("Found")),), "%s %s" % (files_len, brown(_("files")))))
                print_table(entropy_client, toc)

        return 0
コード例 #14
0
    def _print_advisory_information(self, entropy_client,
                                    advisory_data, key):
        """
        Print Security Advisory.
        """
        toc = []

        # print advisory code
        toc.append(
            blue(" @@ ") + \
                red("%s " % (_("Advisory Identifier"),)) + bold(key) + \
                red(" | ")+blue(advisory_data['url']))

        # title
        toc.append((darkgreen("    %s:" % (_("Title"),)),
            darkred(advisory_data['title'])))

        # description
        description = advisory_data['description'].split("\n")
        desc_text = darkgreen("    %s:" % (_("Description"),) )
        for x in description:
            toc.append((desc_text, x.strip()))
            desc_text = " "

        for item in advisory_data['description_items']:
            desc_text = " %s " % (darkred("(*)"),)
            count = 8
            mystr = []
            for word in item.split():
                count -= 1
                mystr.append(word)
                if count < 1:
                    toc.append((" ", desc_text+' '.join(mystr)))
                    desc_text = "   "
                    mystr = []
                    count = 8
            if count < 8:
                toc.append((" ", desc_text+' '.join(mystr)))

        # background
        if advisory_data['background']:
            background = advisory_data['background'].split("\n")
            bg_text = darkgreen("    %s:" % (_("Background"),))
            for x in background:
                toc.append((bg_text, purple(x.strip())))
                bg_text = " "

        # access
        if advisory_data['access']:
            toc.append((darkgreen("    %s:" % (_("Exploitable"),)),
                bold(advisory_data['access'])))

        # impact
        if advisory_data['impact']:
            impact = advisory_data['impact'].split("\n")
            imp_text = darkgreen("    %s:" % (_("Impact"),))
            for x in impact:
                toc.append((imp_text, brown(x.strip())))
                imp_text = " "

        # impact type
        if advisory_data['impacttype']:
            toc.append((darkgreen("    %s:" % (_("Impact type"),)),
                bold(advisory_data['impacttype'])))

        # revised
        if advisory_data['revised']:
            toc.append((darkgreen("    %s:" % (_("Revised"),)),
                brown(advisory_data['revised'])))

        # announced
        if advisory_data['announced']:
            toc.append((darkgreen("    %s:" % (_("Announced"),)),
                brown(advisory_data['announced'])))

        # synopsis
        synopsis = advisory_data['synopsis'].split("\n")
        syn_text = darkgreen("    %s:" % (_("Synopsis"),))
        for x in synopsis:
            toc.append((syn_text, x.strip()))
            syn_text = " "

        # references
        if advisory_data['references']:
            toc.append(darkgreen("    %s:" % (_("References"),)))
            for reference in advisory_data['references']:
                toc.append((" ", darkblue(reference)))

        # gentoo bugs
        if advisory_data['bugs']:
            toc.append(darkgreen("    %s:" % (_("Upstream bugs"),)))
            for bug in advisory_data['bugs']:
                toc.append((" ", darkblue(bug)))

        # affected
        if advisory_data['affected']:
            toc.append(darkgreen("    %s:" % (_("Affected"),)))
            for key in advisory_data['affected']:
                toc.append((" ", darkred(key)))
                affected_data = advisory_data['affected'][key][0]
                vul_vers = affected_data['vul_vers']
                unaff_vers = affected_data['unaff_vers']
                if vul_vers:
                    toc.append((" ", brown("%s: " % (
                        _("vulnerable versions"),))+", ".join(vul_vers)))
                if unaff_vers:
                    toc.append((" ", brown("%s: " % (
                        _("unaffected versions"),))+", ".join(unaff_vers)))

        # workaround
        workaround = advisory_data['workaround'].split("\n")
        if advisory_data['workaround']:
            work_text = darkgreen("    %s:" % (_("Workaround"),))
            for x in workaround:
                toc.append((work_text, darkred(x.strip())))
                work_text = " "

        # resolution
        if advisory_data['resolution']:
            res_text = darkgreen("    %s:" % (_("Resolution"),))
            resolutions = advisory_data['resolution']
            for resolution in resolutions:
                for x in resolution.split("\n"):
                    toc.append((res_text, x.strip()))
                    res_text = " "

        print_table(entropy_client, toc, cell_spacing=3)
コード例 #15
0
ファイル: repo.py プロジェクト: dMaggot/entropy
    def _add(self, entropy_client):
        """
        Solo Repo Add command.
        """
        settings = entropy_client.Settings()
        current_branch = settings['repositories']['branch']
        current_product = settings['repositories']['product']
        available_repos = settings['repositories']['available']

        repository_id = self._nsargs.id
        repos = self._nsargs.repo
        pkgs = self._nsargs.pkg
        desc = self._nsargs.desc
        cformat = self._nsargs.cformat

        # show info
        toc = []
        toc.append((
                purple(_("Repository id:")),
                teal(repository_id)))
        toc.append((
                darkgreen(_("Description:")),
                teal(desc)))
        toc.append((
                purple(_("Repository format:")),
                darkgreen(cformat)))

        for pkg_url in pkgs:
            toc.append((purple(_("Packages URL:")), pkg_url))
        for repo_url in repos:
            toc.append((purple(_("Repository URL:")), repo_url))

        toc.append(" ")
        print_table(entropy_client, toc)

        try:
            repodata = settings._generate_repository_metadata(
                repository_id, desc, pkgs, repos, current_product,
                current_branch)
        except AttributeError as err:
            entropy_client.output(
                "[%s] %s" % (
                    purple(repository_id),
                    err,),
                level="error", importance=1)
            return 1

        added = entropy_client.add_repository(repodata)
        if added:
            entropy_client.output(
                "[%s] %s" % (
                    purple(repository_id),
                    blue(_("repository added succesfully")),))
        else:
            entropy_client.output(
                "[%s] %s" % (
                    purple(repository_id),
                    blue(_("cannot add repository")),),
                level="warning", importance=1)

        return 0
コード例 #16
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _revdeps(self, entropy_client, inst_repo):
        """
        Solo Query Revdeps command.
        """
        quiet = self._nsargs.quiet
        verbose = self._nsargs.verbose
        packages = self._nsargs.packages
        settings = entropy_client.Settings()

        if not quiet:
            entropy_client.output(darkgreen(_("Reverse Dependencies Search")), header=darkred(" @@ "))

        include_build_deps = False
        excluded_dep_types = None
        if include_build_deps:
            excluded_dep_types.append(etpConst["dependency_type_ids"]["bdepend_id"])

        for package in packages:

            repository_id = inst_repo.repository_id()
            package_id, _inst_rc = inst_repo.atomMatch(package)

            match_in_repo = False
            repo_masked = False

            if package_id == -1:
                match_in_repo = True
                package_id, repository_id = entropy_client.atom_match(package)

            if package_id == -1:
                package_id, repository_id = entropy_client.atom_match(package, mask_filter=False)
                if package_id != -1:
                    repo_masked = True

            if package_id == -1:
                continue

            repo = inst_repo
            if match_in_repo:
                repo = entropy_client.open_repository(repository_id)

            found_atom = repo.retrieveAtom(package_id)
            if repo_masked:
                package_id_masked, idmasking_reason = repo.maskFilter(package_id)

            search_results = repo.retrieveReverseDependencies(package_id, exclude_deptypes=excluded_dep_types)

            key_sorter = lambda x: repo.retrieveAtom(x)
            for pkg_id in sorted(search_results, key=key_sorter):
                print_package_info(
                    pkg_id,
                    entropy_client,
                    repo,
                    installed_search=True,
                    strict_output=quiet,
                    extended=verbose,
                    quiet=quiet,
                )

            if quiet:
                continue

            masking_reason = ""
            if repo_masked:
                masking_reason = ", %s" % (settings["pkg_masking_reasons"].get(idmasking_reason),)
            repo_masked_str = const_convert_to_unicode(repo_masked)
            mask_str = bold(repo_masked_str) + masking_reason

            toc = []
            toc.append(("%s:" % (blue(_("Keyword")),), purple(package)))
            toc.append(("%s:" % (blue(_("Matched")),), teal(found_atom)))
            toc.append(("%s:" % (blue(_("Masked")),), mask_str))

            if match_in_repo:
                where = "%s %s" % (_("from repository"), repository_id)
            else:
                where = _("from the installed packages repository")

            entry_str = ngettext("entry", "entries", len(search_results))
            toc.append(("%s:" % (blue(_("Found")),), "%s %s %s" % (len(search_results), brown(entry_str), where)))
            print_table(entropy_client, toc)

        return 0
コード例 #17
0
ファイル: query.py プロジェクト: Rogentos/entropy
    def _belongs(self, entropy_client, inst_repo):
        """
        Solo Query Belongs command.
        """
        quiet = self._nsargs.quiet
        verbose = self._nsargs.verbose
        files = self._nsargs.files

        if not quiet:
            entropy_client.output(darkgreen(_("Belong Search")), header=darkred(" @@ "))

        results = {}
        reverse_symlink_map = entropy_client.Settings()["system_rev_symlinks"]

        for xfile in files:
            outcome = results.setdefault(xfile, set())

            pkg_ids = inst_repo.searchBelongs(xfile)
            if not pkg_ids:
                # try real path if possible
                pkg_ids = inst_repo.searchBelongs(os.path.realpath(xfile))

            if not pkg_ids:
                # try using reverse symlink mapping
                for sym_dir in reverse_symlink_map:
                    if not xfile.startswith(sym_dir):
                        continue

                    for sym_child in reverse_symlink_map[sym_dir]:
                        my_file = sym_child + xfile[len(sym_dir) :]
                        pkg_ids = inst_repo.searchBelongs(my_file)
                        if pkg_ids:
                            break

            outcome.update(pkg_ids)

        key_sorter = lambda x: inst_repo.retrieveAtom(x)

        matches_found = 0

        for xfile, pkg_ids in results.items():

            matches_found += len(pkg_ids)  # can be incorrect

            for pkg_id in sorted(pkg_ids, key=key_sorter):
                if quiet:
                    atom = inst_repo.retrieveAtom(pkg_id)
                    if atom is not None:
                        entropy_client.output(atom, level="generic")
                else:
                    print_package_info(
                        pkg_id, entropy_client, inst_repo, installed_search=True, extended=verbose, quiet=quiet
                    )

            if not quiet:
                entries_txt = ngettext("entry", "entries", len(pkg_ids))
                toc = []
                toc.append(("%s:" % (blue(_("Keyword")),), purple(xfile)))
                toc.append(("%s:" % (blue(_("Found")),), "%s %s" % (len(pkg_ids), brown(entries_txt))))
                print_table(entropy_client, toc)

        return 0