1 |
Use sort and comm with temporary files in order to compare lists |
2 |
of docompress -x and precompressed files, since the file lists |
3 |
can be extremely large. Also strip ${D%/} from paths in order to |
4 |
reduce length. |
5 |
|
6 |
Bug: https://bugs.gentoo.org/721516 |
7 |
Suggested-by: Robin H. Johnson <robbat2@g.o> |
8 |
Signed-off-by: Zac Medico <zmedico@g.o> |
9 |
--- |
10 |
bin/ecompress | 29 ++++++++++--------- |
11 |
.../tests/resolver/ResolverPlayground.py | 1 + |
12 |
2 files changed, 16 insertions(+), 14 deletions(-) |
13 |
|
14 |
diff --git a/bin/ecompress b/bin/ecompress |
15 |
index 60b083834..983a4d1f7 100755 |
16 |
--- a/bin/ecompress |
17 |
+++ b/bin/ecompress |
18 |
@@ -19,29 +19,30 @@ while [[ $# -gt 0 ]] ; do |
19 |
shift |
20 |
|
21 |
skip_dirs=() |
22 |
- skip_files=() |
23 |
+ > "${T}/.ecompress_skip_files" || die |
24 |
for skip; do |
25 |
if [[ -d ${ED%/}/${skip#/} ]]; then |
26 |
skip_dirs+=( "${ED%/}/${skip#/}" ) |
27 |
else |
28 |
rm -f "${ED%/}/${skip#/}.ecompress" || die |
29 |
- skip_files+=("${ED%/}/${skip#/}") |
30 |
+ printf '%s\0' "${EPREFIX}/${skip#/}" >> "${T}/.ecompress_skip_files" |
31 |
fi |
32 |
done |
33 |
|
34 |
if [[ ${#skip_dirs[@]} -gt 0 ]]; then |
35 |
- while read -r -d ''; do |
36 |
- skip_files+=("${REPLY%.ecompress}") |
37 |
+ while read -r -d '' skip; do |
38 |
+ skip=${skip%.ecompress} |
39 |
+ printf '%s\0' "${skip#${D%/}}" >> "${T}/.ecompress_skip_files" |
40 |
done < <(find "${skip_dirs[@]}" -name '*.ecompress' -print0 -delete || die) |
41 |
fi |
42 |
|
43 |
- if [[ ${#skip_files[@]} -gt 0 && -s ${T}/.ecompress_had_precompressed ]]; then |
44 |
- sed_args=() |
45 |
- for f in "${skip_files[@]}"; do |
46 |
- sed_args+=("s|^${f}\$||;") |
47 |
- done |
48 |
- sed_args+=('/^$/d') |
49 |
- sed -f - -i "${T}/.ecompress_had_precompressed" <<< "${sed_args[@]}" || die |
50 |
+ if [[ -s ${T}/.ecompress_skip_files && -s ${T}/.ecompress_had_precompressed ]]; then |
51 |
+ # Filter skipped files from ${T}/.ecompress_had_precompressed, |
52 |
+ # using temporary files since these lists can be extremely large. |
53 |
+ LC_COLLATE=C sort -zu "${T}/.ecompress_skip_files" > "${T}/.ecompress_skip_files_sorted"|| die |
54 |
+ LC_COLLATE=C sort -zu "${T}/.ecompress_had_precompressed" > "${T}/.ecompress_had_precompressed_sorted" || die |
55 |
+ LC_COLLATE=C comm -z13 "${T}/.ecompress_skip_files_sorted" "${T}/.ecompress_had_precompressed_sorted" > "${T}/.ecompress_had_precompressed" || die |
56 |
+ rm -f "${T}/.ecompress_had_precompressed_sorted" "${T}/.ecompress_skip_files"{,_sorted} |
57 |
fi |
58 |
|
59 |
exit 0 |
60 |
@@ -81,7 +82,7 @@ while [[ $# -gt 0 ]] ; do |
61 |
continue 2 |
62 |
fi |
63 |
done |
64 |
- echo "${path}" >> "${T}"/.ecompress_had_precompressed |
65 |
+ printf '%s\0' "${path#${D%/}}" >> "${T}"/.ecompress_had_precompressed || die |
66 |
;; |
67 |
esac |
68 |
|
69 |
@@ -195,8 +196,8 @@ if [[ -s ${T}/.ecompress_had_precompressed ]]; then |
70 |
eqawarn "(manpages, documentation) when automatic compression is used:" |
71 |
eqawarn |
72 |
n=0 |
73 |
- while read -r f; do |
74 |
- eqawarn " ${f#${D%/}}" |
75 |
+ while read -r -d '' f; do |
76 |
+ eqawarn " ${f}" |
77 |
if [[ $(( n++ )) -eq 10 ]]; then |
78 |
eqawarn " ..." |
79 |
break |
80 |
diff --git a/lib/portage/tests/resolver/ResolverPlayground.py b/lib/portage/tests/resolver/ResolverPlayground.py |
81 |
index de80a0cc1..ec2e31ae9 100644 |
82 |
--- a/lib/portage/tests/resolver/ResolverPlayground.py |
83 |
+++ b/lib/portage/tests/resolver/ResolverPlayground.py |
84 |
@@ -91,6 +91,7 @@ class ResolverPlayground(object): |
85 |
"chgrp", |
86 |
"chmod", |
87 |
"chown", |
88 |
+ "comm", |
89 |
"cp", |
90 |
"egrep", |
91 |
"env", |
92 |
-- |
93 |
2.25.3 |