Blob Blame History Raw
#
# set -o errexit -o noglob are assumed.
#

date() { command date "+${1:-${TIMESTAMP_FMT}}"; };
get_var_unsafe() { eval echo \${${1}}; };
set_var_unsafe() { [ -n "${2}" ] && eval ${1}=\"${2}\" || return 0; };
pop_IFS() { IFS="${_pI_IFS}"; unset _pI_IFS; };
push_IFS() { _pI_IFS="${IFS}"; IFS="${1}"; };
set_build_dir() { PKG_BUILD_DIR="${1}-${2}-${PKG_TARGET}"; };
test_cmd() { command -v "${1}" >/dev/null; };

build_fileop() {
	local _op="${1}"; shift;
	if [ "${_op}" = cd ]; then
		log_msg varn "Changing working directory to \`${1}'.";
		[ \( -n "${1}" \) -a \( -e "${1}" \) ] && cd -- "${1}";
	elif [ "${_op}" = cp ]; then
		log_msg varn "Copying \`${1}' to \`${2}' w/ -pPR.";
		[ ${#} -ge 2 ] && cp -pPR -- "${@}";
	elif [ "${_op}" = ln_symbolic ]; then
		log_msg varn "Linking \`${1}' to \`${2}' w/ -fs";
		[ \( -n "${1}" \) -a \( -n "${2}" \) ] && ln -fs -- "${1}" "${2}";
	elif [ "${_op}" = mv ]; then
		log_msg varn "Moving \`${1}' to \`${2}' w/ -fs";
		[ \( -n "${1}" \) -a \( -n "${2}" \) ] && mv -f -- "${1}" "${2}";
	elif [ "${_op}" = mkdir ]\
	||   [ "${_op}" = rm ]; then
		while [ ${#} -gt 0 ]; do
			if [ -z "${1}" ]; then
				return 1;
			elif [ "${_op}" = mkdir ]\
			&&   [ ! -e "${1}" ]; then
				log_msg varn "Making directory \`${1}'.";
				mkdir -p -- "${1}";
			elif [ "${_op}" = rm ]\
			&&   [ -e "${1}" ]; then
				log_msg varn "Removing directory or file \`${1}'.";
				rm -rf -- "${1}";
			fi; shift;
		done;
	else
		log_msg failexit "Error: build_fileop() called w/ invalid parameter(s) \`${@}'.";
	fi;
};

install_files() {
	local _verbose _prefix _ln_target _ln_fname _mkdir_fname	\
		_file_fname_src _file_fname_dst;
	if [ "${1}" = "-v" ]; then
		_verbose="${1}"; shift;
	fi; _prefix="${1}"; shift;
	while [ ${#} -gt 0 ]; do
	case "${1}" in
	@*=*)
		_ln_target="${1%=*}";
		_ln_target="${_ln_target#@}";
		_ln_fname="${1#*=}";
		if [ -e "${_ln_fname}" ]; then
			if [ ${_verbose:-0} -eq 1 ]; then
				echo build_fileop rm "${_ln_fname}";
			fi;
			build_fileop rm "${_ln_fname}";
		fi;
		build_fileop ln_symbolic "${_ln_target}" "${_prefix:+${_prefix}/}${_ln_fname}";
		;;
	/=*)
		_mkdir_fname="${1#/=}";
		build_fileop mkdir "${_prefix:+${_prefix}/}${_mkdir_fname}";
		;;
	*)
		_file_fname_src="${1%=*}";
		_file_fname_dst="${1#*=}";
		build_fileop cp "${_file_fname_src}" "${_prefix:+${_prefix}/}${_file_fname_dst}";
		;;
	esac; shift;
	done;
};

is_build_script_done() {
	local _done_fname="${WORKDIR}/.${1}.${2}" _restart_at="${3}";
	if [ -z "${_restart_at}" ]; then
		if [ -e "${_done_fname}" ]; then
			return 0;	# Skip
		else
			return 1;	# Build
		fi;
	elif [ "${_restart_at}" = "ALL" ]; then
		return 1;		# Build
	elif lmatch "${_restart_at}" , "${2}"; then
		return 1;		# Build
	else
		return 0;		# Skip
	fi;
};

set_build_script_done() {
	local _pkg_fname="${1}";
	local _done_fname_pfx="${WORKDIR}/.${_pkg_fname}";
	shift; while [ ${#} -ge 1 ]; do
		if [ "${1#-}" != "${1}" ]; then
			build_fileop rm "${_done_fname_pfx}.${1#-}";
		else
			touch "${_done_fname_pfx}.${1}";
			log_msg info "Finished build step ${1} of package \`${_pkg_fname}'.";
		fi; shift;
	done;
};

lfilter() {
	local _list="${1}" _filter="${2}" _lnew _litem _lfilter;
	for _litem in ${_list}; do
		for _lfilter in ${_filter}; do
			if [ "${_lfilter}" = "${_litem}" ]; then
				_lnew="${_lnew:+${_lnew} }${_litem}"; break;
			fi; 
		done;
	done;
	echo ${_lnew};
};

lmatch() {
	local _cmp="${3}"; push_IFS "${2}"; set -- ${1}; pop_IFS;
	while [ ${#} -gt 0 ]; do
		if [ "${1}" = "${_cmp}" ]; then
			return 0;
		fi; shift;
	done; return 1;
};

log_env_vars() {
	local _nvar _arg _arg_len_max;
	log_msg info "Variables for this ${1:-build}:"; shift;
	while [ ${_nvar:=0} -lt ${#} ]; do
		_arg="$(eval echo \${${_nvar}})";
		_arg="${_arg%%=*}";
		if [ ${#_arg} -gt ${_arg_len_max:=0} ]; then
			_arg_len_max=${#_arg};
		fi; : $((_nvar+=1));
	done;
	while [ ${#} -gt 0 ]; do
		log_msg info "$(printf					\
			"%${_arg_len_max}.${_arg_len_max}s=%s"	\
			"${1%%=*}" "$(get_var_unsafe ${1#*=})")";
		shift;
	done;
};

log_msg() {
	local _lvl="${1}"; shift;
	if [ "${_lvl#v}" != "${_lvl}" ]\
	&& [ ${ARG_VERBOSE:-0} -eq 0 ]; then
		return;
	fi;
	case "${_lvl}" in
		failexit) printf "\033[0m\033[${LOG_MSG_FAIL_COLOUR}m"; ;;
		fail) printf "\033[0m\033[${LOG_MSG_FAIL_COLOUR}m"; ;;
		info) printf "\033[0m\033[${LOG_MSG_INFO_COLOUR}m"; ;;
		vnfo) printf "\033[0m\033[${LOG_MSG_INFO_COLOUR}m"; ;;
		succ) printf "\033[0m\033[${LOG_MSG_SUCC_COLOUR}m"; ;;
		warn) printf "\033[0m\033[${LOG_MSG_WARN_COLOUR}m"; ;;
		varn) printf "\033[0m\033[${LOG_MSG_WARN_COLOUR}m"; ;;
	esac;
	if [ ${#} -gt 1 ]; then
		printf "==> %s %s %s\033[0m\n" "$(date)" "${1}" "$*";
	else
		printf "==> %s %s\033[0m\n" "$(date)" "${1}";
	fi; [ ${_lvl} = failexit ] && exit 1 || return 0;
};

run_cmd_unsplit() {
	local _cmd="${1}" _cmdline _rc; shift;
	while [ ${#} -gt 0 ]; do
		[ -n "${1}" ] &&\
			_cmdline="${_cmdline:+${_cmdline}:}${1}";
		shift;
	done;
	push_IFS :; ${_cmd} ${_cmdline}; _rc=$?; pop_IFS;
	return ${_rc};
};

set_env_vars_with_sep() {
	local _sep="${1}"; shift; push_IFS ${_sep}; set -- ${1};
	while [ ${#} -gt 0 ]; do
		export "${1}"; shift;
	done; pop_IFS;
};

subst_tgts() {
	while [ ${#} -ge 1 ]; do
	case "${1}" in
	devroot)
		echo "${DEVROOT_PACKAGES}"; ;;
	world)	echo "${WORLD_PACKAGES}"; ;;
	*)	echo "${1}"; ;;
	esac; shift;
	done;
};

# vim:filetype=sh