[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.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
+34
-2
@@ -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:
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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("")
|
||||
|
||||
|
||||
@@ -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:
|
||||
<list of args to append> 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)
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user