[pacman-dev] [PATCH 1/3] libmakepkg: use extraction commands instead of file to find archive type

Ethan Sommer e5ten.arch at gmail.com
Tue Nov 26 21:29:55 UTC 2019


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

Signed-off-by: Ethan Sommer <e5ten.arch at gmail.com>
---
 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
 
 	local ret=0
 	msg2 "$(gettext "Extracting %s with %s")" "$file" "$cmd"
-- 
2.23.0


More information about the pacman-dev mailing list