summaryrefslogtreecommitdiffstats
path: root/bin/ecompressdir
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}