6bfa4a28aa
In an environment created by `hsh --initroot-only`: $ for i in /usr/lib/rpm/*; do rpm -qf --qf='%{name}: '"$i"'\n' "$i"; done | grep '^rpm:' rpm: /usr/lib/rpm/0ldconfig.filetrigger rpm: /usr/lib/rpm/GROUPS rpm: /usr/lib/rpm/find-package rpm: /usr/lib/rpm/functions rpm: /usr/lib/rpm/macros.d rpm: /usr/lib/rpm/pdeath_execute rpm: /usr/lib/rpm/platform rpm: /usr/lib/rpm/posttrans-filetriggers rpm: /usr/lib/rpm/postupdate rpm: /usr/lib/rpm/rpmd rpm: /usr/lib/rpm/rpmdb_loadcvt rpm: /usr/lib/rpm/rpme rpm: /usr/lib/rpm/rpmi rpm: /usr/lib/rpm/rpmk rpm: /usr/lib/rpm/rpmpopt-4.13.0.1 rpm: /usr/lib/rpm/rpmq rpm: /usr/lib/rpm/rpmu rpm: /usr/lib/rpm/rpmv The `scripts/functions` file is provided from the rpm project in real installations. Let's ensure scripts in this package use the functions file from this package.
205 lines
5.0 KiB
Bash
205 lines
5.0 KiB
Bash
#!/bin/sh -e
|
|
#
|
|
# Copyright (C) 2003 Dmitry V. Levin <ldv@altlinux.org>
|
|
# Copyright (C) 2007 Alexey Tourbin <at@altlinux.org>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
|
|
unset CDPATH ||:
|
|
export LC_ALL=C
|
|
PROG="${0##*/}"
|
|
|
|
case "${RPM_SCRIPTS_DEBUG:-0}" in
|
|
0) unset RPM_SCRIPTS_DEBUG ||: ;;
|
|
1|2) ;;
|
|
*) RPM_SCRIPTS_DEBUG=3; set -x ;;
|
|
esac
|
|
|
|
Fatal()
|
|
{
|
|
echo "${0##*/}: ERROR: $*" >&2
|
|
exit 1
|
|
}
|
|
|
|
Warning()
|
|
{
|
|
echo "${0##*/}: WARNING: $*" >&2
|
|
}
|
|
|
|
Info()
|
|
{
|
|
echo "${0##*/}: $*" >&2
|
|
}
|
|
|
|
Verbose()
|
|
{
|
|
[ "${RPM_SCRIPTS_DEBUG:-0}" -ge 1 ] || return 0
|
|
Info "$@"
|
|
}
|
|
|
|
Debug()
|
|
{
|
|
[ "${RPM_SCRIPTS_DEBUG:-0}" -ge 2 ] || return 0
|
|
Info "$@"
|
|
}
|
|
|
|
ValidateBuildRoot()
|
|
{
|
|
[ -n "${RPM_BUILD_ROOT-}" ] ||
|
|
Fatal 'RPM_BUILD_ROOT not set'
|
|
[ -n "$(printf %s "$RPM_BUILD_ROOT" |tr -d ' /.')" ] ||
|
|
Fatal "bogus RPM_BUILD_ROOT=$RPM_BUILD_ROOT"
|
|
local real_buildroot
|
|
# There could be simply no %install section...
|
|
# I pretend that non-existent buildroot is just canonical enough.
|
|
real_buildroot=$(readlink -vm -- "$RPM_BUILD_ROOT")
|
|
[ "$RPM_BUILD_ROOT" = "$real_buildroot" ] ||
|
|
Fatal "non-canonical RPM_BUILD_ROOT=$RPM_BUILD_ROOT real_buildroot=$real_buildroot"
|
|
}
|
|
|
|
[ -z "${RPM_BUILD_ROOT-}" ] || ValidateBuildRoot
|
|
readonly RPM_BUILD_ROOT
|
|
|
|
SetupMethods()
|
|
{
|
|
local suffix="$1" inm="$2"; shift 2
|
|
# do not stat(2) here so as to bypass buildreq
|
|
local allm=$(ls "$(dirname "$0")"/ |sed -n "/^[^.]/s/[.]$suffix$//p")
|
|
[ -n "$allm" ] || Fatal "no $suffix methods available"
|
|
allm=$(echo '' $allm '')
|
|
local m outm="$allm"
|
|
for m in $(IFS="$IFS,"; echo '' $inm); do
|
|
case "$m" in
|
|
*[!0-9A-Za-z_-]*)
|
|
Fatal "invalid $suffix method name $m"
|
|
;;
|
|
yes|auto|all)
|
|
outm=$allm
|
|
;;
|
|
no|none|off|false|skip)
|
|
outm=
|
|
;;
|
|
no*)
|
|
m=${m#no}
|
|
outm=$(echo "$outm" |sed "s/ $m / /g")
|
|
;;
|
|
*)
|
|
[ -z "${allm##* $m *}" ] || Fatal "$suffix method $m not available"
|
|
[ -n "$outm" -a -z "${outm##* $m *}" ] || outm=" $outm $m "
|
|
;;
|
|
esac
|
|
done
|
|
echo $outm |tr -s ' ' ','
|
|
}
|
|
|
|
RunMethods()
|
|
{
|
|
local m_m m_dir m_suffix="$1" m_inm="$2"; shift 2
|
|
m_dir=$(dirname "$0")
|
|
for m_m in $(IFS="$IFS,"; echo '' $m_inm); do
|
|
"$@" "$m_dir/$m_m.$m_suffix"
|
|
done
|
|
}
|
|
|
|
# Canonicalize each path component with respect to symbolic links, except
|
|
# for the last. E.g. /etc/init.d/functions -> /etc/rc.d/init.d/functions.
|
|
CanonPath()
|
|
{
|
|
local f0="${1:?}" f1 f2; shift
|
|
[ -z "${f0##/*}" ] || f0=$PWD/$f0
|
|
# First pass: "blind" cleanup-only canonicalization.
|
|
f1=$(readlink -vm "/-$$-/$f0")
|
|
f1=${f1##/-$$-}
|
|
[ -n "$f1" ] || f1=/
|
|
[ "$f0" = "$f1" ] || Verbose "CanonPath1: $f0 -> $f1"
|
|
# Second pass: adjust parent directory.
|
|
# Note that -L test was not reliable before the first pass.
|
|
if [ -L "$f1" ]; then
|
|
local d
|
|
d=$(dirname -- "$f1")
|
|
d=$(readlink -vm -- "$d")
|
|
f2="${d%/}/${f1##*/}"
|
|
else
|
|
f2=$(readlink -vm -- "$f1")
|
|
fi
|
|
[ "$f1" = "$f2" ] || Verbose "CanonPath2: $f1 -> $f2"
|
|
echo "$f2"
|
|
}
|
|
|
|
ArgvFileAction()
|
|
{
|
|
local av_action="$1"; shift
|
|
|
|
if [ $# -gt 0 ]; then
|
|
local av_argv
|
|
av_argv=$(getopt -n "$PROG" -o v -l help,verbose -- "$@")
|
|
eval set -- "$av_argv"
|
|
while :; do
|
|
case "$1" in
|
|
--help) type Usage >/dev/null 2>&1 && Usage 0 ||
|
|
echo "Usage: $PROG [-v|--verbose] [FILE...]"
|
|
exit 0 ;;
|
|
-v|--verbose)
|
|
export RPM_SCRIPTS_DEBUG=$((${RPM_SCRIPTS_DEBUG:-0}+1))
|
|
shift ;;
|
|
--) shift
|
|
break ;;
|
|
*) Fatal "unrecognized option: $1"
|
|
esac
|
|
done
|
|
[ "${RPM_SCRIPTS_DEBUG:-0}" -lt 3 ] || set -x
|
|
fi
|
|
|
|
local av_f
|
|
if [ $# -gt 0 ]; then
|
|
for av_f; do
|
|
[ -n "$av_f" -a -z "${av_f##/*}" ] || av_f=$(CanonPath "$av_f")
|
|
Debug "processing $av_f"
|
|
"$av_action" "$av_f" </dev/null
|
|
done
|
|
else
|
|
[ -t 0 ] && Info "reading file list from standard input"
|
|
while IFS= read -r av_f; do
|
|
[ -n "$av_f" -a -z "${av_f##/*}" ] || av_f=$(CanonPath "$av_f")
|
|
Debug "processing $av_f"
|
|
"$av_action" "$av_f" </dev/null
|
|
done
|
|
fi
|
|
}
|
|
|
|
PackagedFiles()
|
|
{
|
|
if [ -n "${RPM_BUILD_ROOT-}" ]; then
|
|
[ -z "${RPM_SUBPACKAGE_NAME-}" ] ||
|
|
cat "$RPM_BUILD_ROOT/.files:$RPM_SUBPACKAGE_NAME" 2>/dev/null ||:
|
|
else
|
|
rpmquery --list -f -- "$@" 2>/dev/null ||:
|
|
fi
|
|
}
|
|
|
|
# Quote given arguments for sed basic regular expression.
|
|
# Usage example: sed "s/$(quote_sed_regexp "$var_pattern")/$(quote_sed_regexp "$var_replacement")/"
|
|
# Taken from libshell.
|
|
quote_sed_regexp()
|
|
{
|
|
local out="$*"
|
|
if [ -z "${out##*[\[\].*&^\$\\\\/]*}" ]; then
|
|
out="$(printf %s "$out" |sed -e 's/[].*&^$[\/]/\\&/g')" ||
|
|
return 1
|
|
fi
|
|
printf %s "$out"
|
|
}
|