pkgsrc-wip/pkg_summary-utils/files/pkg_update_src_summary.in
2011-07-29 20:33:56 +00:00

198 lines
4.9 KiB
Bash
Executable file

#!@SH@
#-*-mode: sh -*-
# Copyright (c) 2007-2010, 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
############################################################
# user settable variables
PKGSRCDIR=${PKGSRCDIR:=@PKGSRCDIR@}
BMAKE=${BMAKE:=@BMAKE@}
############################################################
usage (){
cat 1>&2 <<EOF
pkg_update_src_summary - incrementally updates
package summary from pkgsrc/ tree (pkg_summary(5) format)
usage: pkg_update_src_summary [OPTIONS] summary_file
OPTIONS:
-h display this help message
-f <filename> obtain package names from
a specified file, - for stdin
-i <fields> list of fields (separated by space character
or comma) to be included to the summary,
full summary is generated by default
EOF
}
pkgs_fn=''
while getopts hf:i: f; do
case "$f" in
h) usage; exit 0;;
f) pkgs_fn="$OPTARG";;
i) fields="$OPTARG";;
?) printf "Run pkg_update_src_summary -h for details\n"; exit 2;;
esac
done
shift `expr $OPTIND - 1`
if test $# -ne 1; then
usage
exit 1
fi
summary=$1
shift
############################################################
cd $PKGSRCDIR
new_summary=$summary.new
tmp_dir=`mktemp -d /tmp/pkg_update_src_summary.XXXXXX`
trap "rm -rf $tmp_dir $new_summary" 0 1 2 15
test -n "$tmp_dir" || exit 1
allpkgs_fn=$tmp_dir/allpkgs
if test "$pkgs_fn"; then
awk '{sub(/#.*/, "")} NF > 0 {print $1}' $pkgs_fn > $allpkgs_fn
else
pkg_list_all_pkgs > $allpkgs_fn
fi
############################################################
#### process packages
# src_summary from scratch
if ! test -f $summary; then
eval pkg_src_summary $fields < $allpkgs_fn > $new_summary
mv $new_summary $summary
exit $?
fi
# micro summary
micsum_fn=$tmp_dir/micsum
pkg_micro_src_summary < $allpkgs_fn >$micsum_fn
# summary against microsummary
cmp_fn=$tmp_dir/cmp
pkg_cmp_summary -p $summary $micsum_fn > $cmp_fn
# copying summary about unchanged packages
eq_pkgs_fn=$tmp_dir/eqpkgs
awk '$1 ~ /^[=]/ {print $2 ":" $3}' $cmp_fn > $eq_pkgs_fn # pkgpath:pkgbase
copy_eq_pkgs (){
env eq_pkgs_fn="$eq_pkgs_fn" runawk -e '
#use "xgetline.awk"
#use "pkg_grep_summary.awk"
BEGIN {
eq_pkgs_fn = ENVIRON ["eq_pkgs_fn"]
FS = " "
while (xgetline0(eq_pkgs_fn)){
eq_pkgs [$1] = 1
}
FS = "="
# keep all fields in associative array "fields"
keep_fields = 1
}
function grep_summary__condition ( pkgpath, pkgbase){
pkgpath = fields ["PKGPATH"]
pkgbase = fields ["PKGNAME"]
sub(/-[^-]+$/, "", pkgbase)
if (pkgpath == "" || pkgbase == ""){
return -1
}
if (((pkgpath ":" pkgbase) in eq_pkgs) &&
!((pkgpath ":" pkgbase) in processed))
{
processed [pkgpath ":" pkgbase] = 1
return 1
}
return 0
}
' "$@"
}
copy_eq_pkgs $summary > $new_summary
# add new/updated/changed packages
changed_pkgs_fn=$tmp_dir/changed_pkgs
awk '$1 ~ /^[+<>?0-9]/ {print $2 ":" $3}' $cmp_fn > $changed_pkgs_fn
extract_pkgpath (){
runawk -v changed_pkgs_fn=$changed_pkgs_fn -e '
#use "xgetline.awk"
BEGIN {
while (xgetline0(changed_pkgs_fn)){
pkgs [$1] = 1
}
SUBSEP = ":"
FS = "="
}
$1 == "PKGNAME" {
pkgbase = $2
sub(/-[^-]+$/, "", pkgbase)
}
$1 == "PKGPATH" {
pkgpath = $2
}
NF == 0 && ((pkgpath ":" pkgbase) in pkgs) {
print pkgpath
pkgbase = pkgpath = ""
}
' "$@"
}
pkgpath_fn=$tmp_dir/pkgpaths
extract_pkgpath $micsum_fn > $pkgpath_fn
eval pkg_src_summary $fields < $pkgpath_fn >> $new_summary
# result
pkg_uniq_summary $new_summary > $new_summary.uniq
rm $new_summary
mv $new_summary.uniq $summary