aboutsummaryrefslogtreecommitdiff
blob: b61421b002141997eb8dfb81b62f31411499709a (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/bin/bash
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}"/isolated-functions.sh

if [[ -z $1 ]] ; then
	helpers_die "${0##*/}: at least one argument needed"
	exit 1
fi

# setup compression stuff
PORTAGE_COMPRESS=${PORTAGE_COMPRESS-bzip2}
[[ -z ${PORTAGE_COMPRESS} ]] && exit 0

if [[ ${PORTAGE_COMPRESS_FLAGS+set} != "set" ]] ; then
	case ${PORTAGE_COMPRESS} in
		bzip2|gzip)  PORTAGE_COMPRESS_FLAGS="-9";;
	esac
fi

# decompress_args(suffix, binary)
#	- suffix: the compression suffix to work with
#	- binary: the program to execute that'll compress/decompress
# new_args: global array used to return revised arguments
decompress_args() {
	local suffix=$1 binary=$2
	shift 2

	# Initialize the global new_args array.
	new_args=()
	declare -a decompress_args=()
	local x i=0 decompress_count=0
	for x in "$@" ; do
		if [[ ${x%$suffix} = $x ]] ; then
			new_args[$i]=$x
		else
			new_args[$i]=${x%$suffix}
			decompress_args[$decompress_count]=$x
			((decompress_count++))
		fi
		((i++))
	done

	if [ $decompress_count -gt 0 ] ; then
		${binary} "${decompress_args[@]}"
		if [ $? -ne 0 ] ; then
			# Apparently decompression failed for one or more files, so
			# drop those since we don't want to compress them twice.
			new_args=()
			local x i=0
			for x in "$@" ; do
				if [[ ${x%$suffix} = $x ]] ; then
					new_args[$i]=$x
					((i++))
				elif [[ -f ${x%$suffix} ]] ; then
					new_args[$i]=${x%$suffix}
					((i++))
				else
					# Apparently decompression failed for this one, so drop
					# it since we don't want to compress it twice.
					true
				fi
			done
		fi
	fi
}

case $1 in
	--suffix)
		[[ -n $2 ]] && vecho "${0##*/}: --suffix takes no additional arguments" 1>&2

		if [[ ! -e ${T}/.ecompress.suffix ]] ; then
			set -e
			tmpdir="${T}"/.ecompress$$.${RANDOM}
			mkdir "${tmpdir}"
			cd "${tmpdir}"
			# we have to fill the file enough so that there is something
			# to compress as some programs will refuse to do compression
			# if it cannot actually compress the file
			echo {0..1000} > compressme
			${PORTAGE_COMPRESS} ${PORTAGE_COMPRESS_FLAGS} compressme > /dev/null
			# If PORTAGE_COMPRESS_FLAGS contains -k then we need to avoid
			# having our glob match the uncompressed file here.
			suffix=$(echo compressme.*)
			[[ -z $suffix || "$suffix" == "compressme.*" ]] && \
				suffix=$(echo compressme*)
			suffix=${suffix#compressme}
			cd /
			rm -rf "${tmpdir}"
			echo "${suffix}" > "${T}/.ecompress.suffix"
		fi
		cat "${T}/.ecompress.suffix"
		;;
	--bin)
		[[ -n $2 ]] && vecho "${0##*/}: --bin takes no additional arguments" 1>&2

		echo "${PORTAGE_COMPRESS} ${PORTAGE_COMPRESS_FLAGS}"
		;;
	--queue)
		shift
		ret=0
		for x in "${@/%/.ecompress.file}" ; do
			>> "$x"
			((ret|=$?))
		done
		[[ $ret -ne 0 ]] && helpers_die "${0##*/} failed"
		exit $ret
		;;
	--dequeue)
		[[ -n $2 ]] && vecho "${0##*/}: --dequeue takes no additional arguments" 1>&2
		find "${D}" -name '*.ecompress.file' -print0 \
			| sed -e 's:\.ecompress\.file::g' \
			| ${XARGS} -0 ecompress
		find "${D}" -name '*.ecompress.file' -print0 | ${XARGS} -0 rm -f
		;;
	--*)
		helpers_die "${0##*/}: unknown arguments '$*'"
		exit 1
		;;
	*)
		# Since dodoc calls ecompress on files that are already compressed,
		# perform decompression here (similar to ecompressdir behavior).
		decompress_args ".Z" "gunzip -f" "$@"
		set -- "${new_args[@]}"
		decompress_args ".gz" "gunzip -f" "$@"
		set -- "${new_args[@]}"
		decompress_args ".bz2" "bunzip2 -f" "$@"
		set -- "${new_args[@]}"

		mask_ext_re=""
		set -f
		for x in $PORTAGE_COMPRESS_EXCLUDE_SUFFIXES ; do
			mask_ext_re+="|$x"
		done
		set +f
		mask_ext_re="^(${mask_ext_re:1})\$"
		declare -a filtered_args=()
		i=0
		for x in "$@" ; do
			[[ ${x##*.} =~ $mask_ext_re ]] && continue
			[[ -s ${x} ]] || continue
			filtered_args[$i]=$x
			((i++))
		done
		[ $i -eq 0 ] && exit 0
		set -- "${filtered_args[@]}"

		# If a compressed version of the file already exists, simply
		# delete it so that the compressor doesn't whine (bzip2 will
		# complain and skip, gzip will prompt for input)
		suffix=$(ecompress --suffix)
		[[ -n ${suffix} ]] && echo -n "${@/%/${suffix}$'\001'}" | \
			tr '\001' '\000' | ${XARGS} -0 rm -f
		# Finally, let's actually do some real work
		"${PORTAGE_COMPRESS}" ${PORTAGE_COMPRESS_FLAGS} "$@"
		ret=$?
		[[ $ret -ne 0 ]] && helpers_die "${0##*/} failed"
		exit $ret
		;;
esac