On 11/26/19 4:29 PM, Ethan Sommer wrote:
> Previously, to determine which command we should use to extract an
> archive, we would run file and match the output against our list of
> possible extraction commands
> 
> Instead, run the archive through each extraction command's -t (--test)
> flag, if this succeeds then we know that the command is able to extract
> the file and is the one to use

Missing rationale why we care.

>  scripts/libmakepkg/source/file.sh.in | 39 ++++++++--------------------
>  1 file changed, 11 insertions(+), 28 deletions(-)
> 
> diff --git a/scripts/libmakepkg/source/file.sh.in 
> b/scripts/libmakepkg/source/file.sh.in
> index 7297a1c6..faace79b 100644
> --- a/scripts/libmakepkg/source/file.sh.in
> +++ b/scripts/libmakepkg/source/file.sh.in
> @@ -96,35 +96,18 @@ extract_file() {
>       fi
>  
>       # do not rely on extension for file type
> -     local file_type=$(@FILECMD@ -bizL -- "$file")
> -     local ext=${file##*.}
>       local cmd=''
> -     case "$file_type" in
> -             
> *application/x-tar*|*application/zip*|*application/x-zip*|*application/x-cpio*)
> -                     cmd="bsdtar" ;;
> -             *application/x-gzip*|*application/gzip*)
> -                     case "$ext" in
> -                             gz|z|Z) cmd="gzip" ;;
> -                             *) return;;
> -                     esac ;;
> -             *application/x-bzip*)
> -                     case "$ext" in
> -                             bz2|bz) cmd="bzip2" ;;
> -                             *) return;;
> -                     esac ;;
> -             *application/x-xz*)
> -                     case "$ext" in
> -                             xz) cmd="xz" ;;
> -                             *) return;;
> -                     esac ;;
> -             *)
> -                     # See if bsdtar can recognize the file
> -                     if bsdtar -tf "$file" -q '*' &>/dev/null; then
> -                             cmd="bsdtar"
> -                     else
> -                             return 0
> -                     fi ;;
> -     esac
> +     if bsdtar -tf "$file" -q '*'; then
> +             cmd='bsdtar'
> +     elif gzip -t "$file"; then
> +             cmd='gzip'
> +     elif bzip2 -t "$file"; then
> +             cmd='bzip2'
> +     elif xz -t "$file"; then
> +             cmd='xz'
> +     else
> +             return 0
> +     fi &>/dev/null

I had to look at this three times before I realized you were redirecting
both stdout and stderr of the entire if/elif block.

Because these commands check to see if the file is "uncorrupted", not to
see if they are "formatted in this compression format", I imagine this
would falsely fail files if they have some class of recoverable error,
but I'm not sure if we care.

What we do care about, I think, is that you're silencing stderr due to
the fact that it will noisily print diagnostic messages when the file is
not compressed or is in a different compression format, and bsdtar will
print listed filenames to stdout. So now, if these commands fail for
*any* reason, we treat this as a successful analysis that the file is in
a different format. One reason for it failing might be that xz is not
installed... this is hardly a successful analysis, and printing an
"error: command not found" message during the decompression, then dying
with "Failed to extract %s" is a desirable feature.

>       local ret=0
>       msg2 "$(gettext "Extracting %s with %s")" "$file" "$cmd"
> 


-- 
Eli Schwartz
Bug Wrangler and Trusted User

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to