[solo.commands.pkg] add concurrency support

This commit is contained in:
Fabio Erculiani
2013-12-06 16:40:45 +01:00
parent 53b5d9cddc
commit 76df355ca4

View File

@@ -23,7 +23,7 @@ import entropy.tools
import entropy.dep
from solo.commands.descriptor import SoloCommandDescriptor
from solo.commands.command import SoloCommand
from solo.commands.command import SoloCommand, sharedlock
class SoloPkg(SoloCommand):
@@ -71,12 +71,6 @@ Execute advanced tasks on Entropy packages and the running system.
description=_("execute advanced tasks on packages"),
help=_("available commands"))
def _add_ask_to_parser(p):
p.add_argument(
"--ask", "-a", action="store_true",
default=self._ask,
help=_("ask before making any changes"))
def _argparse_easygoing_valid_entropy_path(string):
if os.path.isfile(string) and os.path.exists(string):
return string
@@ -100,7 +94,6 @@ Execute advanced tasks on Entropy packages and the running system.
default=self._savedir,
help=_("destination directory "
"where to save generated packages"))
_add_ask_to_parser(quickpkg_parser)
quickpkg_parser.set_defaults(func=self._quickpkg)
_commands["quickpkg"] = {}
@@ -117,7 +110,6 @@ Execute advanced tasks on Entropy packages and the running system.
default=self._savedir,
help=_("destination directory "
"where to save generated packages"))
_add_ask_to_parser(inflate_parser)
inflate_parser.set_defaults(func=self._inflate)
_commands["inflate"] = {}
@@ -134,7 +126,6 @@ Execute advanced tasks on Entropy packages and the running system.
default=self._savedir,
help=_("destination directory "
"where to save generated packages"))
_add_ask_to_parser(deflate_parser)
deflate_parser.set_defaults(func=self._deflate)
_commands["deflate"] = {}
@@ -151,7 +142,6 @@ Execute advanced tasks on Entropy packages and the running system.
default=self._savedir,
help=_("destination directory "
"where to save generated packages"))
_add_ask_to_parser(extract_parser)
extract_parser.set_defaults(func=self._extract)
_commands["extract"] = {}
@@ -174,7 +164,7 @@ Execute advanced tasks on Entropy packages and the running system.
return parser.print_help, []
self._nsargs = nsargs
return self._call_locked, [nsargs.func]
return self._call_unlocked, [nsargs.func]
def bashcomp(self, last_arg):
"""
@@ -183,19 +173,15 @@ Execute advanced tasks on Entropy packages and the running system.
self._get_parser() # this will generate self._commands
return self._hierarchical_bashcomp(last_arg, [], self._commands)
def _scan_packages(self, entropy_client, packages, installed=False):
def _scan_packages(self, entropy_client, inst_repo, packages):
"""
Scan the list of package names filtering out unmatched
entries.
"""
found_pkgs = []
for package in packages:
if installed:
repo = entropy_client.installed_repository()
repo_id = repo.repository_id()
package_id, _pkg_rc = repo.atomMatch(package)
else:
package_id, repo_id = entropy_client.atom_match(package)
package_id, _pkg_rc = inst_repo.atomMatch(package)
if package_id == -1:
mytxt = "!!! %s: %s %s." % (
purple(_("Warning")),
@@ -209,20 +195,24 @@ Execute advanced tasks on Entropy packages and the running system.
entropy_client.output(
"!!!", level="warning", importance=1)
continue
found_pkgs.append((package_id, repo_id))
found_pkgs.append(package_id)
return found_pkgs
def _quickpkg(self, entropy_client):
@sharedlock
def _quickpkg(self, entropy_client, inst_repo):
"""
Solo Pkg Quickpkg command.
"""
packages = self._nsargs.packages
ask = self._ask
savedir = self._nsargs.savedir
if not os.path.isdir(savedir) and not os.path.exists(savedir):
# this is validated by the parser
# but not in case of no --savedir provided
const_setup_directory(savedir)
if not os.path.exists(savedir):
entropy_client.output(
"%s: %s" % (
@@ -230,47 +220,20 @@ Execute advanced tasks on Entropy packages and the running system.
savedir,), level="error", importance=1)
return 1
entropy_repository = entropy_client.installed_repository()
pkg_matches = self._scan_packages(entropy_client, packages,
installed=True)
if not pkg_matches:
package_ids = self._scan_packages(entropy_client, inst_repo, packages)
if not package_ids:
return 1
entropy_client.output(
"%s:" % (
brown(_("This is the list of packages "
"that would be considered")),
))
for package_id in package_ids:
for pkg in pkg_matches:
pkg_id, pkg_repo = pkg
repo = entropy_client.open_repository(pkg_repo)
atom = repo.retrieveAtom(pkg_id)
entropy_client.output(
"[%s] %s" % (
brown(pkg_repo),
darkgreen(atom),),
header=" ")
if ask:
q_rc = entropy_client.ask_question(
_("Would you like to continue ?"))
if q_rc == _("No"):
return 0
for pkg in pkg_matches:
pkg_id, pkg_repo = pkg
repo = entropy_client.open_repository(pkg_repo)
atom = repo.retrieveAtom(pkg_id)
atom = inst_repo.retrieveAtom(package_id)
entropy_client.output(
"%s: %s" % (
teal(_("generating package")),
purple(atom),),
header=brown(" @@ "), back=True)
pkg_data = repo.getPackageData(pkg_id)
pkg_data = inst_repo.getPackageData(package_id)
file_path = entropy_client.generate_package(
pkg_data, save_directory=savedir)
if file_path is None:
@@ -295,12 +258,13 @@ Execute advanced tasks on Entropy packages and the running system.
Solo Pkg Inflate command.
"""
files = self._nsargs.files
ask = self._ask
savedir = self._nsargs.savedir
if not os.path.isdir(savedir) and not os.path.exists(savedir):
# this is validated by the parser
# but not in case of no --savedir provided
const_setup_directory(savedir)
if not os.path.exists(savedir):
entropy_client.output(
"%s: %s" % (
@@ -346,7 +310,8 @@ Execute advanced tasks on Entropy packages and the running system.
ext=etpConst['packagesext'],
revision=pkg_data['revision'],
sha1=sha1)
pkg_data['download'] = download_dirpath + "/" + download_name
pkg_data['download'] = download_dirpath + os.path.sep + \
download_name
# migrate to the proper format
final_path = os.path.join(savedir, download_name)
@@ -362,7 +327,7 @@ Execute advanced tasks on Entropy packages and the running system.
# attach entropy metadata to package file
repo = entropy_client.open_generic_repository(tmp_path)
repo.initializeRepository()
package_id = repo.addPackage(
_package_id = repo.addPackage(
pkg_data, revision=pkg_data['revision'])
repo.commit()
repo.close()
@@ -391,12 +356,13 @@ Execute advanced tasks on Entropy packages and the running system.
Solo Pkg Deflate command.
"""
files = self._nsargs.files
ask = self._ask
savedir = self._nsargs.savedir
if not os.path.isdir(savedir) and not os.path.exists(savedir):
# this is validated by the parser
# but not in case of no --savedir provided
const_setup_directory(savedir)
if not os.path.exists(savedir):
entropy_client.output(
"%s: %s" % (
@@ -438,12 +404,13 @@ Execute advanced tasks on Entropy packages and the running system.
Solo Pkg Extract command.
"""
files = self._nsargs.files
ask = self._ask
savedir = self._nsargs.savedir
if not os.path.isdir(savedir) and not os.path.exists(savedir):
# this is validated by the parser
# but not in case of no --savedir provided
const_setup_directory(savedir)
if not os.path.exists(savedir):
entropy_client.output(
"%s: %s" % (