diff options
Diffstat (limited to 'profiles/prefix/windows/winnt/profile.bashrc')
-rw-r--r-- | profiles/prefix/windows/winnt/profile.bashrc | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/profiles/prefix/windows/winnt/profile.bashrc b/profiles/prefix/windows/winnt/profile.bashrc index 3c12c6519673..7d1251609c0f 100644 --- a/profiles/prefix/windows/winnt/profile.bashrc +++ b/profiles/prefix/windows/winnt/profile.bashrc @@ -27,6 +27,69 @@ windows_setup_dllhelper() { esac } +windows_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 +} + +windows_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 +} + +windows_prepare_file() { + local failed=0 + 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 + + echo $failed +} + post_src_install() { cd "${ED}" find . -name '*.exe' -o -name '*.dll.a' -o -name '*.so' | @@ -62,6 +125,64 @@ post_src_install() { done } +post_pkg_preinst() { + local removedlist="${EROOT}var/lib/portage/files2bremoved" + windows_cleanup_removed_files $removedlist + + # now go for current package + cd "${D}" + find ".${EROOT}" -type f | xargs -r /usr/bin/file | grep ' PE ' | while read f t + do + 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 "^${rmstem}$" "${removedlist}" >/dev/null \ + || echo "${rmstem}" >> "${removedlist}" + + local n=$(windows_find_removed_slot ${ROOT}${rmstem}) + ebegin "backing up text file ${ROOT}${f} (${n})" + eend $(windows_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=$(windows_find_removed_slot ${ROOT}${rmstem}) + ebegin "preparing ${ROOT}${f} for unmerge ($n)" + eend $(windows_prepare_file "${ROOT}${f}" "${ROOT}${rmstem}${n}") + fi + done +} + +pre_pkg_postrm() { + local removedlist="${EROOT}var/lib/portage/files2bremoved" + windows_cleanup_removed_files $removedlist +} + windows_setup_dllhelper_cp() { if ! [[ $(type -P cp) -ef ${T}/dllhelper/cp ]] then |