#!/usr/pkg/bin/runawk

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

############################################################

#env "LC_ALL=C"

#use "alt_getopt.awk"
#use "abort.awk"
#use "xgetline.awk"
#use "xclose.awk"
#use "min.awk"
#use "power_getopt.awk"

############################################################
#.begin-str help
# pkg_summary2bb_pkgs - extracts summaries for packages
#   ready for bulk build (bb in the script name).
#   That is, summaries for packages with not empty ASSIGNMENTS
#   are removed if their PKGNAME (binary package basename) do not depend
#   on ASSIGNMENTS.
#   Input summary must be pkg_uniq_summary'ed!
#   Duplications on input are not allowed
# usage: pkg_summary2bb_pkgs -h
#       pkg_summary2bb_pkgs [OPTIONS] file1 [file2...]
# OPTIONS:
#   -h        display this help
#.end-str
############################################################

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

	if (ARGC ==1 && ARGV [1] == "-"){
		print "At least one file is expected as an argument" > "/dev/stderr"
		exitnow(1)
	}

	# find problematic packages
	for (i=1; i < ARGC; ++i){
		if (ARGV [i] == "") continue

		while (xgetline0(ARGV [i])){
			if ($0 ~ /^PKGNAME=/){
				pkgname = substr($0, 9)
				++conflicts [pkgname]
			}else if ($0 ~ /^ASSIGNMENTS=/){
				assigns = substr($0, 13)
			}else if (match($0, /^PKGPATH=.*:/)) {
				assigns = substr($0, RLENGTH+1)
#				update()
			}else if (NF == 0){
				commas = assigns != "" ? 1+gsub(/,/, "", assigns) : 0
				if (pkgname in cnt)
					cnt [pkgname] = min(cnt [pkgname] + 0, commas + 0)
				else
					cnt [pkgname] = commas

				assigns = pkgname = ""
			}
		}

		xclose(ARGV [i])
	}

	# init
	pkgname = assigns = ""
	good_pkg = 0 # -1|0|1 - bad|unknown|good
	count = 0
}

function print_lines (){
	for (i=0; i < count; ++i){
		print lines [i]
	}
	count    = 0
}

NF == 0 {
	if (good_pkg == 0){
		assert(assigns == "")
		good_pkg = 1
	}
	if (good_pkg == 1){
		print_lines()
		print ""
	}

	pkgname = assigns = ""
	good_pkg = 0
	count    = 0
	next
}

good_pkg == 1 {
	print $0
	next
}

good_pkg == -1 {
	next
}

{
	lines [count++] = $0
}

function update (){
	if (pkgname == ""){
		return
	}

	if (conflicts [pkgname] < 2){
		print_lines()
		good_pkg = 1
		return
	}

	if (assigns == ""){
		return
	}

	if (gsub(/,/, "", assigns)+1 == cnt [pkgname]){
		print_lines()
		good_pkg = 1
		cnt [pkgname] = -1
		return
	}

	good_pkg = -1
	count = 0
}

$0 ~ /^PKGNAME=/ {
	pkgname = substr($0, 9)
	update()

	next
}

$0 ~ /^ASSIGNMENTS=/ {
	assigns = substr($0, 13)
	update()

	next
}

match($0, /^PKGPATH=.*:/) {
	assigns = substr($0, RLENGTH+1)
	update()

	next
}
