#!/bin/bash

. ../init.sh || exit 1

set -e

unset CONFIG_PROTECT CONFIG_PROTECT_MASK EPREFIX

export QMERGE=1
export PKGDIR=${as}/packages
export FEATURES='config-protect-if-modified'

mktmpdir

export ROOT=${PWD}/root
export PORTAGE_TMPDIR=${PWD}
export Q_VDB=/var/db/pkg

mkdir -p "${ROOT}/var/db/pkg"

set +e

# sanity check on environment
q -Cev

# Do a merge into an empty tree.

out=$(yes | qmerge -F qmerge-test)
tend $? "qmerge-test: [N] basic merge" || die "${out}"

[[ ${out} != *"FAIL"* ]]
tend $? "qmerge-test: [N] no FAIL messages" || die "${out}"

order=$(echo "${out}" | awk '$1 == ">>>" && $2 ~ /^pkg_/ { printf "%s ", $NF }')
[[ ${order} == "pkg_pretend pkg_setup pkg_preinst pkg_postinst " ]]
tend $? "qmerge-test: [N] pkg_* order of execution" || die "$(printf '%s\n' "${order}" "${out}")"

ls -d "${ROOT}"/var/db/pkg/sys-devel/qmerge-test-* >/dev/null
tend $? "qmerge-test: [N] vdb installed"

[[ -x ${ROOT}/usr/bin/qmerge-test && \
   -f ${ROOT}/etc/some.conf && \
   -f ${ROOT}/etc/another.conf ]]
tend $? "qmerge-test: [N] installed expected files" || die "$(treedir "${ROOT}")"

# Now do a re-emerge.

out=$(yes | qmerge -F qmerge-test)
tend $? "qmerge-test: [R] re-emerge" || die "${out}"

[[ -x ${ROOT}/usr/bin/qmerge-test ]]
tend $? "qmerge-test: [R] installed expected files" || die "$(treedir "${ROOT}")"

order=$(echo "${out}" | awk '$1 == ">>>" && $2 ~ /^pkg_/ { printf "%s ", $NF }')
[[ ${order} == "pkg_pretend pkg_setup pkg_preinst pkg_postinst " ]]
tend $? "qmerge-test: [R] pkg_* order of execution" || die "$(printf '%s\n' "${order}" "${out}")"

[[ -x ${ROOT}/usr/bin/qmerge-test && \
   -f ${ROOT}/etc/some.conf && \
   -f ${ROOT}/etc/another.conf && \
   -f ${ROOT}/etc/._cfg0000_some.conf ]]
tend $? "qmerge-test: [R] re-installed expected files" || die "$(treedir "${ROOT}")"

# Finally do an unmerge.

echo alkdsjfalksdf > "${ROOT}/etc/some.conf"

rm -f "${ROOT}/etc/._cfg0000_some.conf"
out=$(yes | qmerge -FU qmerge-test)
tend $? "qmerge-test: [C] uninstall" || die "${out}"

order=$(echo "${out}" | awk '$1 == ">>>" { printf "%s ", $NF }')
[[ ${order} == "pkg_prerm pkg_postrm " ]]
tend $? "qmerge-test: [C] pkg_* order of execution" || die "$(printf '%s\n' "${order}" "${out}")"

[[ ! -x ${ROOT}/usr/bin/qmerge-test && \
     -f ${ROOT}/etc/some.conf && \
   ! -f ${ROOT}/etc/another.conf && \
   ! -d ${ROOT}/var/db/pkg/sys-devel ]]
tend $? "qmerge-test: [C] uninstalled expected files" || die "$(treedir "${ROOT}")"

# cleanup
rm -Rf "${ROOT}"/etc

# check if INSTALL_MASK is applied well
export INSTALL_MASK="/etc"
out=$(yes | qmerge -F qmerge-test)
tend $? "qmerge-test: [M] install no /etc" || die "${out}"
[[ ! -e ${ROOT}/etc ]]
tend $? "qmerge-test: [M] found no /etc" || die "$(treedir "${ROOT}")"

out=$(yes | qmerge -FU qmerge-test)
tend $? "qmerge-test: [M] uninstall" || die "${out}"
[[ ! -e ${ROOT}/etc ]]
tend $? "qmerge-test: [M] /etc removed" || die "$(treedir "${ROOT}")"

export INSTALL_MASK="/etc -/etc/some.conf"
out=$(yes | qmerge -F qmerge-test)
tend $? "qmerge-test: [M] install only /etc/some.conf" || die "${out}"
[[ ! -e ${ROOT}/etc/another.conf ]]
tend $? "qmerge-test: [M] found /etc/another.conf" || die "$(treedir "${ROOT}")"

out=$(yes | qmerge -FU qmerge-test)
tend $? "qmerge-test: [M] uninstall" || die "${out}"
[[ ! -e ${ROOT}/etc ]]
tend $? "qmerge-test: [M] /etc removed" || die "$(treedir "${ROOT}")"

export INSTALL_MASK="/usr -/usr/bin/dummy"
out=$(yes | qmerge -F qmerge-test)
tend $? "qmerge-test: [M] install only /usr/bin/dummy" || die "${out}"
[[ -e ${ROOT}/usr/bin/dummy ]]
tend $? "qmerge-test: [M] found /usr/bin/dummy" || die "$(treedir "${ROOT}")"
[[ ! -e ${ROOT}/usr/bin/qmerge-test ]]
tend $? "qmerge-test: [M] /usr/bin/qmerge-test absent" || die "$(treedir "${ROOT}")"

out=$(yes | qmerge -FU qmerge-test)
tend $? "qmerge-test: [M] uninstall" || die "${out}"
[[ ! -e ${ROOT}/usr/bin/dummy ]]
tend $? "qmerge-test: [M] /usr/bin/dummy removed" || die "$(treedir "${ROOT}")"

export INSTALL_MASK="/usr -/usr/bin /usr/bin/dummy"
out=$(yes | qmerge -F qmerge-test)
tend $? "qmerge-test: [M] install except /usr/bin/dummy" || die "${out}"
[[ ! -e ${ROOT}/usr/bin/dummy ]]
tend $? "qmerge-test: [M] found no /usr/bin/dummy" || die "$(treedir "${ROOT}")"
[[ -e ${ROOT}/usr/bin/qmerge-test ]]
tend $? "qmerge-test: [M] found /usr/bin/qmerge-test" || die "$(treedir "${ROOT}")"

out=$(yes | qmerge -FU qmerge-test)
tend $? "qmerge-test: [M] uninstall" || die "${out}"
[[ ! -e ${ROOT}/usr/bin/qmerge-test ]]
tend $? "qmerge-test: [M] /usr/bin/qmerge-test removed" || die "$(treedir "${ROOT}")"
set -e

cleantmpdir

end
