| #!/bin/bash |
| # Copyright 1999-2007 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # $Id$ |
| |
| source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}"/isolated-functions.sh |
| |
| if [[ -z $1 ]] ; then |
| vecho "${0##*/}: at least one argument needed" 1>&2 |
| exit 1 |
| fi |
| |
| case $1 in |
| --ignore) |
| shift |
| for skip in "$@" ; do |
| [[ -d ${D}${skip} ]] && touch "${D}${skip}.ecompress.skip" |
| done |
| exit 0 |
| ;; |
| --queue) |
| shift |
| set -- "${@/%/.ecompress.dir}" |
| set -- "${@/#/${D}}" |
| exec touch "$@" |
| ;; |
| --dequeue) |
| [[ -n $2 ]] && vecho "${0##*/}: --dequeue takes no additional arguments" 1>&2 |
| find "${D}" -name '*.ecompress.dir' -print0 \ |
| | sed -e 's:\.ecompress\.dir::g' -e "s:${D}:/:g" \ |
| | ${XARGS} -0 ecompressdir |
| find "${D}" -name '*.ecompress.skip' -print0 | ${XARGS} -0 rm -f |
| exit 0 |
| ;; |
| --*) |
| vecho "${0##*/}: unknown arguments '$*'" |
| exit 1 |
| ;; |
| esac |
| |
| # figure out the new suffix |
| suffix=$(ecompress --suffix) |
| |
| # funk_up_dir(action, suffix, binary) |
| # - action: compress or decompress |
| # - suffix: the compression suffix to work with |
| # - binary: the program to execute that'll compress/decompress |
| # The directory we act on is implied in the ${dir} variable |
| funk_up_dir() { |
| local act=$1 suffix=$2 binary=$3 |
| |
| local negate="" |
| [[ ${act} == "compress" ]] && negate="!" |
| |
| # first we act on all the files |
| find "${dir}" -type f ${negate} -iname '*'${suffix} -print0 | ${XARGS} -0 ${binary} |
| ((ret|=$?)) |
| |
| find "${dir}" -type l -print0 | \ |
| while read -d $'\0' brokenlink ; do |
| [[ -e ${brokenlink} ]] && continue |
| olddest=$(readlink "${brokenlink}") |
| [[ ${act} == "compress" ]] \ |
| && newdest="${olddest}${suffix}" \ |
| || newdest="${olddest%${suffix}}" |
| rm -f "${brokenlink}" |
| [[ ${act} == "compress" ]] \ |
| && ln -snf "${newdest}" "${brokenlink}${suffix}" \ |
| || ln -snf "${newdest}" "${brokenlink%${suffix}}" |
| ((ret|=$?)) |
| done |
| } |
| |
| # _relocate_skip_dirs(srctree, dsttree) |
| # Move all the directories we want to skip running compression |
| # on from srctree to dsttree. |
| _relocate_skip_dirs() { |
| local srctree="$1" dsttree="$2" |
| |
| [[ -d ${srctree} ]] || return 0 |
| |
| find "${srctree}" -name '*.ecompress.skip' -print0 | \ |
| while read -d $'\0' src ; do |
| src=${src%.ecompress.skip} |
| dst="${dsttree}${src#${srctree}}" |
| parent=${dst%/*} |
| mkdir -p "${parent}" |
| mv "${src}" "${dst}" |
| mv "${src}.ecompress.skip" "${dst}.ecompress.skip" |
| done |
| } |
| hide_skip_dirs() { _relocate_skip_dirs "${D}" "${T}"/ecompress-skip/ ; } |
| restore_skip_dirs() { _relocate_skip_dirs "${T}"/ecompress-skip/ "${D}" ; } |
| |
| ret=0 |
| |
| rm -rf "${T}"/ecompress-skip |
| |
| for dir in "$@" ; do |
| dir=${dir#/} |
| dir="${D}${dir}" |
| if [[ ! -d ${dir} ]] ; then |
| vecho "${0##*/}: /${dir#${D}} does not exist!" |
| continue |
| fi |
| cd "${dir}" |
| actual_dir=${dir} |
| dir=. # use relative path to avoid 'Argument list too long' errors |
| |
| # hide all the stuff we want to skip |
| hide_skip_dirs "${dir}" |
| |
| # since we've been requested to compress the whole dir, |
| # delete any individual queued requests |
| rm -f "${actual_dir}.ecompress.dir" |
| find "${dir}" -type f -name '*.ecompress.file' -print0 | ${XARGS} -0 rm -f |
| |
| # not uncommon for packages to compress doc files themselves |
| funk_up_dir "decompress" ".Z" "gunzip -f" |
| funk_up_dir "decompress" ".gz" "gunzip -f" |
| funk_up_dir "decompress" ".bz2" "bunzip2 -f" |
| |
| # forcibly break all hard links as some compressors whine about it |
| find "${dir}" -type f -links +1 -exec env file="{}" sh -c \ |
| 'cp -p "${file}" "${file}.ecompress.break" ; mv -f "${file}.ecompress.break" "${file}"' \; |
| |
| # now lets do our work |
| [[ -z ${suffix} ]] && continue |
| vecho "${0##*/}: $(ecompress --bin) /${actual_dir#${D}}" |
| funk_up_dir "compress" "${suffix}" "ecompress" |
| |
| # finally, restore the skipped stuff |
| restore_skip_dirs |
| done |
| |
| exit ${ret} |