Whenever the install directory contains files that would collide upon
(re)compressing, report them explicitly and fail.  This indicates
a serious problem in ebuild and since we don't know which of the files
is correct, we should not attempt to choose between them.

To reduce performance impact, the check is only done whenever compressed
files are found.  This is sufficient since for issue to occur there must
be at least one compressed variant.

Bug: https://bugs.gentoo.org/667072
Signed-off-by: Michał Górny <mgo...@gentoo.org>
---
 bin/ecompress | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/bin/ecompress b/bin/ecompress
index 36bdb585b..bc1f5e08a 100755
--- a/bin/ecompress
+++ b/bin/ecompress
@@ -49,6 +49,30 @@ while [[ $# -gt 0 ]] ; do
                                find_args+=( -size 
"+${PORTAGE_DOCOMPRESS_SIZE_LIMIT}c" )
 
                        while IFS= read -d '' -r path; do
+                               # detect the horrible posibility of the ebuild 
installing
+                               # colliding compressed and/or uncompressed 
variants
+                               # and fail hard (bug #667072)
+                               #
+                               # note: to save time, we need to do this only 
if there's
+                               # at least one compressed file
+                               case ${path} in
+                                       *.Z|*.gz|*.bz2|*.lzma|*.xz)
+                                               vpath=${path%.*}
+                                               for comp in '' .Z .gz .bz2 
.lzma .xz; do
+                                                       if [[ ${vpath}${comp} 
!= ${path} && \
+                                                                       -e 
${vpath}${comp} ]]; then
+                                                               eerror 
"Colliding files found for ecompress:"
+                                                               eerror
+                                                               eerror "  
${path#${D%/}}"
+                                                               eerror "  
${vpath#${D%/}}${comp}"
+                                                               eerror
+                                                               eerror "Please 
remove the incorrect of those files."
+                                                               die "Aborting 
due to colliding compressed files."
+                                                       fi
+                                               done
+                                               ;;
+                               esac
+
                                >> "${path}.ecompress" || die
                        done < <(find "${find_args[@]}" -print0 || die)
                fi
-- 
2.19.0


Reply via email to