198 lines
4.9 KiB
Bash
Executable file
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
|