blob: 2122250fc672fc3425772aea699ea224c4b565ae (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
#!/bin/bash
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id: prepalldocs 3483 2006-06-10 21:40:40Z genone $
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}
|