# 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 }