blob: 204ad4122fca811b59d7753443a3b8c26829366d [file] [log] [blame]
# 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,
)