Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>, "Robin H . Johnson" <robbat2@g.o>
Subject: [gentoo-portage-dev] [PATCH] ecompress: optimize docompress -x precompressed comparison
Date: Sun, 28 Jun 2020 19:57:31
Message-Id: 20200628195456.31778-1-zmedico@gentoo.org
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

Replies