# Copyright 2014-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import logging

from collections import OrderedDict

import portage

from portage import os
from portage.output import create_color_func
from portage.util import writemsg_level, _recursive_file_list
from warnings import warn

bad = create_color_func("BAD")
warn = create_color_func("WARN")


def get_hooks_from_dir(rel_directory, prefix="/"):
	directory = os.path.join(prefix, portage.USER_CONFIG_PATH, rel_directory)

	hooks = OrderedDict()
	for filepath in _recursive_file_list(directory):
		name = filepath.split(directory)[1].lstrip(portage.os.sep)
		if portage.os.access(filepath, portage.os.X_OK):
			hooks[filepath] = name
		else:
			writemsg_level(" %s %s hook: '%s' is not executable\n" % \
				(warn("*"), directory, portage._unicode_decode(name),),
				level=logging.WARN, noiselevel=2)

	return hooks


def perform_hooks(rel_directory, *argv, prefix="/"):
	for filepath, name in get_hooks_from_dir(rel_directory, prefix).items():
		hook_command = filepath + " " +  " ".join(map(str, argv))
		retval = portage.process.spawn(hook_command)

		if retval != portage.os.EX_OK:
			writemsg_level(" %s Spawn failed for: %s, %s\n" % \
				(bad("*"), name, filepath),
				level=logging.ERROR, noiselevel=-1)
