#!/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

usage (){
    cat 1>&2 <<EOF
pkg_refresh_summary - refreshes pkg_summary, that is for each
(PKGPATH,PKGBASE) pair present on input it outputs summaries about
newest packages only.  Duplicated summaries are also removed.

usage: pkg_refresh_summary [OPTIONS] [files...]
OPTIONS:
  -h     display this help message
  -o     output summaries of all package except newest ones
EOF
}

while getopts ho f; do
    case "$f" in
	h)    usage; exit 0;;
	o)    print_older=-v;;
	?)    printf "Run pkg_refresh_summary -h for details\n"; exit 2;;
    esac
done
shift `expr $OPTIND - 1`

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

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
}

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

############################################################
if test $# -eq 0; then
    # copy stdin to temporary file and then use it
    tmp_fn=$tmp_dir/tmp
    cat > "$tmp_fn"
    set -- "$tmp_fn"
fi

newest_fn=$tmp_dir/newest

############################################################
find_newest (){
    runawk -f pkgsrc-dewey.awk -e '
BEGIN {
   FS = "="
}

$1 == "PKGNAME" {
   idx = match($2, /-[^-]*$/)
   pkgbase = substr($2, 1, idx-1)
   pkgver = substr($2, idx+1)

   next
}

$1 == "PKGPATH" {
   pkgpath = $2
   next
}

NF == 0 && pkgpath != "" && pkgbase != "" {
   pair = pkgpath ":" pkgbase

   if (!(pair in pkgbase2ver) ||
      dewey_cmp(pkgbase2ver [pair], pkgver) == "<")
   {
      pkgbase2ver [pair] = pkgver
   }

   pkgpath = pkgbase = ""
}

END {
   for (p in pkgbase2ver){
      pathname = p
      sub(/:/, ",", pathname)

      print pathname "-" pkgbase2ver [p]
   }
}
' "$@"
}

find_newest "$@" > "$newest_fn"

cat "$@" |
pkg_grep_summary $print_older -t strfile PKGPANA "$newest_fn" |
pkg_uniq_summary
