7cf7e1f6b7
The module entropy_path_loader (used only for running from within the checkout; otherwise not even installed) is made to provide the _entropy namespace. (Other ideas instead of this entropy_path_loader change would be to reorganise files layout; drop support for running from the checkout as is - and perhaps require virtualenvs; require sourcing a script that sets PYTHONPATH. However, as implemented, it is not intrusive, and the good part is that it is quite isolated, not used in normal usage after installation. Basically, it only does sys.path + provides _entropy namespace.)
232 lines
6.7 KiB
Python
232 lines
6.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
|
|
@author: Fabio Erculiani <lxnay@sabayon.org>
|
|
@contact: lxnay@sabayon.org
|
|
@copyright: Fabio Erculiani
|
|
@license: GPL-2
|
|
|
|
B{Entropy Command Line Client}.
|
|
|
|
"""
|
|
import os
|
|
import sys
|
|
import argparse
|
|
|
|
from entropy.i18n import _
|
|
from entropy.output import darkred, darkgreen, blue
|
|
|
|
from _entropy.solo.commands.descriptor import SoloCommandDescriptor
|
|
from _entropy.solo.commands._manage import SoloManage
|
|
|
|
class SoloSource(SoloManage):
|
|
"""
|
|
Main Solo Source command.
|
|
"""
|
|
|
|
NAME = "source"
|
|
ALIASES = ["src"]
|
|
ALLOW_UNPRIVILEGED = False
|
|
|
|
INTRODUCTION = """\
|
|
Download source code of packages.
|
|
"""
|
|
SEE_ALSO = "equo-install(1)"
|
|
|
|
def __init__(self, args):
|
|
SoloManage.__init__(self, args)
|
|
self._commands = {}
|
|
|
|
def _get_parser(self):
|
|
"""
|
|
Overridden from SoloCommand.
|
|
"""
|
|
_commands = {}
|
|
|
|
descriptor = SoloCommandDescriptor.obtain_descriptor(
|
|
SoloSource.NAME)
|
|
parser = argparse.ArgumentParser(
|
|
description=descriptor.get_description(),
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
prog="%s %s" % (sys.argv[0], SoloSource.NAME))
|
|
parser.set_defaults(func=self._source)
|
|
|
|
parser.add_argument(
|
|
"packages", nargs='+',
|
|
metavar="<package>", help=_("package name"))
|
|
|
|
mg_group = parser.add_mutually_exclusive_group()
|
|
mg_group.add_argument(
|
|
"--ask", "-a", action="store_true",
|
|
default=False,
|
|
help=_("ask before making any changes"))
|
|
_commands["--ask"] = {}
|
|
_commands["-a"] = {}
|
|
|
|
mg_group.add_argument(
|
|
"--pretend", "-p", action="store_true",
|
|
default=False,
|
|
help=_("show what would be done"))
|
|
_commands["--pretend"] = {}
|
|
_commands["-p"] = {}
|
|
|
|
parser.add_argument(
|
|
"--verbose", "-v", action="store_true",
|
|
default=False,
|
|
help=_("verbose output"))
|
|
_commands["--verbose"] = {}
|
|
_commands["-v"] = {}
|
|
|
|
parser.add_argument(
|
|
"--quiet", "-q", action="store_true",
|
|
default=False,
|
|
help=_("quiet output"))
|
|
_commands["--quiet"] = {}
|
|
_commands["-q"] = {}
|
|
|
|
parser.add_argument(
|
|
"--nodeps", action="store_true",
|
|
default=False,
|
|
help=_("exclude package dependencies"))
|
|
_commands["--nodeps"] = {}
|
|
|
|
parser.add_argument(
|
|
"--onlydeps", "-o", action="store_true",
|
|
default=False,
|
|
help=_("only include dependencies of selected packages"))
|
|
_commands["--onlydeps"] = {}
|
|
_commands["-o"] = {}
|
|
|
|
parser.add_argument(
|
|
"--norecursive", action="store_true",
|
|
default=False,
|
|
help=_("do not calculate dependencies recursively"))
|
|
_commands["--norecursive"] = {}
|
|
|
|
parser.add_argument(
|
|
"--deep", action="store_true",
|
|
default=False,
|
|
help=_("include dependencies no longer needed"))
|
|
_commands["--deep"] = {}
|
|
|
|
parser.add_argument(
|
|
"--relaxed", action="store_true",
|
|
default=False,
|
|
help=_("calculate dependencies relaxing constraints"))
|
|
_commands["--relaxed"] = {}
|
|
|
|
parser.add_argument(
|
|
"--bdeps", action="store_true",
|
|
default=False,
|
|
help=_("include build-time dependencies"))
|
|
_commands["--bdeps"] = {}
|
|
|
|
parser.add_argument(
|
|
"--savehere", action="store_true",
|
|
default=False,
|
|
help=_("save files into the current working directory"))
|
|
_commands["--savehere"] = {}
|
|
|
|
self._commands = _commands
|
|
return parser
|
|
|
|
def bashcomp(self, last_arg):
|
|
"""
|
|
Overridden from SoloCommand.
|
|
"""
|
|
self._get_parser() # this will generate self._commands
|
|
return self._hierarchical_bashcomp(last_arg, [], self._commands)
|
|
|
|
def _source(self, entropy_client):
|
|
"""
|
|
Solo Source command.
|
|
"""
|
|
ask = self._nsargs.ask
|
|
pretend = self._nsargs.pretend
|
|
verbose = self._nsargs.verbose
|
|
quiet = self._nsargs.quiet
|
|
deep = self._nsargs.deep
|
|
deps = not self._nsargs.nodeps
|
|
savehere = self._nsargs.savehere
|
|
recursive = not self._nsargs.norecursive
|
|
relaxed = self._nsargs.relaxed
|
|
onlydeps = self._nsargs.onlydeps
|
|
bdeps = self._nsargs.bdeps
|
|
|
|
inst_repo = entropy_client.installed_repository()
|
|
with inst_repo.shared():
|
|
|
|
packages = self._scan_packages(
|
|
entropy_client, self._nsargs.packages)
|
|
if not packages:
|
|
entropy_client.output(
|
|
"%s." % (
|
|
darkred(_("No packages found")),),
|
|
level="error", importance=1)
|
|
return 1, False
|
|
|
|
run_queue, removal_queue = self._generate_install_queue(
|
|
entropy_client, packages, deps, False, deep, relaxed,
|
|
onlydeps, bdeps, recursive)
|
|
|
|
if (run_queue is None) or (removal_queue is None):
|
|
return 1
|
|
elif not (run_queue or removal_queue):
|
|
entropy_client.output(
|
|
"%s." % (blue(_("Nothing to do")),),
|
|
level="warning", header=darkgreen(" @@ "))
|
|
return 0
|
|
|
|
if pretend:
|
|
entropy_client.output(
|
|
"%s." % (blue(_("All done")),))
|
|
return 0
|
|
|
|
total = len(run_queue)
|
|
count = 0
|
|
metaopts = {}
|
|
if savehere:
|
|
metaopts['fetch_path'] = os.getcwd()
|
|
|
|
action_factory = entropy_client.PackageActionFactory()
|
|
|
|
for match in run_queue:
|
|
|
|
package_id, repository_id = match
|
|
repo = entropy_client.open_repository(repository_id)
|
|
atom = repo.retrieveAtom(package_id)
|
|
count += 1
|
|
pkg = None
|
|
|
|
try:
|
|
pkg = action_factory.get(
|
|
action_factory.SOURCE_ACTION,
|
|
match, opts=metaopts)
|
|
|
|
xterm_header = "equo (%s) :: %d of %d ::" % (
|
|
_("sources download"), count, total)
|
|
pkg.set_xterm_header(xterm_header)
|
|
|
|
entropy_client.output(
|
|
darkgreen(atom),
|
|
count=(count, total),
|
|
header=darkred(" ::: ") + ">>> ")
|
|
|
|
exit_st = pkg.start()
|
|
if exit_st != 0:
|
|
return 1
|
|
|
|
finally:
|
|
if pkg is not None:
|
|
pkg.finalize()
|
|
|
|
return 0
|
|
|
|
|
|
SoloCommandDescriptor.register(
|
|
SoloCommandDescriptor(
|
|
SoloSource,
|
|
SoloSource.NAME,
|
|
_("download packages source code"))
|
|
)
|