#!/bin/bash

# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)

. ./config/options ""

MD5SUM="$(echo ${BUILD} | md5sum | awk '{ print $1 }')"
RESTART_FILE=/tmp/checkunpack.progress.${MD5SUM}

usage() {
  cat <<EOF
Usage: $0 [-f "regex"] [-c] [-v] [-S] [-h]

  -f regex    Filter based on regex, eg. -f "RTL.*|^kodi-" would match all
              Realtek drivers and any package beginning with kodi-.
              Using a filter ignores any existing progress file.
  -c          Remove restartable progress file at beginning of this run
  -v          Verbose output, view failed output from scripts/unpack
  -S          Display skipped/ignored packages
  -h          This help message

By default previously processed packages that unpacked successfully will be skipped,
unless their stamp has been subsequently modified. Use -c to ignore any previous
progress, and (re-)process every package again.

Current progress file: ${RESTART_FILE}
EOF
  exit
}

FILTER="."
RMPROGRESS="no"
VERBOSE="no"
SHOW_SKIPPED="no"
USING_FILTER="no"

while getopts "f:cvSh" opt; do
  case ${opt} in
    f)
      FILTER="${OPTARG}"
      USING_FILTER="yes"
      ;;
    c)
      RMPROGRESS="yes"
      ;;
    v)
      VERBOSE="yes"
      ;;
    S)
      SHOW_SKIPPED="yes"
      ;;
    h)
      usage
      ;;
    *)
      usage
      ;;
  esac
done

TMP_FILE=$(mktemp)
trap "rm -f ${TMP_FILE}" EXIT

[ "${RMPROGRESS}" = "yes" ] && rm -f "${RESTART_FILE}"

TXRED="$(tput setaf 1 bold)"
TXGREEN="$(tput setaf 2 bold)"
TXRESET="$(tput sgr0)"

SKIPPED="$(cut -d' ' -f1 ${RESTART_FILE} 2>/dev/null | sort -u | wc -l || true)"
[ "${USING_FILTER}" = "no" -a "${SKIPPED:-0}" -ne 0 ] && echo -e "WARNING: skipping ${SKIPPED} packages.\n" >&2

for pkg_name in $(get_all_package_names | grep -E "${FILTER}"); do
  stamp=$(
    source_package ${pkg_name}
    calculate_stamp
  )
  if [ -z "${stamp}" ]; then
    [ "${SHOW_SKIPPED}" = "yes" ] && printf "Checking: %-40s IGNORED\n" "${pkg_name}"
    continue
  fi

  if [ "${USING_FILTER}" = "no" ] && grep -qE "^${pkg_name} ${stamp}$" ${RESTART_FILE} 2>/dev/null; then
    [ "${SHOW_SKIPPED}" = "yes" ] && printf "Checking: %-40s SKIPPED\n" "${pkg_name}"
    continue
  fi

  printf "Checking: %-40s" "${pkg_name}"

  rm -rf "${BUILD}/"* ${BUILD}/.unpack

  OUTPUT="$(scripts/unpack "${pkg_name}" 2>&1)" && res=0 || res=1

  if [ ${res} -eq 0 ]; then
    echo " ${TXGREEN}OK${TXRESET}"
    [ "${USING_FILTER}" = "no" ] && echo "${pkg_name} ${stamp}" >>${RESTART_FILE}
  else
    echo " ${TXRED}FAILED${TXRESET}"
    echo "${pkg_name}" >>${TMP_FILE}
    [ "${VERBOSE}" = "yes" -a -n "${OUTPUT}" ] && echo "${OUTPUT}"
  fi
  rm -rf "${BUILD}/"* ${BUILD}/.unpack
done

if [ -s "${TMP_FILE}" ]; then
  echo
  echo "The following packages failed to unpack:"
  cat ${TMP_FILE}
  exit 1
fi