#!/bin/sh
#
# sbopkg+
# 2015-06-22
# by Gernot Walzl
#
# Adds dependency resolution to sbopkg.

. /etc/sbopkg/sbopkg.conf
SBODIR="$REPO_ROOT/$REPO_NAME/$REPO_BRANCH"
SBOPKG="/usr/sbin/sbopkg"
PKGDIR="/var/log/packages"
PAGER=${PAGER:-"/usr/bin/less"}

get_slackbuild () {
  local PKG=$1
  grep -A 9 "^SLACKBUILD NAME: ${PKG}\$" "$SBODIR/SLACKBUILDS.TXT"
}

get_requires () {
  local PKG=$1
  get_slackbuild $PKG | grep 'REQUIRES:' \
    | cut -d' ' -f 3- | sed 's/[ ]*%README%[ ]*//'
}

get_requires_rec () {
  local PKG=$1
  local REQUIRE
  for REQUIRE in $(get_requires $PKG); do
    get_requires_rec $REQUIRE
    echo "$REQUIRE"
  done
}

get_full_pkg_name () {
  local PKG=$1
  local PKG_FULL=$(cd $PKGDIR; ls -rv ${PKG}-* 2> /dev/null \
    | grep -e "^${PKG}-[^-]\+-[^-]\+-[^-]\+\$" -m 1)
  if [ -z "$PKG_FULL" ]; then
    return 1
  fi
  echo "$PKG_FULL"
}

filter_installed () {
  while read LINE; do
    if [ -z "$(get_full_pkg_name $LINE)" ]; then
      echo "$LINE"
    fi
  done
}

requires_readme () {
  local PKG=$1
  local SLKBLD=$(get_slackbuild $PKG)
  if echo "$SLKBLD" | grep 'REQUIRES:' | grep -q '%README%'; then
    local LOCATION=$(echo "$SLKBLD" | grep 'LOCATION:' | cut -d' ' -f 3-)
    $PAGER "$SBODIR/$LOCATION/README"
  fi
}

if [ \( "$1" = "-i" -o "$1" = "-b" \) -a ! -z "$2" ]; then
  PKGS=""
  for PACKAGE in $2; do
    if grep -q "^SLACKBUILD NAME: ${PACKAGE}\$" "$SBODIR/SLACKBUILDS.TXT"; then
      for REQUIRE in $(get_requires_rec $PACKAGE | filter_installed); do
        if [ -z "$PKGS" ]; then
          PKGS="$REQUIRE"
        else
          PKGS="$PKGS $REQUIRE"
        fi
      done
    fi
  done
  for PACKAGE in $PKGS $2; do
    requires_readme $PACKAGE
  done
  if [ ! -z "$PKGS" ]; then
    echo "sbopkg -i \"${PKGS}\" -k"
    $SBOPKG -i "$PKGS" -k
  fi
fi
$SBOPKG "$@"
