Files
common/utils/extract/extract.sh
2025-12-30 23:20:08 -08:00

64 lines
1.6 KiB
Bash

#!/bin/bash
set -euo pipefail # Best practice: fail fast on errors, unset vars, pipeline failures
FILE="${1:-}"
FILE_TYPE="${2:-auto}"
OUTPUT_DIR="${3:-}"
PREFIX_ARGS="${4:-}"
ADDITIONAL_ARGS="${5:-}"
# Validate that a file was provided
if [[ -z "$FILE" ]]; then
echo "Error: No file specified." >&2
exit 1
fi
# Resolve relative paths and check if file exists
if [[ ! -f "$FILE" ]]; then
echo "Error: File not found: '$FILE'" >&2
exit 1
fi
# Auto-detect file type if needed
if [[ "$FILE_TYPE" == "auto" ]]; then
if [[ "$FILE" =~ \.(tar\.gz|tgz)$ ]]; then
FILE_TYPE="tgz"
elif [[ "$FILE" =~ \.zip$ ]]; then
FILE_TYPE="zip"
else
echo "Error: Unable to auto-detect file type from extension '$FILE'. Specify 'zip' or 'tgz'." >&2
exit 1
fi
fi
# Ensure output directory exists if specified
if [[ -n "$OUTPUT_DIR" ]]; then
mkdir -p "$OUTPUT_DIR"
fi
# Build the extraction command
case "$FILE_TYPE" in
tgz)
COMMAND=(tar $PREFIX_ARGS -xzf "$FILE" $ADDITIONAL_ARGS)
[[ -n "$OUTPUT_DIR" ]] && COMMAND+=(-C "$OUTPUT_DIR")
;;
zip)
COMMAND=(unzip $PREFIX_ARGS -o "$FILE" $ADDITIONAL_ARGS)
[[ -n "$OUTPUT_DIR" ]] && COMMAND+=(-d "$OUTPUT_DIR")
;;
*)
echo "Error: Invalid fileType '$FILE_TYPE'. Must be 'auto', 'zip', or 'tgz'." >&2
exit 1
;;
esac
# Output the built command (for GitHub Actions step output or local debugging)
if [[ -z "${GITHUB_OUTPUT-}" ]]; then
GITHUB_OUTPUT="/dev/stdout"
fi
echo "command=${COMMAND[*]}" >> "$GITHUB_OUTPUT"
# Execute the command safely using an array (prevents word splitting issues)
exec "${COMMAND[@]}"