#!/usr/pkg/bin/runawk

# Copyright (c) 2010-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.

#.begin-str help
# direct_deps - takes summaries on input and a list of already
# processed packages and outputs enriched PKGPATHs for direct
# dependencies (either DEPENDS or BUILD_DEPENDS or both) provided that
# they are not listed in "processed packages". Output PKGPATHs
# contain the value of _INHER_ASSIGNS from input summary if it is present.
#
# Usage: direct_deps [OPTIONS] [files...]
# OPTIONS:
#    -h               display this screen
#    -d               generate summary for dependancies (DEPENDS)
#    -D               generate summary for build dependancies (BUILD_DEPENDS)
#    -t               generate summary for build dependancies (TOOL_DEPENDS)
#    -b               generate summary for build dependancies (BOOTSTRAP_DEPENDS)
#    =p <filename>    already processed packages
#.end-str

#env "LC_ALL=C"

#use "alt_assert.awk"
#use "xgetline.awk"
#use "braceexpand.awk"
#use "power_getopt.awk"

BEGIN {
	if (getarg("h")){
		print_help()
		exitnow(0)
	}

	with_dep          = getarg("d")
	with_bdep         = getarg("D")
	with_tdep         = getarg("t")
	with_Bdep         = getarg("b")
	processed_pkgs_fn = getarg("p")

	assert(processed_pkgs_fn != "")

	while (xgetline0(processed_pkgs_fn)){
	    processed_pkgs [$0] = 1
	}
}

/^PKGPATH=/ {
	pkgpath = substr($0, 9)
	next
}

/^ASSIGNMENTS=/ {
	assigns = substr($0, 13)
	next
}

/^_INHER_ASSIGNS=/ {
	inher_assigns = ":" substr($0, 16)
	next
}

NF == 0 {
	if (assigns != "")
		pkgpath = pkgpath ":" assigns

	pkgpaths [pkgpath] = 1

	inher_assigns = assigns = pkgpath = ""
	next
}

(with_dep && /^DEPENDS=/) || (with_bdep && /^BUILD_DEPENDS=/) || (with_tdep && /^TOOL_DEPENDS=/) \
 || (with_Bdep && /^BOOTSTRAP_DEPENDS=/) {
	sub(/^[^=]*=/, "")
	for (i=1; i <= NF; ++i){
		if ($i ~ /[{]/){
			$i = braceexpand($i)
			sub(/ .*$/, "", $i)
		}
		gsub(/[^ ]*:[.][.]\/[.][.]\//, "", $i)
		sub(/\/+$/, "", $i)
		depends [$i inher_assigns] = 1
	}
	next
}

END {
	for (d in depends){
		if (! (d in pkgpaths) && ! (d in processed_pkgs)){
			print d
		}
	}
}
