# Copyright 1999-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

from _emerge.CompositeTask import CompositeTask
from portage.dep import _repo_separator
from portage.output import colorize
class PackageMerge(CompositeTask):
	__slots__ = ("merge", "postinst_failure")

	def _should_show_status(self):
		return not self.merge.build_opts.fetchonly and \
			not self.merge.build_opts.pretend and \
			not self.merge.build_opts.buildpkgonly

	def _make_msg(self, pkg, action_desc, preposition, counter_str):
		pkg_color = "PKG_MERGE"
		if pkg.type_name == "binary":
			pkg_color = "PKG_BINARY_MERGE"

		msg = "%s %s%s" % \
			(action_desc,
			counter_str,
			colorize(pkg_color, pkg.cpv + _repo_separator + pkg.repo))

		if pkg.root_config.settings["ROOT"] != "/":
			msg += " %s %s" % (preposition, pkg.root)

		return msg

	def _start(self):
		self.scheduler = self.merge.scheduler
		pkg = self.merge.pkg
		pkg_count = self.merge.pkg_count

		if pkg.installed:
			action_desc = "Uninstalling"
			preposition = "from"
			counter_str = ""
		else:
			action_desc = "Installing"
			preposition = "to"
			counter_str = "(%s of %s) " % \
				(colorize("MERGE_LIST_PROGRESS", str(pkg_count.curval)),
				colorize("MERGE_LIST_PROGRESS", str(pkg_count.maxval)))

		msg = self._make_msg(pkg, action_desc, preposition, counter_str)

		if self._should_show_status():
			self.merge.statusMessage(msg)

		task = self.merge.create_install_task()
		self._start_task(task, self._install_exit)

	def _install_exit(self, task):
		self.postinst_failure = getattr(task, 'postinst_failure', None)

		pkg = self.merge.pkg
		pkg_count = self.merge.pkg_count

		if self.postinst_failure:
			action_desc = "Failed"
			preposition = "in"
			counter_str = ""
		else:
			action_desc = "Completed"
			preposition = "to"
			counter_str = "(%s of %s) " % \
				(colorize("MERGE_LIST_PROGRESS", str(pkg_count.curval)),
				colorize("MERGE_LIST_PROGRESS", str(pkg_count.maxval)))

		msg = self._make_msg(pkg, action_desc, preposition, counter_str)

		if self._should_show_status():
			self.merge.statusMessage(msg)

		self._final_exit(task)
		self.wait()
