#!/bin/sh
# $NetBSD: mkdatabase,v 1.11 2018/08/22 20:48:37 maya 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.
#
# 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.
#

#
# Global variables, based on environment variables
#

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}

#
# Global variables
#

prog=$0
append_flag=no
debug_flag=""		# meaning "no"

#
# Helper functions
#

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 ""
}

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

while test $# -gt 0; do
    case $1 in

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

    # Turn on debugging
    -d|--debug)
	debug_flag=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
	exit 1
	;;
    esac
done

case $debug_flag in
yes)	set -v;;
esac

if [ ! -d "$TMPDIR" ]; then
	# FIXME: wouldn't it be better to fail in this case?
	mkdir -p "$TMPDIR"
fi

prompt="----> "

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

    *)
	# FIXME: wouldn't it be better to fail in this case?

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


here=`pwd`
tmp1=`dirname "$here"`
pkgcat=`basename "$tmp1"`
pkg=`basename "$here"`
pkgpath=$pkgcat/$pkg
if [ $append_flag = yes ]; 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.
    case $debug_flag in
    yes)	echo "Looking for $pkgpath before appending";;
    esac
    # FIXME: $pkgpath may contain special regex characters.
    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}"
    o=`${BMAKE} show-options | ${AWK} -f ../../mk/scripts/htmloptions.awk`
    echo "htmloptions ${pkgpath} $o" > ${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_flag} "${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_flag} ${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
