141 lines
2.3 KiB
Bash
141 lines
2.3 KiB
Bash
#!/bin/bash
|
|
|
|
#
|
|
# We need GNU versions of the following utilities. This code works
|
|
# well on Linux and Mac OS X with MacPorts.
|
|
# :FIXME: implement a smarter, portable solution.
|
|
#
|
|
shopt -s expand_aliases
|
|
unalias -a
|
|
|
|
__path=$(which gdate 2>/dev/null)
|
|
if [[ $__path ]]; then
|
|
alias date=$__path
|
|
else
|
|
alias date=$(which date 2>/dev/null)
|
|
fi
|
|
|
|
__path=$(which ginstall 2>/dev/null)
|
|
if [[ $__path ]]; then
|
|
alias install=$__path
|
|
else
|
|
alias install=$(which install 2>/dev/null)
|
|
fi
|
|
|
|
__path=$(which greadlink 2>/dev/null)
|
|
if [[ $__path ]]; then
|
|
alias readlink=$__path
|
|
else
|
|
alias readlink=$(which readlink 2>/dev/null)
|
|
fi
|
|
|
|
__path=$(which gsed 2>/dev/null)
|
|
if [[ $__path ]]; then
|
|
alias sed=$__path
|
|
else
|
|
alias sed=$(which sed 2>/dev/null)
|
|
fi
|
|
|
|
#
|
|
# set an error handler. If a function _exit() exists, it will be called
|
|
# with the passed exit code.
|
|
#
|
|
# $1 exit code
|
|
#
|
|
set -o errexit
|
|
|
|
trap "std::error_handler" ERR
|
|
|
|
std::error_handler() {
|
|
local -i ec=$?
|
|
|
|
[[ typeset -F _exit >/dev/null 2>&1 ]] && _exit "${ec}"
|
|
exit ${ec}
|
|
}
|
|
|
|
#
|
|
# logging/message functions
|
|
#
|
|
std::log() {
|
|
local -ri fd=$1
|
|
local -r fmt="$2\n"
|
|
shift 2
|
|
printf -- "$fmt" "$@" >> /dev/fd/$fd
|
|
}
|
|
|
|
std::info() {
|
|
std::log 2 "$1\n" "${@:2}"
|
|
}
|
|
|
|
std::error() {
|
|
std::log 2 "$1\n" "${@:2}"
|
|
}
|
|
|
|
std::debug() {
|
|
[[ ${PMODULES_DEBUG} ]] || return 0
|
|
std::log 2 "$@"
|
|
}
|
|
|
|
std::die() {
|
|
local -ri ec=$1
|
|
shift
|
|
local cout
|
|
if (( ec == 0)); then
|
|
cout='1'
|
|
else
|
|
cout='2'
|
|
fi
|
|
if [[ -n $@ ]]; then
|
|
local -r fmt=$1
|
|
shift
|
|
std::log $cout "$fmt" "$@"
|
|
fi
|
|
exit $ec
|
|
}
|
|
|
|
std::abspath () {
|
|
readlink -f "$1"
|
|
}
|
|
|
|
std::append_path () {
|
|
local -r P=$1
|
|
local -r d=$2
|
|
|
|
if ! egrep -q "(^|:)${d}($|:)" <<<${!P} ; then
|
|
if [[ -z ${!P} ]]; then
|
|
eval $P=${d}
|
|
else
|
|
eval $P=${!P}:${d}
|
|
fi
|
|
fi
|
|
}
|
|
|
|
std::prepend_path () {
|
|
local -r P=$1
|
|
local -r d=$2
|
|
|
|
if ! egrep -q "(^|:)${d}($|:)" <<<${!P} ; then
|
|
if [[ -z ${!P} ]]; then
|
|
eval $P=${d}
|
|
else
|
|
eval $P="${d}:${!P}"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
read_versions() {
|
|
local -r fname="$1"
|
|
local varname=''
|
|
while read _name _version; do
|
|
[[ -z ${_name} ]] && continue
|
|
[[ -z ${_version} ]] && continue
|
|
[[ "${_name:0:1}" == '#' ]] && continue
|
|
var_name=$(echo ${_name} | tr [:lower:] [:upper:])_VERSION
|
|
# don't set version, if already set
|
|
if [[ -z ${!var_name} ]]; then
|
|
eval ${var_name}="${_version}"
|
|
fi
|
|
done < "${fname}"
|
|
}
|
|
|