218 lines
6.2 KiB
Python
218 lines
6.2 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 solo.commands.descriptor import SoloCommandDescriptor
|
|
from 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(
|
|
"--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
|
|
bdeps = self._nsargs.bdeps
|
|
|
|
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
|
|
|
|
action = darkgreen(_("Source code download"))
|
|
exit_st = self._show_packages_info(
|
|
entropy_client, packages, deps,
|
|
ask, pretend, verbose, quiet, action_name = action)
|
|
if exit_st != 0:
|
|
return exit_st, False
|
|
|
|
run_queue, removal_queue = self._generate_install_queue(
|
|
entropy_client, packages, deps, False, deep, relaxed, bdeps,
|
|
recursive)
|
|
if (run_queue is None) or (removal_queue is None):
|
|
return 1
|
|
|
|
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()
|
|
|
|
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 = entropy_client.Package()
|
|
pkg.prepare(match, "source", metaopts)
|
|
|
|
xterm_header = "equo (%s) :: %d of %d ::" % (
|
|
_("sources download"), count, total)
|
|
|
|
entropy_client.output(
|
|
darkgreen(atom),
|
|
count=(count, total),
|
|
header=darkred(" ::: ") + ">>> ")
|
|
|
|
exit_st = pkg.run(xterm_header = xterm_header)
|
|
if exit_st != 0:
|
|
return 1
|
|
|
|
finally:
|
|
if pkg is not None:
|
|
pkg.kill()
|
|
|
|
return 0
|
|
|
|
|
|
SoloCommandDescriptor.register(
|
|
SoloCommandDescriptor(
|
|
SoloSource,
|
|
SoloSource.NAME,
|
|
_("download packages source code"))
|
|
)
|