|
|
@@ -224,116 +224,13 @@ runs:
|
|
|
EXTRACT_DIR="$(dirname "$CACHE_PATH")"
|
|
|
|
|
|
if [ "$IS_SPLIT" = "true" ]; then
|
|
|
- mapfile -t PARTS_ARRAY < <(printf '%s\n' "$FINAL_ARCHIVE".part* | sort)
|
|
|
- if [ ${#PARTS_ARRAY[@]} -eq 0 ] || [ ! -e "${PARTS_ARRAY[0]}" ]; then
|
|
|
- echo "::error::Split archive parts not found for $FINAL_ARCHIVE"
|
|
|
- exit 1
|
|
|
- fi
|
|
|
- for part_file in "${PARTS_ARRAY[@]}"; do
|
|
|
- if [ ! -s "$part_file" ]; then
|
|
|
- echo "::error::Split archive part is missing or empty: $part_file"
|
|
|
- exit 1
|
|
|
- fi
|
|
|
- done
|
|
|
-
|
|
|
- # Create a concatenated archive file but keep parts until extraction succeeds
|
|
|
- cat "${PARTS_ARRAY[@]}" > "$FINAL_ARCHIVE"
|
|
|
-
|
|
|
- # Attempt to fetch checksum asset (FILENAME.sha256) and verify before extracting
|
|
|
- CHECKSUM_FILE="$FINAL_ARCHIVE.sha256"
|
|
|
- EXPECTED_SUM=""
|
|
|
- if command -v gh >/dev/null 2>&1; then
|
|
|
- if gh release view "$TAG_NAME" --repo "$TARGET_REPO" >/dev/null 2>&1; then
|
|
|
- if gh release download "$TAG_NAME" --repo "$TARGET_REPO" --pattern "$CHECKSUM_FILE" -D . >/dev/null 2>&1; then
|
|
|
- if [ -s "$CHECKSUM_FILE" ]; then
|
|
|
- EXPECTED_SUM=$(awk '{print $1}' "$CHECKSUM_FILE" || true)
|
|
|
- echo "Found checksum for $FINAL_ARCHIVE: $EXPECTED_SUM"
|
|
|
- fi
|
|
|
- fi
|
|
|
- fi
|
|
|
- fi
|
|
|
-
|
|
|
- MAX_EXTRACT_ATTEMPTS=3
|
|
|
- attempt=1
|
|
|
- extracted=false
|
|
|
- while [ $attempt -le $MAX_EXTRACT_ATTEMPTS ]; do
|
|
|
- echo "Attempting extraction (attempt $attempt/$MAX_EXTRACT_ATTEMPTS)"
|
|
|
-
|
|
|
- # If we have an expected checksum, verify it
|
|
|
- if [ -n "$EXPECTED_SUM" ]; then
|
|
|
- if command -v sha256sum >/dev/null 2>&1; then
|
|
|
- ACTUAL_SUM=$(sha256sum "$FINAL_ARCHIVE" | awk '{print $1}') || ACTUAL_SUM=""
|
|
|
- else
|
|
|
- ACTUAL_SUM=$(openssl dgst -sha256 "$FINAL_ARCHIVE" | awk '{print $2}') || ACTUAL_SUM=""
|
|
|
- fi
|
|
|
- echo " actual=$ACTUAL_SUM expected=$EXPECTED_SUM"
|
|
|
- if [ -n "$ACTUAL_SUM" ] && [ "$ACTUAL_SUM" != "$EXPECTED_SUM" ]; then
|
|
|
- echo " ⚠️ Checksum mismatch (will re-download parts)"
|
|
|
- extracted=false
|
|
|
- else
|
|
|
- echo " Checksum OK or not provided, proceeding to extract"
|
|
|
- extracted=true
|
|
|
- fi
|
|
|
- else
|
|
|
- echo " No checksum available, proceeding to extraction"
|
|
|
- extracted=true
|
|
|
- fi
|
|
|
-
|
|
|
- if [ "$extracted" = "true" ]; then
|
|
|
- if [ "$COMPRESSED" = "true" ]; then
|
|
|
- if tar -I "zstd -d -T0" -xf "$FINAL_ARCHIVE" -C "$EXTRACT_DIR"; then
|
|
|
- extracted=true
|
|
|
- break
|
|
|
- else
|
|
|
- extracted=false
|
|
|
- fi
|
|
|
- else
|
|
|
- if tar -xf "$FINAL_ARCHIVE" -C "$EXTRACT_DIR"; then
|
|
|
- extracted=true
|
|
|
- break
|
|
|
- else
|
|
|
- extracted=false
|
|
|
- fi
|
|
|
- fi
|
|
|
- fi
|
|
|
-
|
|
|
- echo "Extraction failed (possible truncated download or checksum mismatch)."
|
|
|
- if [ $attempt -lt $MAX_EXTRACT_ATTEMPTS ]; then
|
|
|
- echo "Re-downloading split parts and retrying..."
|
|
|
- # remove concatenated before re-download
|
|
|
- rm -f "$FINAL_ARCHIVE"
|
|
|
- for part_file in "${PARTS_ARRAY[@]}"; do
|
|
|
- echo " Re-downloading $part_file"
|
|
|
- rm -f "$part_file"
|
|
|
- if ! download_asset "$part_file" "$BASE_URL/$part_file"; then
|
|
|
- echo "::error::Failed to re-download $part_file"
|
|
|
- exit 1
|
|
|
- fi
|
|
|
- done
|
|
|
- # rebuild concatenated archive
|
|
|
- cat "${PARTS_ARRAY[@]}" > "$FINAL_ARCHIVE"
|
|
|
- # re-fetch checksum if available
|
|
|
- if command -v gh >/dev/null 2>&1; then
|
|
|
- rm -f "$CHECKSUM_FILE"
|
|
|
- gh release download "$TAG_NAME" --repo "$TARGET_REPO" --pattern "$CHECKSUM_FILE" -D . >/dev/null 2>&1 || true
|
|
|
- if [ -s "$CHECKSUM_FILE" ]; then
|
|
|
- EXPECTED_SUM=$(awk '{print $1}' "$CHECKSUM_FILE" || true)
|
|
|
- else
|
|
|
- EXPECTED_SUM=""
|
|
|
- fi
|
|
|
- fi
|
|
|
- fi
|
|
|
- attempt=$((attempt+1))
|
|
|
- done
|
|
|
-
|
|
|
- if [ "$extracted" = "false" ]; then
|
|
|
- echo "::error::Extraction failed after $MAX_EXTRACT_ATTEMPTS attempts. Aborting."
|
|
|
- exit 1
|
|
|
+ PARTS=$(ls "$FINAL_ARCHIVE.part"* | sort)
|
|
|
+ if [ "$COMPRESSED" = "true" ]; then
|
|
|
+ cat $PARTS | tar -I "zstd -d -T0" -xf - -C "$EXTRACT_DIR"
|
|
|
+ else
|
|
|
+ cat $PARTS | tar -xf - -C "$EXTRACT_DIR"
|
|
|
fi
|
|
|
-
|
|
|
- # cleanup parts and final archive after successful extraction
|
|
|
- rm -f "${PARTS_ARRAY[@]}"
|
|
|
- rm -f "$FINAL_ARCHIVE"
|
|
|
+ rm -f $PARTS
|
|
|
else
|
|
|
if [ "$COMPRESSED" = "true" ]; then
|
|
|
tar -I "zstd -d -T0" -xf "$FINAL_ARCHIVE" -C "$EXTRACT_DIR"
|