[equo] migrate to the new Entropy Web Services interface

This commit is contained in:
Fabio Erculiani
2011-04-07 10:37:19 +02:00
parent a60c456b57
commit 2aa325560d
4 changed files with 437 additions and 237 deletions
+23 -9
View File
@@ -23,8 +23,12 @@ from entropy.const import etpConst, etpUi
from entropy.output import red, darkred, blue, brown, bold, darkgreen, green, \
print_info, print_warning, print_error, purple, teal
from entropy.core.settings.base import SystemSettings as SysSet
from entropy.misc import ParallelTask
from entropy.i18n import _
from text_tools import print_table
from entropy.services.client import WebService
from text_tools import print_table, get_entropy_webservice
import entropy.tools
SystemSettings = SysSet()
@@ -431,19 +435,29 @@ def _do_sync(entropy_client, repo_identifiers = None, force = False):
_("Unhandled exception"), err,)))
return 2
def _spawn_ugc():
for repository in repo_identifiers:
try:
webserv = get_entropy_webservice(entropy_client,
repository, tx_cb = False)
except WebService.UnsupportedService:
continue
try:
webserv.add_downloads([repository],
clear_available_cache = True)
except WebService.WebServiceException as err:
const_debug_write(__name__, repr(err))
continue
ugc_th = ParallelTask(_spawn_ugc)
ugc_th.start()
rc = repo_intf.sync()
if not rc:
for reponame in repo_identifiers:
# inform UGC that we are syncing this repo
if entropy_client.UGC is not None:
try:
entropy_client.UGC.add_download_stats(reponame, [reponame])
except TimeoutError:
continue
for reponame in repo_identifiers:
_show_notice_board_summary(entropy_client, reponame)
ugc_th.join()
return rc
def _check_notice_board_availability(entropy_client, reponame):
+32
View File
@@ -355,3 +355,35 @@ def get_file_mime(file_path):
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
+343 -209
View File
@@ -12,20 +12,26 @@
import os
from entropy.const import etpConst, const_isstring, const_convert_to_unicode
from entropy.output import bold, darkgreen, red, darkred, blue, purple, brown, \
print_info, print_warning, print_error
teal, print_info, print_warning, print_error
from entropy.services.client import WebService
from entropy.client.services.interfaces import Document, DocumentFactory, \
ClientWebService
from entropy.i18n import _
from text_tools import get_entropy_webservice as _get_service
import entropy.tools
def ugc(options):
if not options:
return 0
return -10
cmd = options.pop(0)
do_force = False
myopts = []
for opt in options[1:]:
for opt in options:
if opt == "--force":
do_force = True
elif opt.startswith("--"):
@@ -41,7 +47,6 @@ def ugc(options):
entropy_client = None
try:
entropy_client = Client()
entropy_client.UGC.show_progress = True
if cmd == "login":
if options:
rc = _ugc_login(entropy_client, options[0],
@@ -66,11 +71,21 @@ def _ugc_login(entropy_client, repository, force = False):
if repository not in entropy_client.repositories():
print_error(red("%s: %s." % (_("Invalid repository"), repository,)))
entropy_client.UGC.remove_login(repository)
return 1
login_data = entropy_client.UGC.read_login(repository)
if (login_data != None) and not force:
try:
webserv = _get_service(entropy_client, repository, tx_cb = True)
except WebService.UnsupportedService:
print_info(
"[%s] %s." % (
darkgreen(repository),
blue(_("Repository does not support Entropy Services.")),
)
)
return 1
username = webserv.get_credentials()
if (username is not None) and not force:
print_info(
"[%s] %s %s. %s." % (
darkgreen(repository),
@@ -80,31 +95,60 @@ def _ugc_login(entropy_client, repository, force = False):
)
)
return 0
elif (login_data != None) and force:
entropy_client.UGC.remove_login(repository)
elif (username is not None) and force:
webserv.remove_credentials(repository)
status, msg = entropy_client.UGC.login(repository)
if status:
login_data = entropy_client.UGC.read_login(repository)
print_info(
"[%s:uid:%s] %s: %s. %s." % (
def fake_callback(*args, **kwargs):
return True
# use input box to read login
input_params = [
('username', _('Username'), fake_callback, False),
('password', _('Password'), fake_callback, True)
]
login_data = entropy_client.input_box(
"%s %s %s" % (
_('Please login against'), repository, _('repository'),),
input_params,
cancel_button = True
)
if not login_data:
print_warning(
"[%s] %s" % (
darkgreen(repository),
etpConst['uid'],
blue(_("Successfully logged in as")),
bold(login_data[0]),
blue(_("From now on, any UGC action will be committed as this user"))
)
)
return 0
else:
print_info(
"[%s] %s." % (
darkgreen(repository),
blue(_("Login error. Not logged in.")),
blue(_("Login aborted. Not logged in.")),
)
)
return 1
username, password = login_data['username'], login_data['password']
webserv.add_credentials(username, password)
try:
webserv.validate_credentials()
except WebService.AuthenticationFailed:
print_warning(
"[%s] %s" % (
darkgreen(repository),
blue(_("Authentication error. Not logged in.")),
)
)
return 1
print_info(
"[%s:uid:%s] %s: %s." % (
darkgreen(repository),
etpConst['uid'],
blue(_("Successfully logged in as")),
bold(username)
)
)
print_info(
"%s." % (
blue(_("From now on, any UGC action will be committed as this user"))
)
)
return 0
def _ugc_logout(entropy_client, repository):
@@ -112,24 +156,36 @@ def _ugc_logout(entropy_client, repository):
print_error(red("%s: %s." % (_("Invalid repository"), repository,)))
return 1
login_data = entropy_client.UGC.read_login(repository)
if login_data == None:
try:
webserv = _get_service(entropy_client, repository)
except WebService.UnsupportedService:
print_info(
"[%s] %s." % (
"[%s] %s" % (
darkgreen(repository),
blue(_("Not logged in")),
blue(_("Repository does not support Entropy Services.")),
)
)
else:
entropy_client.UGC.remove_login(repository)
return 1
username = webserv.get_credentials()
if username is None:
print_info(
"[%s] %s %s %s." % (
"[%s] %s" % (
darkgreen(repository),
blue(_("User")),
bold(login_data[0]),
blue(_("has been logged out")),
blue(_("Not logged in.")),
)
)
return 0
webserv.remove_credentials()
print_info(
"[%s] %s %s %s" % (
darkgreen(repository),
blue(_("User")),
bold(username),
blue(_("has been logged out.")),
)
)
return 0
def _ugc_votes(entropy_client, options):
@@ -146,30 +202,54 @@ def _ugc_votes(entropy_client, options):
pkgkey = options[0]
options = options[1:]
if repository not in entropy_client.repositories():
print_error(red("%s: %s." % (_("Invalid repository"), repository,)))
return 1
try:
webserv = _get_service(entropy_client, repository)
except WebService.UnsupportedService:
print_info(
"[%s] %s" % (
darkgreen(repository),
blue(_("Repository does not support Entropy Services.")),
)
)
return 1
username = webserv.get_credentials()
if username is None:
print_info(
"[%s] %s" % (
darkgreen(repository),
blue(_("Not logged in, please login first.")),
)
)
return 0
rc = 0
if cmd == "get":
data, err_string = entropy_client.UGC.get_vote(repository, pkgkey)
if not isinstance(data, float):
try:
vote = webserv.get_votes([pkgkey], cache = False)[pkgkey]
except WebService.WebServiceException as err:
print_error(
"[%s:%s] %s: %s, %s" % (
darkgreen(repository),
"[%s] %s: %s" % (
darkred(pkgkey),
blue(_("UGC error")),
data,
err_string,
err,
)
)
return 1
_show_vote(data, repository, pkgkey)
_show_vote(vote, repository, pkgkey)
elif cmd == "add":
print_info(" %s [%s|%s] %s" % (
print_info(" %s [%s] %s" % (
bold("@@"),
darkgreen(str(repository)),
purple(str(pkgkey)),
blue(_("Add vote")),
purple(pkgkey),
blue(_("add vote")),
)
)
def mycb(s):
@@ -192,35 +272,22 @@ def _ugc_votes(entropy_client, options):
try:
vote = int(data['vote'])
if vote not in ClientWebService.VALID_VOTES:
raise ValueError()
except ValueError:
print_error(
"[%s:%s] %s: %s, %s" % (
darkgreen(repository),
"[%s] %s: %s: %s" % (
darkred(pkgkey),
blue(_("UGC error")),
_("Vote not valid"),
data['vote'],
_("invalid vote, must be in range"),
" ".join([str(x) for x in ClientWebService.VALID_VOTES]),
)
)
return 1
if vote not in etpConst['ugc_voterange']:
print_error(
"[%s:%s] %s: %s, %s" % (
darkgreen(repository),
darkred(pkgkey),
blue(_("UGC error")),
_("Vote not in range"),
etpConst['ugc_voterange'],
)
)
return 1
# verify
print_info(" %s [%s|%s] %s:" % (
print_info(" %s [%s] %s:" % (
bold("@@"),
darkgreen(str(repository)),
purple(str(pkgkey)),
purple(pkgkey),
blue(_("Please review your submission")),
)
)
@@ -233,66 +300,106 @@ def _ugc_votes(entropy_client, options):
if rc != _("Yes"):
return 1
# submit vote
voted, err_string = entropy_client.UGC.add_vote(
repository, pkgkey, vote)
if not voted:
try:
voted = webserv.add_vote(pkgkey, vote,
clear_available_cache = True)
except WebService.WebServiceException as err:
print_error(
"[%s:%s] %s: %s, %s" % (
darkgreen(repository),
"[%s] %s: %s" % (
darkred(pkgkey),
blue(_("UGC error")),
voted,
err_string,
err,
)
)
return 1
if not voted:
print_error(
"[%s] %s: %s" % (
darkred(pkgkey),
blue(_("UGC error")),
_("already voted"),
)
)
return 1
else:
print_info(" %s [%s|%s] %s" % (
bold("@@"),
darkgreen(str(repository)),
purple(str(pkgkey)),
blue(_("Vote added, thank you!")),
print_info("[%s] %s" % (
purple(pkgkey),
blue(_("vote added, thank you!")),
)
)
_ugc_votes(entropy_client, [repository, "get", pkgkey])
def _ugc_documents(entropy_client, options):
rc = -10
repository = options[0]
options = options[1:]
if not options:
return rc
return -10
cmd = options[0]
options = options[1:]
if not options:
return rc
pkgkey = options[0]
options = options[1:]
rc = 0
return -10
try:
webserv = _get_service(entropy_client, repository, tx_cb = True)
except WebService.UnsupportedService:
print_info(
"[%s] %s" % (
darkgreen(repository),
blue(_("Repository does not support Entropy Services.")),
)
)
return 1
if cmd == "get":
data, err_string = entropy_client.UGC.get_docs(repository, pkgkey)
if not isinstance(data, (list, tuple)):
pkgkey = options.pop(0)
docs = []
docs_offset = 0
while True:
try:
docs_list = webserv.get_documents([pkgkey],
cache = False, offset = docs_offset)[pkgkey]
except WebService.WebServiceException as err:
print_error(
"[%s] %s: %s" % (
darkred(pkgkey),
blue(_("UGC error")),
err,
)
)
return 1
if docs_list is None:
print_error(
"[%s] %s: %s, %s" % (
darkred(pkgkey),
blue(_("UGC error")),
data,
err_string,
)
)
return 1
docs.extend(docs_list)
if not docs_list.has_more():
break
docs_offset += len(docs_list)
try:
downloads = webserv.get_downloads([pkgkey], cache = False)[pkgkey]
except WebService.WebServiceException as err:
print_error(
"[%s:%s] %s: %s, %s" % (
darkgreen(repository),
"[%s] %s: %s" % (
darkred(pkgkey),
blue(_("UGC error")),
data,
err_string,
err,
)
)
return 1
downloads, err_string = entropy_client.UGC.get_downloads(
repository, pkgkey)
shown = False
for comment_dict in data:
shown = True
_show_document(comment_dict, repository, comment_dict['pkgkey'])
for doc in docs:
_show_document(doc, repository, pkgkey)
if shown:
if docs:
print_info(" %s %s: %s" % (
darkred("@@"),
blue(_("Number of downloads")),
@@ -300,14 +407,26 @@ def _ugc_documents(entropy_client, options):
)
)
else:
print_info(" %s %s." % (
print_info(" %s %s" % (
darkred("@@"),
blue(_("No User Generated Content available")),
blue(_("No User Generated Content available.")),
)
)
return 0
elif cmd == "add":
pkgkey = options.pop(0)
username = webserv.get_credentials()
if username is None:
print_info(
"[%s] %s" % (
darkgreen(repository),
blue(_("Not logged in, please login first.")),
)
)
return 0
print_info(" %s [%s|%s] %s" % (
bold("@@"),
darkgreen(str(repository)),
@@ -316,15 +435,17 @@ def _ugc_documents(entropy_client, options):
)
)
valid_types = {
('c', _('text comment')): etpConst['ugc_doctypes']['comments'],
('f', _('simple file')): etpConst['ugc_doctypes']['generic_file'],
('i', _('simple image')): etpConst['ugc_doctypes']['image'],
('y', _('youtube video')): etpConst['ugc_doctypes']['youtube_video']
('c', _('text comment')): Document.COMMENT_TYPE_ID,
('o', _('icon')): Document.ICON_TYPE_ID,
('f', _('simple file')): Document.FILE_TYPE_ID,
('i', _('simple image')): Document.IMAGE_TYPE_ID,
('y', _('video')): Document.VIDEO_TYPE_ID,
}
upload_needed_types = [
etpConst['ugc_doctypes']['generic_file'],
etpConst['ugc_doctypes']['image'],
etpConst['ugc_doctypes']['youtube_video']
Document.FILE_TYPE_ID,
Document.IMAGE_TYPE_ID,
Document.ICON_TYPE_ID,
Document.VIDEO_TYPE_ID
]
my_quick_types = [x[0] for x in valid_types]
def mycb(s):
@@ -376,10 +497,9 @@ def _ugc_documents(entropy_client, options):
keywords = ', '.join(data['keywords'].split())
# verify
print_info(" %s [%s|%s] %s:" % (
print_info(" %s [%s] %s:" % (
bold("@@"),
darkgreen(str(repository)),
purple(str(pkgkey)),
purple(pkgkey),
blue(_("Please review your submission")),
)
)
@@ -414,54 +534,65 @@ def _ugc_documents(entropy_client, options):
if rc != _("Yes"):
return 1
# submit comment
rslt, data = entropy_client.UGC.send_document_autosense(
repository,
pkgkey,
data['type'],
data['path'],
data['title'],
data['description'],
data['keywords']
)
if not rslt:
doc_factory = DocumentFactory(repository)
doc = None
doc_f = None
doc_type = data['type']
if doc_type == Document.COMMENT_TYPE_ID:
doc = doc_factory.comment(username, data['description'],
data['title'], data['keywords'])
elif doc_type == Document.ICON_TYPE_ID:
doc_f = open(data['path'], "rb")
doc = doc_factory.icon(username, doc_f, data['title'],
data['description'], data['keywords'])
elif doc_type == Document.FILE_TYPE_ID:
doc_f = open(data['path'], "rb")
doc = doc_factory.file(username, doc_f, data['title'],
data['description'], data['keywords'])
elif doc_type == Document.IMAGE_TYPE_ID:
doc_f = open(data['path'], "rb")
doc = doc_factory.image(username, doc_f, data['title'],
data['description'], data['keywords'])
elif doc_type == Document.VIDEO_TYPE_ID:
doc_f = open(data['path'], "rb")
doc = doc_factory.video(username, doc_f, data['title'],
data['description'], data['keywords'])
try:
new_doc = webserv.add_document(pkgkey, doc)
except WebService.WebServiceException as err:
print_error(
"[%s:%s] %s: %s, %s" % (
darkgreen(repository),
"[%s] %s: %s" % (
darkred(pkgkey),
blue(_("UGC error")),
rslt,
data,
err,
)
)
return 1
else:
if isinstance(data, tuple):
iddoc, r_content = data
else:
iddoc = rslt
r_content = data
print_info(" %s [%s|%s|id:%s|%s] %s" % (
bold("@@"),
darkgreen(str(repository)),
purple(str(pkgkey)),
iddoc,
r_content,
blue(_("Document added, thank you!")),
)
finally:
if doc_f is not None:
doc_f.close()
print_info(" %s [%s|id:%s] %s" % (
bold("@@"),
purple(pkgkey),
new_doc.document_id(),
blue(_("Document added, thank you!")),
)
)
return 0
elif cmd == "remove":
print_info(" %s [%s] %s" % (
bold("@@"),
darkgreen(str(repository)),
darkgreen(repository),
blue(_("Documents removal")),
)
)
print_info(" %s [%s] %s:" % (
bold("@@"),
darkgreen(str(repository)),
darkgreen(repository),
blue(_("Please review your submission")),
)
)
@@ -488,90 +619,96 @@ def _ugc_documents(entropy_client, options):
return 1
rc = entropy_client.ask_question(_("Would you like to review them?"))
if rc == _("Yes"):
data, err_msg = entropy_client.UGC.get_documents_by_identifiers(
repository, identifiers)
if not isinstance(data, tuple):
try:
docs_map = webserv.get_documents_by_id(identifiers,
cache = False)
except WebService.WebServiceException as err:
print_error(
"[%s:%s] %s: %s, %s" % (
darkgreen(repository),
"[%s] %s: %s" % (
darkred(str(identifiers)),
blue(_("UGC error")),
data,
err_msg,
err,
)
)
return 1
for comment_dict in data:
_show_document(comment_dict, repository, comment_dict['pkgkey'])
for pkgkey, doc in docs_map.items():
if doc is None:
# doesn't exist
continue
_show_document(doc, repository, pkgkey)
rc = entropy_client.ask_question(
_("Would you like to continue with the removal?"))
if rc != _("Yes"):
return 1
try:
docs_map = webserv.get_documents_by_id(identifiers,
cache = False)
except WebService.WebServiceException as err:
print_error(
"[%s] %s: %s" % (
darkred(str(identifiers)),
blue(_("UGC error")),
err,
)
)
return 1
for identifier in identifiers:
doc_data, err_msg = entropy_client.UGC.get_documents_by_identifiers(
repository, [identifier])
if not isinstance(doc_data, tuple):
doc = docs_map[identifier]
if doc is None:
print_error(
"[%s:%s] %s: %s, %s" % (
darkgreen(repository),
"[%s] %s: %s" % (
darkred(str(identifier)),
blue(_("UGC error")),
doc_data,
err_msg,
_("cannot get the requested Document"),
)
)
continue
doc_data = doc_data[0]
data, err_msg = entropy_client.UGC.remove_document_autosense(
repository, identifier, doc_data['iddoctype'])
if data is False:
try:
docs_map = webserv.remove_document(identifier)
except WebService.WebServiceException as err:
print_error(
"[%s:%s] %s: %s, %s" % (
darkgreen(repository),
darkred(str(identifier)),
"[%s] %s: %s" % (
darkred(str(identifiers)),
blue(_("UGC error")),
data,
err_msg,
err,
)
)
continue
print_info(
"[%s:%s] %s: %s, %s" % (
darkgreen(repository),
"[%s] %s: %s" % (
darkred(str(identifier)),
blue(_("UGC status")),
data,
err_msg,
_("removed successfully"),
)
)
return 0
return rc
return -10
def _show_document(mydict, repository, pkgkey):
def _show_document(doc, repository, pkgkey):
title = const_convert_to_unicode(mydict['title'])
title = const_convert_to_unicode(doc[Document.DOCUMENT_TITLE_ID])
if not title:
title = _("No title")
title = darkgreen(title)
doctype = None
for item in etpConst['ugc_doctypes']:
if etpConst['ugc_doctypes'][item] == mydict['iddoctype']:
doctype = item
break
if doctype is None:
doctype = _("Unknown type")
ts = doc.document_timestamp()
ts = entropy.tools.convert_unix_time_to_human_time(ts)
print_info(" %s [%s|%s|%s|%s|%s|%s]" % (
bold("@@"),
bold(str(mydict['iddoc'])),
darkred(str(doctype)),
darkgreen(str(repository)),
purple(str(pkgkey)),
blue(mydict['username']),
darkgreen(str(mydict['ts'])),
bold(str(doc.document_id())),
darkred(str(doc.document_type())),
darkgreen(repository),
purple(pkgkey),
blue(doc[DocumentFactory.DOCUMENT_USERNAME_ID]),
darkgreen(ts),
)
)
print_info("\t%s: %s" % (
@@ -579,43 +716,40 @@ def _show_document(mydict, repository, pkgkey):
title,
)
)
if const_isstring(mydict['ddata']):
text = mydict['ddata']
if const_isstring(doc.document_data()):
text = doc.document_data()
else:
text = mydict['ddata'].tostring()
text = doc.document_data().tostring()
text = const_convert_to_unicode(text)
_my_formatted_print(text, "\t%s: " % (blue(_("Content")),), "\t")
print_info("\t%s: %s" % (
blue(_("Keywords")),
', '.join(mydict['keywords']),
doc.document_keywords(),
)
)
print_info("\t%s: %s" % (
blue(_("Size")),
entropy.tools.bytes_into_human(mydict['size']),
)
)
if 'store_url' in mydict:
if mydict['store_url'] != None:
print_info("\t%s: %s" % (
blue(_("Download")),
mydict['store_url'],
)
url = doc.document_url()
if url is not None:
print_info("\t%s: %s" % (
blue(_("Download")),
url,
)
)
def _show_vote(vote, repository, pkgkey):
print_info(" %s [%s|%s] %s: %s" % (
if vote is None:
vote = _("no votes")
else:
vote = str(vote)
print_info(" %s [%s] %s: %s" % (
bold("@@"),
darkgreen(str(repository)),
purple(str(pkgkey)),
darkred(_("Current package vote")),
darkgreen(str(vote)),
purple(pkgkey),
darkred(_("current package vote")),
darkgreen(vote),
)
)
def _my_formatted_print(data,header,reset_columns, min_chars = 25,
def _my_formatted_print(data,header, reset_columns, min_chars = 25,
color = None):
if isinstance(data, set):
+39 -19
View File
@@ -20,15 +20,19 @@ import tempfile
from entropy.exceptions import SystemDatabaseError, DependenciesNotRemovable, \
EntropyPackageException
from entropy.misc import ParallelTask
from entropy.db.exceptions import OperationalError
from entropy.const import etpConst, etpUi, const_convert_to_unicode
from entropy.const import etpConst, etpUi, const_convert_to_unicode, \
const_debug_write
from entropy.output import red, blue, brown, darkred, bold, darkgreen, bold, \
darkblue, purple, teal, print_error, print_info, print_warning, writechar, \
readtext, print_generic
from entropy.client.interfaces import Client
from entropy.client.interfaces.package import Package as ClientPkg
from entropy.i18n import _
from text_tools import countdown, enlightenatom
from entropy.services.client import WebService
from text_tools import countdown, enlightenatom, get_entropy_webservice
import entropy.dep
import entropy.tools
@@ -1177,14 +1181,19 @@ def _download_packages(entropy_client, packages = None, deps = True,
return func_rc, fetch_rc
def _spawn_ugc(entropy_client, mykeys):
if entropy_client.UGC is None:
return
for myrepo in mykeys:
mypkgkeys = sorted(mykeys[myrepo])
for repository, pkgkeys in mykeys.items():
try:
entropy_client.UGC.add_download_stats(myrepo, mypkgkeys)
except:
pass
webserv = get_entropy_webservice(entropy_client,
repository, tx_cb = False)
except WebService.UnsupportedService:
continue
try:
webserv.add_downloads(sorted(pkgkeys),
clear_available_cache = True)
except WebService.WebServiceException as err:
const_debug_write(__name__, repr(err))
continue
def install_packages(entropy_client,
packages = None, atomsdata = None, deps = True,
@@ -1615,6 +1624,8 @@ def install_packages(entropy_client,
entropy_client.installed_repository().acceptLicense(key)
break
ugc_th = None
if not etpUi['clean'] or onlyfetch:
mykeys = {}
# Before starting the real install, fetch packages and verify checksum.
@@ -1623,9 +1634,12 @@ def install_packages(entropy_client,
if func_rc != 0:
print_info(red(" @@ ")+blue("%s." % (_("Download incomplete"),) ))
return func_rc, fetch_rc
_spawn_ugc(entropy_client, mykeys)
ugc_th = ParallelTask(_spawn_ugc, entropy_client, mykeys)
ugc_th.start()
if onlyfetch:
if ugc_th is not None:
ugc_th.join()
print_info(red(" @@ ")+blue("%s." % (_("Download complete"),) ))
return 0, 0
@@ -1640,22 +1654,26 @@ def install_packages(entropy_client,
else:
metaopts['install_source'] = etpConst['install_sources']['automatic_dependency']
Package = entropy_client.Package()
Package.prepare(match, "install", metaopts)
pkg = entropy_client.Package()
pkg.prepare(match, "install", metaopts)
xterm_header = "equo ("+_("install")+") :: "+str(currentqueue)+" of "+totalqueue+" ::"
print_info(red(" ++ ")+bold("(")+blue(str(currentqueue))+"/"+red(totalqueue)+bold(") ")+">>> "+darkgreen(Package.pkgmeta['atom']))
print_info(red(" ++ ") + bold("(") + blue(str(currentqueue)) + \
"/" + red(totalqueue) + bold(") ") + ">>> " + \
darkgreen(pkg.pkgmeta['atom']))
rc = Package.run(xterm_header = xterm_header)
rc = pkg.run(xterm_header = xterm_header)
if rc != 0:
if ugc_th is not None:
ugc_th.join()
return 1, rc
# there's a buffer inside, better remove otherwise cPickle will complain
del Package.pkgmeta['triggers']
del pkg.pkgmeta['triggers']
if etpUi['clean']: # remove downloaded package
if os.path.isfile(Package.pkgmeta['pkgpath']):
os.remove(Package.pkgmeta['pkgpath'])
if os.path.isfile(pkg.pkgmeta['pkgpath']):
os.remove(pkg.pkgmeta['pkgpath'])
# update resume cache
if not pkgs: # pkgs caching not supported
@@ -1665,10 +1683,12 @@ def install_packages(entropy_client,
except (IOError, OSError):
pass
Package.kill()
pkg.kill()
del metaopts
del Package
del pkg
if ugc_th is not None:
ugc_th.join()
del explicit_user_packages
print_info(red(" @@ ")+blue("%s." % (_("Installation complete"),) ))