#
# Debian dpkg specific functions.
#
################################################################
#
# Copyright (c) 1995-2014 SUSE Linux Products GmbH
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or 3 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program (see the file COPYING); if not, write to the
# Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
#
################################################################

#
# A wrapper around chroot to set the environment correctly for dpkg and
# pre/postinst scripts.
#
deb_chroot ()
{
    #
    # to workaround some version of fileutils that doesn't do a 'chdir /'
    # when doing a 'chroot /' call lets subshell and change dir manually
    #
    (
	cd $1 &&
	    DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical \
			   DEBCONF_NONINTERACTIVE_SEEN=true \
			   LC_ALL=C LANGUAGE=C LANG=C \
			   chroot $*
    )
}

deb_setup() {
    mkdir -p $BUILD_ROOT/var/lib/dpkg
    mkdir -p $BUILD_ROOT/var/log
    mkdir -p $BUILD_ROOT/etc/default
    :>> $BUILD_ROOT/var/lib/dpkg/status
    :>> $BUILD_ROOT/var/lib/dpkg/available
    :>> $BUILD_ROOT/var/log/dpkg.log
    :>> $BUILD_ROOT/etc/ld.so.conf
    :>> $BUILD_ROOT/etc/default/rcS
}

pkg_initdb_deb() {
    deb_setup
    # force dpkg into database to make epoch test work
    if ! test "$BUILD_ROOT/.init_b_cache/rpms/dpkg.deb" -ef "$BUILD_ROOT/.init_b_cache/dpkg.deb" ; then
	rm -f $BUILD_ROOT/.init_b_cache/dpkg.deb
	cp $BUILD_ROOT/.init_b_cache/rpms/dpkg.deb $BUILD_ROOT/.init_b_cache/dpkg.deb || cleanup_and_exit 1
    fi
    deb_chroot $BUILD_ROOT dpkg --install --force-unsafe-io --force-depends .init_b_cache/dpkg.deb >/dev/null 2>&1
}

pkg_prepare_deb() {
    :
}

pkg_install_deb() {
    ( deb_chroot $BUILD_ROOT dpkg --install --force-unsafe-io --force-depends .init_b_cache/$PKG.deb 2>&1 || touch $BUILD_ROOT/exit ) | \
	perl -ne '$|=1;/^(Configuration file|Installing new config file|Selecting previously deselected|Selecting previously unselected|\(Reading database|Unpacking |Setting up|Creating config file|Preparing to replace dpkg|Preparing to unpack )/||/^$/||print'
    # ugly workaround for upstart system. some packages (procps) try
    # to start a service in their configure phase. As we don't have
    # a running upstart, we just link the start binary to /bin/true
    if test -e "$BUILD_ROOT/sbin/start"; then
	if test "$BUILD_ROOT/sbin/start" -ef "$BUILD_ROOT/sbin/initctl" ; then
	    echo "linking /sbin/start to /bin/true"
	    mv "$BUILD_ROOT/sbin/start" "$BUILD_ROOT/sbin/start.disabled"
	    ln -s "/bin/true" "$BUILD_ROOT/sbin/start"
	fi
    fi
    # another workaround, see bug bnc#733699
    rm -f "$BUILD_ROOT/var/run/init.upgraded"
}

pkg_erase_deb() {
    deb_chroot $BUILD_ROOT dpkg --purge --force-depends $PKG 2>&1 | {
      local retry
      while read line; do
          case "$line" in
              subprocess\ installed\ *script\ returned\ error\ exit\ status*)
                 chroot $BUILD_ROOT rm -f /var/lib/dpkg/info/$PKG.{pre,post}rm
                 retry=1
              ;;
              *) echo "$line" ;;
          esac
      done
      if test -n "$retry"; then
          echo "re-try deleting $PKG without post/pre remove scripts"
          deb_chroot $BUILD_ROOT dpkg --purge --force-depends $PKG 2>&1 || touch $BUILD_ROOT/exit
      fi
    } | perl -ne '$|=1;/^(\(Reading database|Removing |Purging configuration files for )/||/^$/||print'
}

pkg_cumulate_deb() {
    return 1
}

pkg_verify_installed_deb() {
    return 1
}

pkg_finalize_deb() {
    echo "configuring all installed packages..."
    # configure all packages after complete installation, not for each package like rpm does
    # We need to run this twice, because of cyclic dependencies as it does not succeed on most
    # debian based distros in the first attempt.
    if ! deb_chroot $BUILD_ROOT dpkg --configure --pending  2>&1; then
         echo "first configure attempt failed, trying again..."
         deb_chroot $BUILD_ROOT dpkg --configure --pending  2>&1 || cleanup_and_exit 1
    fi
}

pkg_preinstall_deb() {
    ar x "$BUILD_ROOT/.init_b_cache/rpms/$PKG.deb"
    mkdir -p .init_b_cache/scripts/control
    if test -f "control.tar.gz" ; then
    $TAR -C .init_b_cache/scripts/control -z -f control.tar.gz
    elif test -f "control.tar.xz" ; then
    $TAR -C .init_b_cache/scripts/control -J -f control.tar.xz
    fi
    if test -f "data.tar.gz" ; then
	$TAR -z -f data.tar.gz
    elif test -f "data.tar.xz" ; then
	$TAR -J -f data.tar.xz
    fi
    if test -e ".init_b_cache/scripts/$PKG.run" ; then
	test -e .init_b_cache/scripts/control/preinst && mv .init_b_cache/scripts/control/preinst ".init_b_cache/scripts/$PKG.pre"
	test -e .init_b_cache/scripts/control/postinst && mv .init_b_cache/scripts/control/postinst ".init_b_cache/scripts/$PKG.post"
    fi
    rm -rf .init_b_cache/scripts/control control.tar.{g,x}z data.tar.{g,x}z
}

pkg_runscripts_deb() {
    if ! test -e $BUILD_ROOT/var/lib/dpkg/status ; then
	deb_setup
    fi
    if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre" ; then
	echo "running $PKG preinstall script"
	deb_chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.pre" install \
		   < /dev/null
	rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre"
    fi
    if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" ; then
	echo "running $PKG postinstall script"
	deb_chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.post" configure '' \
		   < /dev/null
	rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post"
    fi
}

# Local Variables:
# mode: Shell-script
# End:
