diff options
Diffstat (limited to 'profiles/prefix/hpux/profile.bashrc')
-rw-r--r-- | profiles/prefix/hpux/profile.bashrc | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/profiles/prefix/hpux/profile.bashrc b/profiles/prefix/hpux/profile.bashrc new file mode 100644 index 000000000000..3056078ba1df --- /dev/null +++ b/profiles/prefix/hpux/profile.bashrc @@ -0,0 +1,114 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +# /bin/sh is korn shell, incompatible with bash used by makefiles later. +# This is a problem with recent libtool detecting non-bashism 'print' fex. +export CONFIG_SHELL=${BASH} + +# On hpux, binary files (executables, shared libraries) in use +# cannot be replaced during merge. +# But it is possible to rename them and remove lateron when they are +# not used any more by any running process. +# +# This is a workaround for portage bug#199868, +# and should be dropped once portage does sth. like this itself. + +hpux-busytext-get-listfile() { + echo "${ROOT%%/}${EPREFIX}/var/lib/portage/files2bremoved" +} + +hpux-busytext-cleanup() { + local removedlist=$(hpux-busytext-get-listfile) + + rm -f "${removedlist}".new + + if [[ -r ${removedlist} ]]; then + rm -f "${removedlist}".old + fi + # restore in case of system fault + if [[ -r ${removedlist}.old ]]; then + mv "${removedlist}"{.old,} + fi + + touch "${removedlist}"{,.new} # ensure they exist + + local rmstem f + while read rmstem + do + # try to remove previously recorded files + for f in $(ls "${ROOT}${rmstem}"*); do + echo "trying to remove old busy text file ${f}" + rm -f "${f}" + done + # but keep it in list if still exists + for f in $(ls "${ROOT}${rmstem}"*); do + echo "${rmstem}" >> "${removedlist}".new + break + done + done < "${removedlist}" + + # update the list + mv "${removedlist}"{,.old} + mv "${removedlist}"{.new,} + rm "${removedlist}".old +} + +hpux-busytext-backup() { + local removedlist=$(hpux-busytext-get-listfile) + + # now go for current package + cd "${D}" || exit 1 + + /usr/bin/find ".${EPREFIX}" '!' -type d \ + | while read f + do + f=${f#./} + [[ ! -f ${ROOT}${f} || -h ${ROOT}${f} ]] && continue + echo "${ROOT}${f}" + done \ + | xargs -r /usr/bin/file \ + | /usr/bin/grep -E '(object file|shared library|executable)' \ + | while read f t + do + # file prints: "file-argument: type-of-file" + f=${f#${ROOT}} + f=${f%:} + test -r "${ROOT}${f}" || continue + rmstem="${f}.removedbyportage" + # keep list of old busy text files unique + /usr/bin/grep "^${rmstem/[/\\[}$" "${removedlist}" >/dev/null \ + || echo "${rmstem}" >> "${removedlist}" + n=0 + while [[ ${n} -lt 100 && -f "${ROOT}${rmstem}${n}" ]]; do + n=$((n=n+1)) + done + + if [[ ${n} -ge 100 ]]; then + echo "too many (>=100) old text files busy of '${ROOT}${f}'" >&2 + exit 1 + fi + echo "backing up text file ${ROOT}${f} (${n})" + /usr/bin/mv -f "${ROOT}${f}" "${ROOT}${rmstem}${n}" || exit 1 + /usr/bin/cp -f "${ROOT}${rmstem}${n}" "${ROOT}${f}" || exit 1 + done || exit 1 +} + +prefix_hpux-post_pkg_preinst() { + hpux-busytext-cleanup + hpux-busytext-backup +} + +prefix_hpux-pre_pkg_postinst() { + hpux-busytext-cleanup +} + +# These are because of +# http://archives.gentoo.org/gentoo-dev/msg_529a0806ed2cf841a467940a57e2d588.xml +# The profile-* ones are meant to be used in etc/portage/profile.bashrc by user +# until there is the registration mechanism. +profile-post_pkg_preinst() { prefix_hpux-post_pkg_preinst ; } + post_pkg_preinst() { prefix_hpux-post_pkg_preinst ; } + +profile-pre_pkg_postinst() { prefix_hpux-pre_pkg_postinst ; } + pre_pkg_postinst() { prefix_hpux-pre_pkg_postinst ; } |