#!/bin/sh
#-*-mode:  sh -*-

# Copyright (c) 2007-2015, Aleksey Cheusov <vle@gmx.net>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * 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 COPYRIGHT HOLDERS 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 COPYRIGHT
# HOLDER 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.

set -e

. pipestatus

LIBEXECDIR=${LIBEXECDIR-/usr/pkg/libexec/psu}
. ${LIBEXECDIR}/sig_handler.sh
on_exit () {
	# Stupid test for stupid Solaris
	if test -n "$tmp_dir"; then rm -rf $tmp_dir; fi
}

############################################################
usage (){
    cat 1>&2 <<EOF
pkg_list_all_pkgs - outputs all packages in pkgsrc tree

usage: pkg_list_all_pkgs [OPTIONS]
OPTIONS:
  -h              display this help message
  -a <subdirs>    add the specified categories
  -d <subdirs>    process only the specified categories
EOF
}

while getopts ha:d: f; do
    case "$f" in
	h)
	    usage
	    exit 0;;
	d)
	    export SPECIFIC_PKGS=1
	    export USER_ADDITIONAL_PKGS="$OPTARG";;
	a)
	    unset SPECIFIC_PKGS || true
	    export USER_ADDITIONAL_PKGS="$OPTARG";;
	?)    printf "Run pkg_list_all_pkgs -h for details\n"; exit 2;;
    esac
done
shift `expr $OPTIND - 1`

############################################################
# user settable variables
if test -z "$PKGSRCDIR"; then
    PKGSRCDIR=/usr/pkgsrc
fi

if test -z "$BMAKE"; then
    BMAKE=/usr/pkg/bin/bmake
fi

############################################################
cd $PKGSRCDIR

tmp_dir=`mktemp -d ${TMPDIR-/tmp}/pkg_list_all_pkgs.XXXXXX`
test -n "$tmp_dir" || exit 1

############################################################
############################################################
#### get all available packages

enrich_Makefile (){
    cat <<EOF
.PHONY: my-show-var
my-show-var:
	@echo \${\${VARNAME}:Q}

.include "./Makefile"
EOF
}

get_SUBDIR (){
    subdir_fn=$tmp_dir/subdirs
    runpipe0 \
	enrich_Makefile '|' \
	${BMAKE} -f - my-show-var VARNAME=SUBDIR > $subdir_fn
    cat $subdir_fn
}

prepand (){
    runawk -v prefix="$1" -e '
{
   for (i=1; i <= NF; ++i)
      print prefix $i
}
'
}

list_all_packages (){
    categories="`get_SUBDIR`"
    for c in $categories; do
	cd "$PKGSRCDIR/$c";
	runpipe0 \
	    get_SUBDIR '|' \
	    prepand "$c/"
    done
}

list_all_packages
