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