| # Copyright 1999-2014 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| from portage import os |
| from portage.dep import _repo_separator |
| from portage.output import colorize |
| |
| from _emerge.AsynchronousTask import AsynchronousTask |
| from _emerge.Binpkg import Binpkg |
| from _emerge.CompositeTask import CompositeTask |
| from _emerge.EbuildBuild import EbuildBuild |
| from _emerge.PackageUninstall import PackageUninstall |
| |
| class MergeListItem(CompositeTask): |
| |
| """ |
| TODO: For parallel scheduling, everything here needs asynchronous |
| execution support (start, poll, and wait methods). |
| """ |
| |
| __slots__ = ("args_set", |
| "binpkg_opts", "build_opts", "config_pool", "emerge_opts", |
| "find_blockers", "logger", "mtimedb", "pkg", |
| "pkg_count", "pkg_to_replace", "prefetcher", |
| "settings", "statusMessage", "world_atom") + \ |
| ("_install_task",) |
| |
| def _start(self): |
| |
| pkg = self.pkg |
| build_opts = self.build_opts |
| |
| if pkg.installed: |
| # uninstall, executed by self.merge() |
| self.returncode = os.EX_OK |
| self._async_wait() |
| return |
| |
| args_set = self.args_set |
| find_blockers = self.find_blockers |
| logger = self.logger |
| mtimedb = self.mtimedb |
| pkg_count = self.pkg_count |
| scheduler = self.scheduler |
| settings = self.settings |
| world_atom = self.world_atom |
| ldpath_mtimes = mtimedb["ldpath"] |
| |
| action_desc = "Emerging" |
| preposition = "for" |
| pkg_color = "PKG_MERGE" |
| if pkg.type_name == "binary": |
| pkg_color = "PKG_BINARY_MERGE" |
| action_desc += " binary" |
| |
| if build_opts.fetchonly: |
| action_desc = "Fetching" |
| |
| msg = "%s (%s of %s) %s" % \ |
| (action_desc, |
| colorize("MERGE_LIST_PROGRESS", str(pkg_count.curval)), |
| colorize("MERGE_LIST_PROGRESS", str(pkg_count.maxval)), |
| colorize(pkg_color, pkg.cpv + _repo_separator + pkg.repo)) |
| |
| if pkg.root_config.settings["ROOT"] != "/": |
| msg += " %s %s" % (preposition, pkg.root) |
| |
| if not build_opts.pretend: |
| self.statusMessage(msg) |
| logger.log(" >>> emerge (%s of %s) %s to %s" % \ |
| (pkg_count.curval, pkg_count.maxval, pkg.cpv, pkg.root)) |
| |
| if pkg.type_name == "ebuild": |
| |
| build = EbuildBuild(args_set=args_set, |
| background=self.background, |
| config_pool=self.config_pool, |
| find_blockers=find_blockers, |
| ldpath_mtimes=ldpath_mtimes, logger=logger, |
| opts=build_opts, pkg=pkg, pkg_count=pkg_count, |
| prefetcher=self.prefetcher, scheduler=scheduler, |
| settings=settings, world_atom=world_atom) |
| |
| self._install_task = build |
| self._start_task(build, self._default_final_exit) |
| return |
| |
| elif pkg.type_name == "binary": |
| |
| binpkg = Binpkg(background=self.background, |
| find_blockers=find_blockers, |
| ldpath_mtimes=ldpath_mtimes, logger=logger, |
| opts=self.binpkg_opts, pkg=pkg, pkg_count=pkg_count, |
| prefetcher=self.prefetcher, settings=settings, |
| scheduler=scheduler, world_atom=world_atom) |
| |
| self._install_task = binpkg |
| self._start_task(binpkg, self._default_final_exit) |
| return |
| |
| def create_install_task(self): |
| |
| pkg = self.pkg |
| build_opts = self.build_opts |
| mtimedb = self.mtimedb |
| scheduler = self.scheduler |
| settings = self.settings |
| world_atom = self.world_atom |
| ldpath_mtimes = mtimedb["ldpath"] |
| |
| if pkg.installed: |
| if not (build_opts.buildpkgonly or \ |
| build_opts.fetchonly or build_opts.pretend): |
| |
| task = PackageUninstall(background=self.background, |
| ldpath_mtimes=ldpath_mtimes, opts=self.emerge_opts, |
| pkg=pkg, scheduler=scheduler, settings=settings, |
| world_atom=world_atom) |
| |
| else: |
| task = AsynchronousTask() |
| |
| elif build_opts.fetchonly or \ |
| build_opts.buildpkgonly: |
| task = AsynchronousTask() |
| else: |
| task = self._install_task.create_install_task() |
| |
| return task |