From 280a7067b32fbf6d2c9e6fcb0defe56c9f758cd9 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Sun, 4 Nov 2012 21:11:56 +0100 Subject: [PATCH] [entropy.cli] drop module, move code to client/ and server/ Even though it is a small code duplication, entropy.cli does make much less sense. --- client/solo/utils.py | 7 +- docs/TODO | 5 +- rigo/RigoDaemon/app.py | 36 +- server/eit/commands/graph.py | 3 +- server/eit/commands/match.py | 2 +- server/eit/commands/own.py | 2 +- server/eit/commands/query.py | 3 +- server/eit/commands/revgraph.py | 2 +- server/eit/commands/search.py | 2 +- server/eit/commands/status.py | 5 +- lib/entropy/cli.py => server/eit/utils.py | 511 +++++----------------- services/kernel-switcher | 2 +- 12 files changed, 153 insertions(+), 427 deletions(-) rename lib/entropy/cli.py => server/eit/utils.py (66%) diff --git a/client/solo/utils.py b/client/solo/utils.py index 2a6e61023..f5828ff49 100644 --- a/client/solo/utils.py +++ b/client/solo/utils.py @@ -643,7 +643,8 @@ def _revgraph_package(entropy_client, installed_pkg_id, package, dbconn, # ensure package availability in graph, initialize now graph.add(inst_item, set()) - rev_pkgs_sorter = lambda x: dbconn.retrieveAtom(x) + def rev_pkgs_sorter(_pkg_id): + return dbconn.retrieveAtom(_pkg_id) while stack.is_filled(): @@ -651,7 +652,7 @@ def _revgraph_package(entropy_client, installed_pkg_id, package, dbconn, if item in stack_cache: continue stack_cache.add(item) - pkg_id, was_dep = item + pkg_id, _was_dep = item rev_deps = dbconn.retrieveReverseDependencies(pkg_id, exclude_deptypes = excluded_dep_types) @@ -736,7 +737,7 @@ def _graph_package(match, package, entropy_intf, show_complete = False, if item in stack_cache: continue stack_cache.add(item) - ((pkg_id, repo_id,), was_dep, dep_type) = item + ((pkg_id, repo_id,), _was_dep, dep_type) = item # deps repodb = entropy_intf.open_repository(repo_id) diff --git a/docs/TODO b/docs/TODO index 425ae8961..bf540f87f 100644 --- a/docs/TODO +++ b/docs/TODO @@ -3,9 +3,8 @@ Backlog (raw) 1.0: - solo branch: - move etpConst['install_sources'] to entropy.db - drop entropy.cli (it is used by other stuff, what to do?) - drop etpUi + drop etpUi (anaconda uses etpUi['mute']) + fixup etpUi usage in lib/ ! - preserved-libs registry: only drop old sonames when installed packages diff --git a/rigo/RigoDaemon/app.py b/rigo/RigoDaemon/app.py index 1cebf2d7e..d952f3e48 100755 --- a/rigo/RigoDaemon/app.py +++ b/rigo/RigoDaemon/app.py @@ -70,13 +70,12 @@ from entropy.i18n import _ from entropy.misc import LogFile, ParallelTask, TimeScheduled, \ ReadersWritersSemaphore from entropy.fetchers import UrlFetcher, MultipleUrlFetcher -from entropy.output import TextInterface, purple +from entropy.output import TextInterface, purple, teal from entropy.client.interfaces import Client from entropy.client.interfaces.package import Package from entropy.client.interfaces.repository import Repository from entropy.services.client import WebService from entropy.core.settings.base import SystemSettings -from entropy.cli import get_entropy_webservice import entropy.tools import entropy.dep @@ -96,6 +95,39 @@ if DAEMON_LOGGING: sys.stderr = DAEMON_LOG sys.stdout = DAEMON_LOG + +def get_entropy_webservice(entropy_client, repository_id, tx_cb = False): + """ + Get Entropy Web Services service object (ClientWebService). + + @param entropy_client: Entropy Client interface + @type entropy_client: entropy.client.interfaces.Client + @param repository_id: repository identifier + @type repository_id: string + @return: the ClientWebService instance + @rtype: entropy.client.services.interfaces.ClientWebService + @raise WebService.UnsupportedService: if service is unsupported by + repository + """ + def _transfer_callback(transfered, total, download): + if download: + action = _("Downloading") + else: + action = _("Uploading") + + percent = 100 + if (total > 0) and (transfered <= total): + percent = int(round((float(transfered)/total) * 100, 1)) + + msg = "[%s%s] %s ..." % (purple(str(percent)), "%", teal(action)) + entropy_client.output(msg, back=True) + + factory = entropy_client.WebServices() + webserv = factory.new(repository_id) + if tx_cb: + webserv._set_transfer_callback(_transfer_callback) + return webserv + def write_output(message, debug=False): message = time.strftime('[%H:%M:%S %d/%m/%Y %Z]') + " " + message if DAEMON_LOGGING: diff --git a/server/eit/commands/graph.py b/server/eit/commands/graph.py index bbbb45cd6..827b24537 100644 --- a/server/eit/commands/graph.py +++ b/server/eit/commands/graph.py @@ -13,11 +13,10 @@ import sys import argparse from entropy.i18n import _ -from entropy.cli import graph_packages from eit.commands.descriptor import EitCommandDescriptor from eit.commands.command import EitCommand - +from eit.utils import graph_packages class EitGraph(EitCommand): """ diff --git a/server/eit/commands/match.py b/server/eit/commands/match.py index feb2d0b0b..56fc48f6b 100644 --- a/server/eit/commands/match.py +++ b/server/eit/commands/match.py @@ -14,10 +14,10 @@ import argparse from entropy.i18n import _ from entropy.output import purple -from entropy.cli import print_package_info from eit.commands.descriptor import EitCommandDescriptor from eit.commands.command import EitCommand +from eit.utils import print_package_info class EitMatch(EitCommand): diff --git a/server/eit/commands/own.py b/server/eit/commands/own.py index 301ea2214..fd42d671b 100644 --- a/server/eit/commands/own.py +++ b/server/eit/commands/own.py @@ -15,10 +15,10 @@ import argparse from entropy.i18n import _ from entropy.output import purple, darkgreen, teal, bold -from entropy.cli import print_package_info from eit.commands.descriptor import EitCommandDescriptor from eit.commands.command import EitCommand +from eit.utils import print_package_info class EitOwn(EitCommand): diff --git a/server/eit/commands/query.py b/server/eit/commands/query.py index 2e949cf34..b6f872a74 100644 --- a/server/eit/commands/query.py +++ b/server/eit/commands/query.py @@ -14,12 +14,11 @@ import argparse from entropy.output import purple, darkgreen, bold, brown, teal from entropy.const import etpConst -from entropy.cli import print_package_info from entropy.i18n import _ from eit.commands.descriptor import EitCommandDescriptor from eit.commands.command import EitCommand - +from eit.utils import print_package_info class EitQuery(EitCommand): """ diff --git a/server/eit/commands/revgraph.py b/server/eit/commands/revgraph.py index ce7825e53..a2ebccf91 100644 --- a/server/eit/commands/revgraph.py +++ b/server/eit/commands/revgraph.py @@ -13,10 +13,10 @@ import sys import argparse from entropy.i18n import _ -from entropy.cli import revgraph_packages from eit.commands.descriptor import EitCommandDescriptor from eit.commands.command import EitCommand +from eit.utils import revgraph_packages class EitRevgraph(EitCommand): diff --git a/server/eit/commands/search.py b/server/eit/commands/search.py index 9bc505e2b..e4a355d4d 100644 --- a/server/eit/commands/search.py +++ b/server/eit/commands/search.py @@ -14,10 +14,10 @@ import argparse from entropy.i18n import _ from entropy.output import purple -from entropy.cli import print_package_info from eit.commands.descriptor import EitCommandDescriptor from eit.commands.command import EitCommand +from eit.utils import print_package_info class EitSearch(EitCommand): diff --git a/server/eit/commands/status.py b/server/eit/commands/status.py index 0832a196d..77b058729 100644 --- a/server/eit/commands/status.py +++ b/server/eit/commands/status.py @@ -18,10 +18,9 @@ from entropy.i18n import _ from entropy.output import darkgreen, teal, brown, darkred, \ bold, purple, blue -from entropy.cli import print_table - from eit.commands.descriptor import EitCommandDescriptor from eit.commands.command import EitCommand +from eit.utils import print_table class EitStatus(EitCommand): @@ -153,7 +152,7 @@ Show repository status (such as: *configured mirrors*, toc.append((" %s:" % (darkgreen(_("unstaged packages")),), str(unstaged_len),)) - print_table(toc) + print_table(entropy_server, toc) del toc[:] entropy_server.output("") diff --git a/lib/entropy/cli.py b/server/eit/utils.py similarity index 66% rename from lib/entropy/cli.py rename to server/eit/utils.py index f0cda6914..84ed5a62b 100644 --- a/lib/entropy/cli.py +++ b/server/eit/utils.py @@ -6,387 +6,41 @@ @copyright: Fabio Erculiani @license: GPL-2 - B{Entropy misc command line interface (CLI) module}. - In this module are enclosed all the miscellaneous functions - used by Command Line based applications. + B{Entropy Infrastructure Toolkit}. """ -import sys -import os -import time -import subprocess -import codecs - from entropy.const import etpConst, const_convert_to_unicode -from entropy.output import print_info, print_generic, writechar, blue, \ - red, bold, darkred, brown, darkblue, purple, teal, darkgreen, \ - decolorize +from entropy.i18n import _ +from entropy.output import darkgreen, purple, blue, \ + brown, bold, red, darkred, teal, decolorize from entropy.graph import Graph from entropy.misc import Lifo -from entropy.i18n import _ import entropy.dep -def cleanup(directories): - """ - Temporary files cleaner. - @param directories: list of directory paths - @type directories: list - @return: exit status - @rtype: int - """ - counter = 0 - for xdir in directories: - if not os.path.isdir(xdir): - continue - print_info("%s %s %s..." % (_("Cleaning"), darkgreen(xdir), - _("directory"),), back = True) - for data in os.listdir(xdir): - subprocess.call(["rm", "-rf", os.path.join(xdir, data)]) - counter += 1 +def show_dependencies_legend(entropy_server, indent = '', + get_data = False): + data = [] + dep_type_ids = etpConst['dependency_type_ids'] + for dep_id, dep_val in sorted(dep_type_ids.items(), + key = lambda x: x[0], reverse = True): - print_info("%s: %s %s" % ( - _("Cleaned"), counter, _("files and directories"),)) - return 0 - -def print_bashcomp(data, cmdline, cb_map): - """ - Print bash completion string for readline consumption using Entropy - menu declaration format. - - @param data: Entropy menu declaration format - @type data: list - @param cmdline: list of cmdline args - @type cmdline: list - @param cb_map: map of completed commands callbacks, signature: - cb_map_callback(cur_cmdline) - @type cb_map: dict - """ - cmdline = cmdline[1:] - cmdline_len = len(cmdline) # drop --stuff - - comp_line = [] - previous_complete = False - if cmdline: - last_cmdline = cmdline[-1] - else: - last_cmdline = '###impossible' - - try: - prev_cmdline = cmdline[-2] - except IndexError: - prev_cmdline = None - cur_cb = cb_map.get(prev_cmdline) - if cur_cb is not None: - ext_comp_line = cur_cb(cmdline) - if ext_comp_line: - comp_line.extend(ext_comp_line) - - got_inside = False - - for item in data: - - if item is None: - continue - - if item[0] == cmdline_len: - - if item[1].startswith("--") and \ - not last_cmdline.startswith("-"): - # skip --opts - continue - - got_inside = True - if item[1] == last_cmdline: - cmdline_len += 1 - previous_complete = True - continue - elif item[1].startswith(last_cmdline): - comp_line.append(item[1]) - elif previous_complete: - comp_line.append(item[1]) - - if (item[0] < cmdline_len) and got_inside and previous_complete: - break - - if comp_line: - print_generic(' '.join(comp_line)) - -def print_menu(data, args = None): - """ - Function used by Entropy text client (will be moved from here) to - print the menu output given a properly formatted list. - This method is not intended for general used and will be moved away from - here. - """ - if args == None: - args = [] - - def orig_myfunc(x): - return x - def orig_myfunc_desc(x): - return x - - try: - i = args.index("--help") - del args[i] - command = args.pop(0) - except ValueError: - command = None - except IndexError: - command = None - section_found = False - search_depth = 1 - - - for item in data: - myfunc = orig_myfunc - myfunc_desc = orig_myfunc_desc - - if not item: - if command is None: - writechar("\n") + dep_desc = etpConst['dependency_type_ids_desc'].get( + dep_id, _("N/A")) + txt = '%s%s%s%s %s' % ( + indent, teal("{"), dep_val, teal("}"), dep_desc,) + if get_data: + data.append(txt) else: - n_indent = item[0] - name = item[1] - n_d_ident = item[2] - desc = item[3] - if command is not None: - name_strip = name.split()[0].strip() - if name_strip == command and n_indent == search_depth: - try: - command = args.pop(0) - search_depth = n_indent + 1 - except IndexError: - command = "##unused_from_now_on" - section_found = True - indent_level = n_indent - elif section_found: - if n_indent <= indent_level: - return - else: - continue + entropy_server.output(txt) + if get_data: + return data - if n_indent == 0: - writechar(" ") - # setup identation - ind_th = 0 - if command is not None: # so that partial --help looks nicer - ind_th = 1 - while n_indent > ind_th: - n_indent -= 1 - writechar("\t") - n_indent = item[0] - - # write name - if n_indent == 0: - myfunc = darkgreen - elif n_indent == 1: - myfunc = blue - myfunc_desc = darkgreen - elif n_indent == 2: - if not name.startswith("--"): - myfunc = red - myfunc_desc = brown - elif n_indent == 3: - myfunc = darkblue - myfunc_desc = purple - func_out = myfunc(name) - print_generic(func_out, end = "") - - # write desc - if desc: - while n_d_ident > 0: - n_d_ident -= 1 - writechar("\t") - desc = myfunc_desc(desc) - print_generic(desc, end = "") - writechar("\n") - -def print_table(lines_data, cell_spacing = 2, cell_padding = 0, - side_color = darkgreen): - """ - Print a table composed by len(lines_data[i]) columns and len(lines_data) - rows. - - @param lines_data: list of row data - @type lines_data: list - @keyword cell_spacing: cell spacing - @type cell_spacing: int - @keyword cell_padding: cell padding - @type cell_padding: int - @keyword side_color: colorization callback function - @type side_color: callable - """ - column_sizes = {} - padding_side = int((cell_padding / 2)) - col_n = 0 - for cols in lines_data: - if not isinstance(cols, (list, tuple)): - # can be a plain string - continue - col_n = 0 - for cell in cols: - cell_len = len(" "*padding_side + decolorize(cell.split("\n")[0]) \ - + " "*padding_side) - cur_len = column_sizes.get(col_n) - if cur_len is None: - column_sizes[col_n] = cell_len - elif cur_len < cell_len: - column_sizes[col_n] = cell_len - col_n += 1 - - # now actually print - if col_n > 0: - column_sizes[col_n - 1] = 0 - for cols in lines_data: - print_generic(side_color(">>") + " ", end = " ") - if isinstance(cols, (list, tuple)): - col_n = 0 - for cell in cols: - max_len = column_sizes[col_n] - cell = " "*padding_side + cell + " "*padding_side - delta_len = max_len - len(decolorize(cell.split("\n")[0])) + \ - cell_spacing - if col_n == (len(cols) - 1): - print_generic(cell) - else: - print_generic(cell, end = " "*delta_len) - col_n += 1 - else: - print_generic(cols) - -def countdown(secs = 5, what = "Counting...", back = False): - """ - Print countdown. - - @keyword secs: countdown seconds - @type secs: int - @keyword what: countdown text - @type what: string - @keyword back: write \n at the end if True - @type back: bool - """ - if secs: - if back: - try: - print_generic(red(">>") + " " + what, end = "") - except UnicodeEncodeError: - print_generic(red(">>") + " " + what.encode('utf-8'), - end = "") - else: - print_generic(what) - for i in range(secs)[::-1]: - sys.stdout.write(purple(str(i+1)+" ")) - sys.stdout.flush() - time.sleep(1) - -def enlightenatom(atom): - """ - Colorize package atoms with standard colors. - - @param atom: atom string - @type atom: string - @return: colorized string - @rtype: string - """ - entropy_rev = entropy.dep.dep_get_entropy_revision(atom) - if entropy_rev is None: - entropy_rev = '' - else: - entropy_rev = '~%s' % (str(entropy_rev),) - entropy_tag = entropy.dep.dep_gettag(atom) - if entropy_tag is None: - entropy_tag = '' - else: - entropy_tag = '#%s' % (entropy_tag,) - clean_atom = entropy.dep.remove_entropy_revision(atom) - clean_atom = entropy.dep.remove_tag(clean_atom) - only_cpv = entropy.dep.dep_getcpv(clean_atom) - operator = clean_atom[:len(clean_atom)-len(only_cpv)] - cat, name, pv, rev = entropy.dep.catpkgsplit(only_cpv) - if rev == "r0": - rev = '' - else: - rev = '-%s' % (rev,) - return "%s%s%s%s%s%s%s" % (purple(operator), teal(cat + "/"), - darkgreen(name), purple("-"+pv), purple(rev), brown(entropy_tag), - teal(entropy_rev),) - -def read_equo_release(): - """ - Read Equo release. - - @rtype: None - @return: None - """ - # handle Entropy Version - revision_file = "../client/revision" - if not os.path.isfile(revision_file): - revision_file = os.path.join(etpConst['installdir'], - 'client/revision') - if os.path.isfile(revision_file) and \ - os.access(revision_file, os.R_OK): - - enc = etpConst['conf_encoding'] - with codecs.open(revision_file, "r", encoding=enc) \ - as rev_f: - myrev = rev_f.readline().strip() - return myrev - - return "0" - -def get_file_mime(file_path): - if not os.path.isfile(file_path): - return None - try: - import magic - except ImportError: - return None - handle = magic.open(magic.MAGIC_MIME) - handle.load() - mime = handle.file(file_path) - handle.close() - if mime: - mime = mime.split(";")[0] - return mime - -def _transfer_callback(transfered, total, download): - if download: - action = _("Downloading") - else: - action = _("Uploading") - - percent = 100 - if (total > 0) and (transfered <= total): - percent = int(round((float(transfered)/total) * 100, 1)) - - msg = "[%s%s] %s ..." % (purple(str(percent)), "%", teal(action)) - print_info(msg, back = True) - -def get_entropy_webservice(entropy_client, repository_id, tx_cb = False): - """ - Get Entropy Web Services service object (ClientWebService). - - @param entropy_client: Entropy Client interface - @type entropy_client: entropy.client.interfaces.Client - @param repository_id: repository identifier - @type repository_id: string - @return: the ClientWebService instance - @rtype: entropy.client.services.interfaces.ClientWebService - @raise WebService.UnsupportedService: if service is unsupported by - repository - """ - factory = entropy_client.WebServices() - webserv = factory.new(repository_id) - if tx_cb: - webserv._set_transfer_callback(_transfer_callback) - return webserv - -def print_package_info(package_id, entropy_client, entropy_repository, +def print_package_info(package_id, entropy_server, entropy_repository, installed_search = False, strict_output = False, extended = False, - quiet = False, show_repo_if_quiet = False, show_desc_if_quiet = False): + quiet = False, show_repo_if_quiet = False, show_desc_if_quiet = False, + show_slot_if_quiet = False): """ Print Entropy Package Metadata in a pretty and uniform way. """ @@ -402,7 +56,10 @@ def print_package_info(package_id, entropy_client, entropy_repository, entropy_repository.retrieveDescription(package_id),) if not extended: pkgatom = entropy.dep.dep_getkey(pkgatom) - entropy_client.output( + if show_slot_if_quiet: + pkgatom += etpConst['entropyslotprefix'] + pkgatom += entropy_repository.retrieveSlot(package_id) + entropy_server.output( "%s%s%s" % (repoinfo, pkgatom, desc,), level="generic") return @@ -434,18 +91,18 @@ def print_package_info(package_id, entropy_client, entropy_repository, if not installed_search: # client info - pkginstalled = entropy_client.installed_repository().atomMatch( + pkginstalled = entropy_server.installed_repository().atomMatch( entropy.dep.dep_getkey(pkgatom), matchSlot = pkgslot) if pkginstalled[1] == 0: idx = pkginstalled[0] # found - installed_ver = entropy_client.installed_repository( + installed_ver = entropy_server.installed_repository( ).retrieveVersion(idx) or corrupted_str - installed_tag = entropy_client.installed_repository( + installed_tag = entropy_server.installed_repository( ).retrieveTag(idx) if not installed_tag: installed_tag = "NoTag" - installed_rev = entropy_client.installed_repository( + installed_rev = entropy_server.installed_repository( ).retrieveRevision(idx) if installed_rev is None: installed_rev = const_convert_to_unicode("0") @@ -454,7 +111,7 @@ def print_package_info(package_id, entropy_client, entropy_repository, toc = [] - entropy_client.output(red(" @@ %s: " % (_("Package"),) ) + \ + entropy_server.output(red(" @@ %s: " % (_("Package"),) ) + \ bold(pkgatom) + \ " "+ blue("%s: " % (_("branch"),)) + bold(pkgbranch) + \ ", [" + purple(str(entropy_repository.repository_id())) + "] ") @@ -478,7 +135,7 @@ def print_package_info(package_id, entropy_client, entropy_repository, if package_id_masked == -1: pkgmasked = True masking_reason = ", %s" % ( - entropy_client.Settings()['pkg_masking_reasons'].get( + entropy_server.Settings()['pkg_masking_reasons'].get( idmasking_reason),) toc.append((darkgreen(" %s:" % (_("Masked"),)), @@ -535,7 +192,7 @@ def print_package_info(package_id, entropy_client, entropy_repository, # show legend len_txt = " %s" % (brown("##"),) toc.append((len_txt, "%s:" % (blue(_("Legend")),),)) - dep_leg = show_dependencies_legend(entropy_client, + dep_leg = show_dependencies_legend(entropy_server, indent = "", get_data = True) toc.extend([(len_txt, x) for x in dep_leg]) @@ -548,8 +205,8 @@ def print_package_info(package_id, entropy_client, entropy_repository, brown(conflict),)) home_txt = " %s:" % (_("Homepage"),) - home_lines = _my_formatted_print( - entropy_client, pkghome, "", "", color = brown, + home_lines = _formatted_print( + entropy_server, pkghome, "", "", color = brown, min_chars = 15, get_data = True) for home_line in home_lines: toc.append((darkgreen(home_txt), home_line,)) @@ -558,8 +215,8 @@ def print_package_info(package_id, entropy_client, entropy_repository, if not strict_output: desc_txt = " %s:" % (_("Description"),) - desc_lines = _my_formatted_print( - entropy_client, pkgdesc, "", "", get_data = True) + desc_lines = _formatted_print( + entropy_server, pkgdesc, "", "", get_data = True) for desc_line in desc_lines: toc.append((darkgreen(desc_txt), purple(desc_line))) desc_txt = " " @@ -567,8 +224,8 @@ def print_package_info(package_id, entropy_client, entropy_repository, if extended: pkguseflags = entropy_repository.retrieveUseflags(package_id) use_txt = " %s:" % (_("USE flags"),) - use_lines = _my_formatted_print( - entropy_client, + use_lines = _formatted_print( + entropy_server, pkguseflags, "", "", color = teal, get_data = True) for use_line in use_lines: @@ -607,8 +264,8 @@ def print_package_info(package_id, entropy_client, entropy_repository, pkgkeywords = ' '.join( sorted(entropy_repository.retrieveKeywords(package_id))) keyword_txt = " %s:" % (_("Keywords"),) - keyword_lines = _my_formatted_print( - entropy_client, pkgkeywords, "", "", + keyword_lines = _formatted_print( + entropy_server, pkgkeywords, "", "", color = brown, get_data = True) for keyword_line in keyword_lines: toc.append((darkgreen(keyword_txt), brown(keyword_line))) @@ -630,10 +287,10 @@ def print_package_info(package_id, entropy_client, entropy_repository, toc.append((darkgreen(" %s:" % (_("License"),)), teal(pkglic))) - print_table(toc, cell_spacing = 3) + print_table(entropy_server, toc, cell_spacing = 3) -def _my_formatted_print(entropy_client, data, header, reset_columns, - min_chars = 25, color = None, get_data = False): +def _formatted_print(entropy_server, data, header, reset_columns, + min_chars = 25, color = None, get_data = False): out_data = [] @@ -657,35 +314,74 @@ def _my_formatted_print(entropy_client, data, header, reset_columns, if get_data: out_data.append(desc_text) else: - entropy_client.output(desc_text) + entropy_server.output(desc_text) desc_text = reset_columns if fcount > 0: if get_data: out_data.append(desc_text) else: - entropy_client.output(desc_text) + entropy_server.output(desc_text) if get_data: return out_data -def show_dependencies_legend(entropy_client, indent = '', - get_data = False): - data = [] - dep_type_ids = etpConst['dependency_type_ids'] - for dep_id, dep_val in sorted(dep_type_ids.items(), - key = lambda x: x[0], reverse = True): +def print_table(entropy_server, lines_data, + cell_spacing=2, cell_padding=0, + side_color=darkgreen): + """ + Print a table composed by len(lines_data[i]) columns and len(lines_data) + rows. - dep_desc = etpConst['dependency_type_ids_desc'].get( - dep_id, _("N/A")) - txt = '%s%s%s%s %s' % ( - indent, teal("{"), dep_val, teal("}"), dep_desc,) - if get_data: - data.append(txt) + @param lines_data: list of row data + @type lines_data: list + @keyword cell_spacing: cell spacing + @type cell_spacing: int + @keyword cell_padding: cell padding + @type cell_padding: int + @keyword side_color: colorization callback function + @type side_color: callable + """ + column_sizes = {} + padding_side = int((cell_padding / 2)) + col_n = 0 + for cols in lines_data: + if not isinstance(cols, (list, tuple)): + # can be a plain string + continue + col_n = 0 + for cell in cols: + cell_len = len(" "*padding_side + decolorize(cell.split("\n")[0]) \ + + " "*padding_side) + cur_len = column_sizes.get(col_n) + if cur_len is None: + column_sizes[col_n] = cell_len + elif cur_len < cell_len: + column_sizes[col_n] = cell_len + col_n += 1 + + # now actually print + if col_n > 0: + column_sizes[col_n - 1] = 0 + for cols in lines_data: + txt = side_color(">>") + " " + + if isinstance(cols, (list, tuple)): + col_n = 0 + for cell in cols: + max_len = column_sizes[col_n] + cell = " "*padding_side + cell + " "*padding_side + delta_len = max_len - \ + len(decolorize(cell.split("\n")[0])) + \ + cell_spacing + if col_n == (len(cols) - 1): + txt += cell + else: + txt += cell + " "*delta_len + col_n += 1 else: - entropy_client.output(txt) - if get_data: - return data + txt += cols + entropy_server.output(txt, level="generic") def revgraph_packages(packages, entropy_client, complete = False, repository_ids = None, quiet = False): @@ -811,7 +507,8 @@ def _revgraph_package(entropy_client, installed_pkg_id, package, dbconn, # ensure package availability in graph, initialize now graph.add(inst_item, set()) - rev_pkgs_sorter = lambda x: dbconn.retrieveAtom(x) + def rev_pkgs_sorter(_pkg_id): + return dbconn.retrieveAtom(_pkg_id) while stack.is_filled(): @@ -819,7 +516,7 @@ def _revgraph_package(entropy_client, installed_pkg_id, package, dbconn, if item in stack_cache: continue stack_cache.add(item) - pkg_id, was_dep = item + pkg_id, _was_dep = item rev_deps = dbconn.retrieveReverseDependencies(pkg_id, exclude_deptypes = excluded_dep_types) @@ -904,7 +601,7 @@ def _graph_package(match, package, entropy_intf, show_complete = False, if item in stack_cache: continue stack_cache.add(item) - ((pkg_id, repo_id,), was_dep, dep_type) = item + ((pkg_id, repo_id,), _was_dep, _dep_type) = item # deps repodb = entropy_intf.open_repository(repo_id) diff --git a/services/kernel-switcher b/services/kernel-switcher index 8aa1234f3..dddbeb445 100755 --- a/services/kernel-switcher +++ b/services/kernel-switcher @@ -20,12 +20,12 @@ from entropy.output import teal, purple, darkgreen, blue, brown, print_info, \ from entropy.exceptions import DependenciesNotRemovable from entropy.i18n import _ from entropy.client.interfaces import Client -from entropy.cli import print_package_info import entropy.dep import entropy.tools # solo modules from solo.commands.install import SoloInstall +from solo.utils import print_package_info APP_NAME = os.path.basename(sys.argv[0]) KERNEL_BINARY_VIRTUAL = const_convert_to_unicode("virtual/linux-binary")