1
0
mirror of https://github.com/gryf/gryf-overlay.git synced 2025-12-27 17:02:30 +01:00
Files
gryf-overlay/eclass/rindeal.eclass

356 lines
7.0 KiB
Bash

# Copyright 2016-2019 Jan Chren (rindeal)
# Distributed under the terms of the GNU General Public License v2
# @ECLASS: rindeal.eclass
# @BLURB: Base eclass for all ebuilds
# @DESCRIPTION:
# This eclass should be inheritted by all ebuilds right after the EAPI specification before any inherits.
# fight with portage and override it again and again
inherit portage-functions-patched
if ! (( _RINDEAL_ECLASS ))
then
case "${EAPI:-0}" in
'6' | '7' ) ;;
* ) die "EAPI='${EAPI}' is not supported by '${ECLASS}' eclass" ;;
esac
rindeal:func_exists() {
declare -F "${1}" >/dev/null
}
### BEGIN: "Command not found" handler
if rindeal:func_exists command_not_found_handle
then
# portage registers a cnf handler for the `depend` phase
# https://github.com/gentoo/portage/commit/40da7ee19c4c195da35083bf2d2fcbd852ad3846
if [[ "${EBUILD_PHASE}" != 'depend' ]]
then
eqawarn "${ECLASS}.eclass: command_not_found_handle() already registered"
fi
else
command_not_found_handle() {
debug-print-function "${FUNCNAME[0]}" "${@}"
local -r -- cmd="${1}"
## do not die in a pipe
[[ -t 1 ]] || return 127
## do not die in a subshell
local _pid _cmd _state _ppid _pgrp _session _tty_nr _tpgid _rest
read _pid _cmd _state _ppid _pgrp _session _tty_nr _tpgid _rest < /proc/self/stat
(( $$ == _tpgid )) && return 127
die "'${cmd}': command not found"
}
fi
### END: "Command not found" handler
### BEGIN: Death hooks
rindeal:__death_hook() {
eerror ""
eerror "Ask for help at https://github.com/rindeal/rindeal-ebuild-repo/issues"
eerror "instead of posting to https://forums.gentoo.org/ or worse https://bugs.gentoo.org/."
eerror ""
}
if ! rindeal:has rindeal:__death_hook ${EBUILD_DEATH_HOOKS}
then
EBUILD_DEATH_HOOKS+=" rindeal:__death_hook"
fi
### END: Death hooks
### BEGIN: hooking infrastructure
_rindeal:hooks:get_orig_prefix() {
echo "__original_"
}
_rindeal:hooks:call_orig() {
debug-print-function "${FUNCNAME[0]}" "${@}"
local -r -- func="$(_rindeal:hooks:get_orig_prefix)${1}"
if ! rindeal:func_exists "${func}"
then
die "${ECLASS}.eclass: ${FUNCNAME}: function '${func}' doesn't exist"
fi
"${func}" "${@:2}"
}
_rindeal:hooks:save() {
debug-print-function "${FUNCNAME[0]}" "${@}"
(( $# != 1 )) && die
local -r -- name="${1}"
local -r -- orig_prefix="$(_rindeal:hooks:get_orig_prefix)"
# make sure we don't create an infinite loop
if ! rindeal:func_exists "${orig_prefix}${name}"
then
# save original implementation under a different name
eval "${orig_prefix}$(declare -f "${name}")"
fi
}
### END: hooking infrastructure
### BEGIN: inherit hook
_rindeal:hooks:save inherit
## "static" assoc array
if [[ -z "$(declare -p _RINDEAL_ECLASS_SWAPS 2>/dev/null)" ]]
then
declare -g -A _RINDEAL_ECLASS_SWAPS=(
['flag-o-matic']='flag-o-matic-patched'
['ninja-utils']='ninja-utils-patched'
['versionator']='versionator-patched'
['vala']='vala-patched'
)
fi
inherit() {
local -a new_args=( )
local -- old_eclass
for old_eclass in "${@}"
do
if [[ -v _RINDEAL_ECLASS_SWAPS["${old_eclass}"] ]]
then
local new_eclass="${_RINDEAL_ECLASS_SWAPS["${old_eclass}"]}"
debug-print "${ECLASS}.eclass, ${FUNCNAME[0]}(): swapping '${old_eclass}' for '${new_eclass}"
if [[ -n "${new_eclass}" ]]
then
new_args+=( "${new_eclass}" )
fi
# prevent infinite loops
unset "_RINDEAL_ECLASS_SWAPS[${old_eclass}]"
else
new_args+=( "${old_eclass}" )
fi
done
if (( ${#new_args[@]} ))
then
_rindeal:hooks:call_orig inherit "${new_args[@]}"
else
debug-print "${ECLASS}.eclass, ${FUNCNAME[0]}(): skipping orig call since all its arguments were erased"
fi
}
### END: inherit hook
### BEGIN: standard tool wrappers
# `NO_V` env var implementation for use in standard tool wrappers
_NO_V() {
(( NO_V )) || printf -- "--verbose"
}
rpushd() {
pushd "${@}" >/dev/null || die -n
}
rpopd() {
popd "${@}" >/dev/null || die -n
}
rmkdir() {
mkdir $(_NO_V) --parents "${@}" || die -n
}
rcp() {
cp $(_NO_V) "${@}" || die -n
}
rmv() {
mv $(_NO_V) "${@}" || die -n
}
rln() {
ln $(_NO_V) "${@}" || die -n
}
rchown() {
chown $(_NO_V) "${@}" || die -n
}
rchmod() {
chmod $(_NO_V) "${@}" || die -n
}
rrm() {
rm $(_NO_V) --interactive=never --preserve-root --one-file-system "${@}" || die -n
}
rrmdir() {
rmdir $(_NO_V) "${@}" || die -n
}
rsed() {
if (( RINDEAL_DEBUG ))
then
local -a diff_prog=( diff -u )
if command -v colordiff >/dev/null
then
diff_prog=( colordiff -u )
fi
local -A file_list
local -a pretty_sed
local -i i record_files=0
for (( i = 1 ; i <= $# ; i ++ ))
do
local arg="${!i}"
if (( record_files ))
then
file_list+=( ["${arg}"]="${RANDOM}${RANDOM}${RANDOM}" )
else
if [[ "${arg}" == "--" ]]
then
record_files=1
else
pretty_sed+=( "'${arg}'" )
fi
fi
done
(( ${#file_list[*]} )) || die -n
local temp_dir="$(mktemp -d || die -n)"
## backup original versions
local -- f
for f in "${!file_list[@]}"
do
cp -- "${f}" "${temp_dir}/${file_list["${f}"]}" || die -n
done
fi
sed "${@}" || die -n
if (( RINDEAL_DEBUG ))
then
local f
for f in "${!file_list[@]}"
do
echo "*** diff of '${f}'"
echo "*** for sed ${pretty_sed[*]}:"
"${diff_prog[@]}" "${temp_dir}/${file_list["${f}"]}" "${f}"
local code=$?
(( code == 2 )) && die -n
(( code == 0 )) && eqawarn "sed didn't change anything"
done
rm -r -- "${temp_dir}" || die -n
fi
}
# Usage: rdosym <target> <linkpath> [<linkpath>...]
rdosym() {
local -i _rel_arg=0
while (( ${#} ))
do
case "${1}" in
--rel ) _rel_arg=1 ;;
-- )
(( ${#} < 2 )) && die "Not enough arguments given"
shift # consume double dash
local -r -- _target_arg="${1}"
shift
local -r -a _linkpath_args=( "${@}" )
break
;;
* ) die "Unknown argument '${1}'" ;;
esac
shift
done
local -- _target="${_target_arg}"
local -- _linkpath
for _linkpath in "${_linkpath_args[@]}"
do
local -- _target="${_target_arg}"
if (( _rel_arg ))
then
local -- _linkpath_dir="$(dirname "${_linkpath}" || die)"
local -a realpath_cmd=( realpath
--canonicalize-missing
--no-symlinks
--relative-to="${_linkpath_dir}"
"${_target}"
)
_target="$("${realpath_cmd[@]}" || die)"
fi
echo "dosym: '${_linkpath}' -> '${_target}' ('${_target_arg}')"
dosym "${_target}" "${_linkpath}"
done
}
### END: standard tool wrappers
yesno()
{
(( ${#} != 1 )) && die
local -r -- input_arg="${1}"
local -- input="${input_arg}"
## strip whitespace around input string
while [[ "${input}" == [[:space:]]* ]]
do
input="${input#[[:space:]]}"
done
while [[ "${input}" == *[[:space:]] ]]
do
input="${input%[[:space:]]}"
done
case "${input}" in
[Yy][Ee][Ss] | [Tt][Rr][Uu][Ee] | [Oo][Nn] | 1 ) return 0 ;;
[Nn][Oo] | [Ff][Aa][Ll][Ss][Ee] | [Oo][Ff][Ff] | 0 ) return -1 ;;
* )
debug-print "${FUNCNAME[0]}: no match for '${1}'"
return -1
;;
esac
}
# this function can be used for a first line in files generated by the ebuild logic
print_generated_file_header() {
printf "Automatically generated by %s/%s on %s\n" "${CATEGORY}" "${PF}" "$(date --utc --iso-8601=minutes)"
}
_RINDEAL_ECLASS=1
fi