#!/bin/sh
# $NetBSD: mkdatabase,v 1.4 2003/05/06 17:42:05 jmmv Exp $
#
# Script for generating a database with complete dependency information
# for a particular package
#
# Copyright (c) 2003 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Dan McMahill.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
#    must display the following acknowledgement:
#        This product includes software developed by the NetBSD
#        Foundation, Inc. and its contributors.
# 4. Neither the name of The NetBSD Foundation nor the names of its
#    contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#


TMPDIR=${TMPDIR:-/tmp}
BMAKE=${BMAKE:-make}
AWK=${AWK:-/usr/bin/awk}
DATABASE=${DATABASE:-${TMPDIR}/pkgdb.$$}
EXPR=${EXPR:-expr}

# as of 2003-01-04, metapkgs/gnome gets to pass #6 so
# it is very likely that if you reach 25, something is broken
MAX_PASS=${MAX_PASS:-25}

prog=$0

usage(){
    echo "$prog - Generates a complete dependency tree for a particular package"
    echo "Usage:      $prog [-a|--append] [-d|--debug] [-f|--database database]"
    echo " "
    echo "            $prog -h|--help"
    echo " "
    echo "            $prog -v|--version"
    echo " "
    echo "The options supported by $prog are: "
    echo " "
    echo "  -a|--append           Append to the database rather than overwriting it"
    echo " "
    echo "  -d|--debug            Enables debugging output"
    echo " "
    echo "  -f|--database <file>  Writes the database into file specified by <file>"
    echo " "
    echo "  -h|--help             Displays this help message"
    echo " "
    echo "  -v|--version          Displays the version of this script and exits."
    echo " "
    echo "Example:    cd /usr/pkgsrc/graphics/gimp && $prog -d /tmp/gimp_database"
    echo " "
}

clean_and_exit(){
    exit 1
}


######################################################################
#
#  Handle command line options
#
######################################################################

DEBUG=
append=no

while
    test -n "$1"
do
    case "$1"
    in

    # Append to the database
    -a|--append)
	append=yes
	shift
	;;

    # Turn on debugging
    -d|--debug)
	DEBUG=yes
	shift
	;;

    # Use the specified database file
    -f|--database)
	DATABASE=$2
	shift 2
	;;

    # Help
    -h|--help)
	usage
	exit 0
	;;

    # Version
    -v|--version)
	${AWK} '/^#[ \t]*\$NetBSD/ {gsub(/,v/,"",$3);printf("%s:  Version %s, %s\n",$3,$4,$5); exit 0;}' $prog
	exit 0
        ;;

    -*) echo "$prog:  ERROR:  $1 is not a valid option"
	usage
	clean_and_exit
	;;

    *) 
	break
	;;

    esac
done

if [ "x$DEBUG" = "xyes" ]; then
    set -v
fi

if [ ! -d $TMPDIR ]; then
	mkdir -p $TMPDIR
fi

prompt="----> "

case ${DATABASE} in
    /*)
	# we already have the absolute path to the database file
	# so do nothing
	;;

    *)
	# make sure we have the full path to the database file
	DATABASE=`pwd`/${DATABASE}
	;;
esac


if [ "X$append" = "Xyes" ]; then
    echo "$prompt Appending to database in ${DATABASE}"
    if [ ! -f ${DATABASE} ]; then
	touch ${DATABASE}
    fi
    # make sure we haven't already been listed before
    # appending ourselves.
    here=`pwd`
    tmp1=`dirname $here`
    pkgcat=`basename $tmp1`
    pkg=`basename $here`
    pkgpath=$pkgcat/$pkg
    if [ "x$DEBUG" = "xyes" ]; then
	echo "Looking for $pkgpath before appending"
    fi
    if grep "^index $pkgpath " ${DATABASE} >/dev/null 2>&1 ; then
	echo "$prompt $pkgpath has already been depended.  Skipping..."
	exit 0
    else
	${BMAKE} print-summary-data >> ${DATABASE} || exit 1
    fi
else
    echo "$prompt Creating new database in ${DATABASE}"
    ${BMAKE} print-summary-data > ${DATABASE} || exit 1
fi
here=`pwd`
echo "$prompt Depending in $here (pass #1)"
dirs=`${AWK} -f ../../mk/scripts/chkdatabase.awk debug=${DEBUG} ${DATABASE}`
pass=2
while [ ! -z "$dirs" -a $pass -lt ${MAX_PASS} ]; do
	for d in $dirs ; do
		echo "$prompt Depending in ../../$d (pass #$pass)" ;\
		cd ../../$d && ${BMAKE} print-summary-data >> ${DATABASE} || exit 1
		cd $here
	done
	dirs=`${AWK} -f ../../mk/scripts/chkdatabase.awk debug=${DEBUG} ${DATABASE}`
	pass=`${EXPR} $pass + 1`
done

if [ $pass -eq ${MAX_PASS} ]; then
	echo "ERROR:  You have reached $pass times through the dependency tree"
	echo "        and _still_ not finished.  This is probably due to a broken"
	echo "        set of dependencies.  You may wish to examine the partial"
	echo "        database left in ${DATABASE}"
	exit 1
else
	echo "Complete dependency database left in ${DATABASE}"
fi

