#! /bin/bash
# common modules for pbuilder.
#   pbuilder -- personal Debian package builder
#   Copyright (C) 2001,2002 Junichi Uekawa
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   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; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

function showhelp () {
    cat <<EOF
pbuilder - a personal builder
Copyright 2001,2002 Junichi Uekawa
Distributed under GNU Public License version 2 or later

pbuilder [operation] [operation options]
pdebuild [operation options]

command lines:
pbuilder create [--basetgz base.tgz-path] [--distribution woody|sid]
  Creates a base.tgz

pbuilder update [--basetgz base.tgz-path] [--distribution woody|sid]
  Updates a base.tgz

pbuilder build [--basetgz base.tgz-path] pbuilder_2.2.0-1.dsc
  Builds using the base.tgz. Requires a .dsc filename

pbuilder clean
  Cleans the temporal build directory.

pbuilder login
  Logs in to the build environment

Operation Options:
pbuilder options
 --basetgz [base.tgz location]
 --buildplace [location of build]
 --mirror [mirror location]
 --nonusmirror [non-US mirror location]
 --othermirror [other mirror location in apt deb-line format, delimited with | signs]
 --http-proxy [proxy]
 --distribution [distribution(potato/woody/sid)]
 --buildresult [location-to-copy-build-result]
 --removepackages [packages-to-remove on pbuilder create]
 --extrapackages [packages-to-add on pbuilder create]
 --configfile [configuration file to load]
 --hookdir [hook directory]
 --debemail [mail address]
 --debbuildopts [dpkg-buildpackage options]
 --logfile [filename to output log]
 --aptconfdir [overriding apt config dir]

pdebuild options
 --pbuilderroot [command to obtain root privilege for pbuilder] 
 --buildsourceroot [command to obtain root privilege for dpkg-buildpackage]
EOF
    exit 1
}

function umountproc () {
    if [ "$USEPROC" = "yes" ]; then
	echo " -> unmounting /proc filesystem"
	if ! umount "$BUILDPLACE/proc"; then
	    echo "W: Retrying to unmount proc"
	    sleep 5s
	    while ! umount "$BUILDPLACE/proc"; do
		sleep 5s
		cat <<EOF

  Could not unmount /proc, there might be some program 
  still using files in /proc (klogd?).
  Please check and kill it so that I can unmount /proc

EOF
		chroot "$BUILDPLACE" bin/sh
	    done
	fi
    fi
}

function mountproc () {
    if [ "$USEPROC" = "yes" ]; then
	echo " -> mounting /proc filesystem"
	mkdir -p $BUILDPLACE/proc
	mount -t proc /proc "$BUILDPLACE/proc"
    fi
}

function cleanbuildplace () {
    if [ -d "$BUILDPLACE" ]; then 
	echo " -> cleaning the build env "
	rm -rf "$BUILDPLACE"
    fi;
}

function umountproc_cleanbuildplace () {
    # rolling back to abort.
    umountproc
    cleanbuildplace
}

function installaptlines (){
    echo "  -> Installing apt-lines"
    rm -f "$BUILDPLACE"/etc/apt/sources.list
    if [ -z "$DISTRIBUTION" ]; then
	echo "Distribution not specified, please specify" >&2
	exit 1
    fi
    if [ -n "$OTHERMIRROR" ]; then 
	echo "$OTHERMIRROR" | tr "|" "\n" >> "$BUILDPLACE"/etc/apt/sources.list 
    fi
    if [ -n "$MIRRORSITE" ] ; then
	cat >> "$BUILDPLACE"/etc/apt/sources.list << EOF
deb $MIRRORSITE $DISTRIBUTION main contrib non-free
#deb-src $MIRRORSITE $DISTRIBUTION main contrib non-free
EOF
    fi
    if [ -n "$NONUSMIRRORSITE" ]; then 
	cat  >> "$BUILDPLACE"/etc/apt/sources.list << EOF
deb $NONUSMIRRORSITE $DISTRIBUTION/non-US main contrib non-free
#deb-src $NONUSMIRRORSITE $DISTRIBUTION/non-US main contrib non-free
EOF
    fi
    if [ -n "$APTCONFDIR" ]; then
	echo "  -> Copy " "$APTCONFDIR"/* " to chroot"
	cp -a "$APTCONFDIR/"* "$BUILDPLACE"/etc/apt
    fi
}

function extractbuildplace () {
    # after calling this function, umountproc, and cleanbuildplace
    # needs to be called. Please trap it.
    cleanbuildplace
    echo "Building the build Environment"
    echo " -> extracting base.tgz"
    if ! mkdir -p "$BUILDPLACE"; then
	echo "E: failed to build the directory to chroot"
	exit 1
    fi
    if [ ! -f "$BASETGZ" ]; then
	echo "E: failed to find $BASETGZ, have you done <pbuilder create> to create your base tarball yet?"
	exit 1
    fi
    if ! (cd "$BUILDPLACE" && tar xfzp "$BASETGZ"); then
	echo "E: failed to extract $BASETGZ to $BUILDPLACE"
	exit 1
    fi
    mountproc
    mkdir -p "$BUILDPLACE/tmp/buildd"
    echo " -> copying/creating local configuration"
    for a in hosts hostname resolv.conf; do 
	cp /etc/$a "$BUILDPLACE/etc/$a";
    done
    hostname -f > "$BUILDPLACE/etc/mailname"
    
    if [ -n "$DISTRIBUTION" ]; then
	installaptlines
    fi
}


function recover_aptcache() {
    # recover the aptcache archive
    if [ -n "$APTCACHE" ]; then
	echo "Obtaining the cached apt archive contents"
	if ls "$APTCACHE"/*.deb > /dev/null 2> /dev/null ; then
	    if [ "$APTCACHEHARDLINK" = "yes" ]; then
		ln "$APTCACHE"/*.deb "$BUILDPLACE/var/cache/apt/archives/" || true
	    else
		cp "$APTCACHE"/*.deb "$BUILDPLACE/var/cache/apt/archives/" || true
	    fi
	else
	    echo "W: No cache contents yet."
	fi
    fi
}

function save_aptcache() {
    # save the current aptcache archive
    if [ -n "$APTCACHE" ]; then
	echo "Copying back the cached apt archive contents"
	mkdir -p "$APTCACHE" ;
	for A in "$BUILDPLACE/var/cache/apt/archives/"*.deb; do
	    if [ ! -f "$APTCACHE/"$(basename "$A") -a -f "$A" ]; then
		echo " -> new cache content "$(basename "$A")" added"
		if [ "$APTCACHEHARDLINK" = "yes" ]; then
		    ln "$A" "$APTCACHE/" || true
		else
		    cp "$A" "$APTCACHE/" || true
		fi
	    fi
	done
    fi
}

#required for some packages to install...
export LANG=C
export LC_ALL=C
