#!/bin/sh # $NetBSD: printindex,v 1.22 2005/11/14 21:37:16 rillig Exp $ # # # Copyright (c) 2001 The NetBSD Foundation, Inc. # All rights reserved. # # This code is derived from software contributed to The NetBSD Foundation # by # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. 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. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the NetBSD # Foundation, Inc. and its contributors. # 4. Neither the name of The NetBSD Foundation nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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. # # usage: printindex [brokenfile [brokenbasedir]] # # Generates a mapping from pkgsrc directories to the current package # version and prints it on stdout. Each line of the output has two # fields: the package directory (in the form category/package) and the # package version (in the form package-1.456nb3). # # If the optional argument is given, it specifies the # basename of the file to which package-specific errors will be # appended. # # If the is specified, the complete filename of the # is /${pkgdir}/. This # directory is created automatically if needed. If the # is not specified, the is created in the package directory # itself. # # Note: printindex must be called from a pkgsrc root directory. set -e have_brokenbasedir="no" case $# in 0) brokenfile="/dev/null" ;; 1) brokenfile="$1" ;; 2) brokenfile="$1"; brokenbasedir="$2"; have_brokenbasedir="yes" ;; *) echo "usage: $0 [brokenfile [brokenbasedir]]" 1>&2 exit 1 ;; esac case ${BMAKE-""} in "") echo "$0: error: BMAKE must be set." 1>&2 exit 1;; esac # $USR_PKGSRC cwd="${PWD}" # get some initial variables cd "${cwd}/pkgtools/pkglint" BULK_PREREQ=`${BMAKE} show-var VARNAME=BULK_PREREQ` GREP=`${BMAKE} show-var VARNAME=GREP USE_TOOLS=grep` MKDIR=`${BMAKE} show-var VARNAME=MKDIR USE_TOOLS=mkdir` SED=`${BMAKE} show-var VARNAME=SED USE_TOOLS=sed` cd "${cwd}" if [ -r "${cwd}/.pkglist" ]; then . "${cwd}/.pkglist" else # fall back to all packages. list=`${GREP} '^[[:space:]]*'SUBDIR */Makefile | ${SED} 's,/Makefile.*=[[:space:]]*,/,'` fi # # Print the table of PKGPATH and PKGNAME. # # The check for duplicates is necessary to prevents double entries in # the table. The use of the :detect_duplicates: delimiter prevents the # inner "case" from occuring too often, as the $done_pkgs string grows # to about 100k during one run of the program. This saves about # 40 seconds on a 1 GHz Athlon. # done_pkgs="" detect_duplicates=no for pkgdir in $list :detect_duplicates: $BULK_PREREQ; do case $pkgdir in :detect_duplicates:) detect_duplicates=yes continue;; esac case $detect_duplicates in yes) case $done_pkgs in *="${pkgdir}"=*) continue;; esac;; esac if cd "${cwd}/${pkgdir}"; then if pkgname=`${BMAKE} show-var VARNAME=PKGNAME`; then echo "${pkgdir} ${pkgname}" done_pkgs="${done_pkgs} =${pkgdir}=" else echo "$0: error: could not extract PKGNAME for ${pkgdir} -- skipping." 1>&2 case $have_brokenbasedir in yes) broken_path="${brokenbasedir}/${pkgdir}/${brokenfile}" ${MKDIR} "${brokenbasedir}/${pkgdir}" ;; *) broken_path="${brokenfile}" ;; esac { echo "===> ${BMAKE} show-var VARNAME=PKGNAME failed" ${BMAKE} show-var VARNAME=PKGNAME || true } >> "${broken_path}" 2>&1 fi fi done