Files
entropy/client/solo/commands/source.py
2012-11-09 09:16:08 +01:00

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"))
)