#!/bin/sh

# XXX for some reason rpm5 does not create its database correctly if running as ordinary user:
#  $ rpm --root /tmp/root --initdb
#  $ rpm --root /tmp/root -ivh --justdb foo-1-1.noarch.rpm
#  rpmdb: BDB0577 The primary and secondary must be opened in the same environment
#  error: db3associate:db3.c:1674: db->associate(22): Invalid argument
#  BDB0624 DBcursor->pget may only be used on secondary indices
#  error: db3cpget:db3.c:1537: dbcursor->pget(22): Invalid argument
#  error: error(22) getting keys from Triggername index
#
# ...and fakeroot does not help with above

SUDO=
rpm --version | grep -Pq '\s+5.'
if [ $? -eq 0 ]; then
    SUDO="sudo"
    [ $(id -u) = "0" ] && SUDO=""
fi

rpm_up() {
    if [ -n "$SUDO" ]; then
        # skip testing if no sudo configured
        $SUDO -n /bin/rpm --version >/dev/null 2>/dev/null
        local ec=$?
        [ $ec -eq 0 ] || exit 0

        $SUDO -n /bin/rm --version >/dev/null 2>/dev/null
        local ec=$?
        [ $ec -eq 0 ] || exit 0
    fi

    [ -z "$ORIGREPO" ] && ORIGREPO=$REPO
    [ -z "$ORIGREPO" ] && fail "empty REPO env variable"

    REPO="$ORIGREPO/src"
    DESTINATION_REPO="$ORIGREPO-rpm";

    $SUDO rm -rf $DESTINATION_REPO
    rm -rf $ORIGREPO/*
    rm -rf $REPO $DESTINATION_REPO

    mkdir -p $REPO || fail "mkdir $REPO failed"
    mkdir -p $DESTINATION_REPO || fail "mkdir $DESTINATION_REPO failed"

    mkdir -p $DESTINATION_REPO || fail "mkdir $DESTINATION_REPO failed"
    RPM="$SUDO rpm --root $DESTINATION_REPO"
    $RPM --initdb

    RAW_POLDEK="$POLDEK_NOCONF -Ouse_sudo=n -Odependency_solver=$DEPENDENCY_SOLVER -Oupgrade_multiple_instances=y --noask"
    POLDEK_INSTALL="$RAW_POLDEK --st dir -s $REPO --root $DESTINATION_REPO --justdb"
}

rpm_down() {
    [ -n "$DESTINATION_REPO" ] && $SUDO rm -rf $DESTINATION_REPO
}

rpm_build_installed() {
    mkdir -p $DESTINATION_REPO/RPMS/
    rm -f $DESTINATION_REPO/RPMS/*.rpm
    build_package $DESTINATION_REPO/RPMS/ $@
    $RPM -iv --quiet --justdb $DESTINATION_REPO/RPMS/*.rpm
    #echo $RPM --quiet -q $BUILT_PACKAGE_NVR
    $RPM --quiet -q $BUILT_PACKAGE_NVR
    [ $? -eq 0 ] || fail "$BUILT_PACKAGE_NVR: rpm installation failed"
}

rpm_install() {
  typeset package="$1"
  typeset expected="$2"
  typeset rm_expected=${3:-""}

  [ -n "$expected" ] && expected=$(echo $expected | sed 's/,/ /g')

  e_rm_expected="non-existing-package"
  [ -n "$rm_expected" ] && e_rm_expected=$(echo $rm_expected | sed 's/,/|/g')
  [ -n "$rm_expected" ] && rm_expected=$(echo $rm_expected | sed 's/,/ /g')

  state=$($RPM -qa | sort | perl -pe "s|\n| |g")
  new_state=$($RPM -qa | sort | grep -Pv "($e_rm_expected)" | perl -pe "s|\n| |g")

  if is_verbose_mode; then
      msg "Current state: $state"
      msg "Expected state: $new_state"
  fi

  try_install_package "rpm" -uv $@

  RPMQ="$RPM --quiet -q"

  for i in $rm_expected; do
      #msg "rm  $i"
      $RPMQ $i && fail "$i: package expected to be removed"
  done

  for i in $expected; do
      #msg "new $i"
      $RPMQ $i || fail "$i: package expected to be installed"
      #[ $? -eq 0 ] || fail "$i: package expected to be installed"
  done

  for i in $new_state; do
      #msg "kept  $i"
      $RPMQ $i || fail "$i: package expected to be kept"
  done
}

rpm_state_check() {
    typeset expected="$1"
    typeset unexpected=${2:-""}

    [ -n "$expected" ] && expected=$(echo $expected | sed 's/,/ /g')
    [ -n "$unexpected" ] && unexpected=$(echo $unexpected | sed 's/,/ /g')

    RPMQ="$RPM -qa"
    for i in $expected; do
        $RPMQ | grep -qE "^$i-"
        [ $? -eq 0 ] || fail "$i: package expected to be installed"
    done

    for i in $unexpected; do
        $RPMQ | grep -Eq "^$i-"
        [ $? -eq 0 ] && fail "$i: package expected to not to be installed"
    done

    return 0
}
