diff options
Diffstat (limited to 'profiles/prefix/windows/interix/profile.bashrc')
-rw-r--r-- | profiles/prefix/windows/interix/profile.bashrc | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/profiles/prefix/windows/interix/profile.bashrc b/profiles/prefix/windows/interix/profile.bashrc new file mode 100644 index 0000000..3a32d78 --- /dev/null +++ b/profiles/prefix/windows/interix/profile.bashrc @@ -0,0 +1,146 @@ +# Copyright 1999-2009 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/profiles/prefix/windows/interix/profile.bashrc,v 1.5 2010/10/22 07:30:09 mduft Exp $ + +# use bash as config shell. this avoids _big_ problems with new libtool (>=2.2.10), +# as wrong asumptions about the shell arise when checking against /bin/sh. +export CONFIG_SHELL=${BASH} + +# On interix, 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 program. +# +# This is a workaround for portage bug#199868, +# and should be dropped once portage does sth. like this itself. + +interix_cleanup_removed_files() { + local removedlist=$1 + 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 + + while read rmstem; do + # try to remove previously recorded files + for f in "${ROOT}${rmstem}"*; do + ebegin "trying to remove ${f}" + rm -f "${f}" > /dev/null 2>&1 + eend $? + done + # but keep it in list if still exists + for f in "${ROOT}${rmstem}"*; do + [[ -f ${f} ]] && echo "${rmstem}" >> "${removedlist}".new + break + done + done < "${removedlist}" + + # update the list + mv "${removedlist}"{,.old} + mv "${removedlist}"{.new,} + rm "${removedlist}".old +} + +interix_find_removed_slot() { + local f=$1 + local n=0 + while [[ ${n} -lt 100 && -f "${f}${n}" ]]; do + n=$((n=n+1)) + done + + if [[ ${n} -ge 100 ]]; then + echo "too many (>=100) old text files busy of '${f}'" >&2 + exit 1 + fi + + echo $n +} + +interix_prepare_file() { + local failed=0 + if [[ ${PN} == libiconv ]]; then + # when moving around libiconv, the prefix' coreutils will + # be damaged, so we really need to use the systems ones. + /bin/cp -p "${1}" "${1}.new" || failed=1 + /bin/mv "${1}" "${2}" || failed=1 + /bin/mv "${1}.new" "${1}" || failed=1 + else + my_mv=mv + + [[ "${1}" == */mv ]] && my_mv="${1}.new" + [[ -f "${1}.new" ]] && rm -f "${1}.new" + + cp -p "${1}" "${1}.new" || failed=1 + ${my_mv} "${1}" "${2}" || failed=1 + ${my_mv} "${1}.new" "${1}" || failed=1 + fi + + echo $failed +} + +post_pkg_preinst() { + local removedlist="${EROOT}var/lib/portage/files2bremoved" + interix_cleanup_removed_files $removedlist + + # now go for current package + cd "${D}" + find ".${EROOT}" -type f | while read f; + do + /usr/bin/file "${f}" | grep ' PE ' > /dev/null || continue + + f=${f#./} # find prints: "./path/to/file" + f=${f%:} # file prints: "file-argument: type-of-file" + test -r "${ROOT}${f}" || continue + rmstem="${f}.removedbyportage" + # keep list of old busy text files unique + grep -Fx "${rmstem}" "${removedlist}" >/dev/null \ + || echo "${rmstem}" >> "${removedlist}" + + local n=$(interix_find_removed_slot ${ROOT}${rmstem}) + ebegin "preparing ${ROOT}${f} for merge (${n})" + eend $(interix_prepare_file "${ROOT}${f}" "${ROOT}${rmstem}${n}") + done +} + +post_pkg_prerm() { + local removedlist="${EROOT}var/lib/portage/files2bremoved" + save_IFS=$IFS + IFS=' +'; + local MY_PR=${PR} + [[ ${MY_PR} == r0 ]] && MY_PR= + local -a contents=($(<"${EROOT}var/db/pkg/${CATEGORY}/${P}${MY_PR:+-}${MY_PR}/CONTENTS")); + IFS=$save_IFS + local -a cont + for content in "${contents[@]}"; do + cont=($content) + f=${cont[1]} + f=${f#/} + + test -r "${ROOT}${f}" || continue + + if /usr/bin/file "${ROOT}${f}" | grep ' PE ' > /dev/null; then + # $f should be an absolute path to the installed file + rmstem="${f}.removedbyportage" + + grep "^${rmstem}$" "${removedlist}" > /dev/null \ + || echo "${rmstem}" >> "${removedlist}" + + local n=$(interix_find_removed_slot ${ROOT}${rmstem}) + ebegin "preparing ${ROOT}${f} for unmerge ($n)" + eend $(interix_prepare_file "${ROOT}${f}" "${ROOT}${rmstem}${n}") + fi + done +} + +pre_pkg_postrm() { + local removedlist="${EROOT}var/lib/portage/files2bremoved" + interix_cleanup_removed_files $removedlist +} |