From afb2b54a87204d0115095a3da85b7af5cbd0081b Mon Sep 17 00:00:00 2001 From: apb Date: Wed, 4 Jan 2006 14:18:00 +0000 Subject: [PATCH] * Make regpkgset accept all the new args that regpkg takes. * Sort the pkgs into dependency order before invoking regpkg. * Better cleanup. Reviewed by agc --- distrib/sets/regpkgset | 144 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 128 insertions(+), 16 deletions(-) diff --git a/distrib/sets/regpkgset b/distrib/sets/regpkgset index 85403f466e81..5bd4b9b27e3a 100755 --- a/distrib/sets/regpkgset +++ b/distrib/sets/regpkgset @@ -1,6 +1,6 @@ #! /bin/sh # -# $NetBSD: regpkgset,v 1.5 2006/01/03 18:31:09 apb Exp $ +# $NetBSD: regpkgset,v 1.6 2006/01/04 14:18:00 apb Exp $ # # Copyright (c) 2003 Alistair G. Crooks. All rights reserved. # @@ -33,25 +33,93 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # -# Usage: regpkgset set +# Usage: regpkgset [options] set +# +# Options: +# -q Quiet. +# -v Verbose. +# -f Force. +# -m Ignore errors from missing files. +# -u Update. +# -c Cache some information in ${BUILD_INFO_CACHE}. +# -d destdir Sets DESTDIR. +# -t binpkgdir Create a binary package (in *.tgz format) in the +# specified directory. Without this option, a binary +# package is not created. +# -M metalog Use the specified metalog file to override file +# or directory attributes when creating a binary package. +# -N etcdir Use the specified directory for passwd and group files. +prog="${0##*/}" +toppid=$$ rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/" +. "${rundir}/sets.subr" -verbose="" -cache="" +bomb() +{ + kill ${toppid} # in case we were invoked from a subshell + exit 1 +} +# A literal newline +nl=' +' + +# +# cleanup() deletes temporary files. +# +es=0 +cleanup () +{ + trap - 0 + [ x"${BUILD_INFO_CACHE}" != x ] && rm -f "${BUILD_INFO_CACHE}" + exit ${es} +} +trap 'es=128; cleanup' 1 2 3 13 15 # HUP INT QUIT PIPE TERM +trap 'es=$?; cleanup' 0 # EXIT + +# +# Parse command line args. +# +verbose=false +quiet=false +force=false +allowmissing=false +update=false +cache=false +pkgdir="" +metalog="" +etcdir="" +all_options="" while [ $# -gt 1 ]; do + # XXX: ${all_options} doesn't correctly handle args with + # embedded shell special characters. case "$1" in - -v) verbose="$1" ;; - -c) cache="$1" ;; + -q) quiet=true ; verbose=false ;; + -v) verbose=true ; quiet=false ;; + -f) force=true ;; + -m) allowmissing=true ;; + -u) update=true ;; + -c) cache=true ;; + -d) DESTDIR="$2" ; all_options="${all_options} $1" ; shift ;; + -d*) DESTDIR="${1#-?}" ;; + -t) pkgdir="$2" ; all_options="${all_options} $1" ; shift ;; + -t*) pkgdir="${1#-?}" ;; + -M) metalog="$2" ; all_options="${all_options} $1" ; shift ;; + -M*) metalog="${1#-?}" ;; + -N) etcdir="$2" ; all_options="${all_options} $1" ; shift ;; + -N*) etcdir="${1#-?}" ;; + -*) echo "Usage: regpkgset [options] set ..." ; bomb ;; *) break ;; esac + all_options="${all_options} $1" shift done +export DESTDIR if [ $# -lt 1 ]; then - echo "Usage: regpkgset pkgset..." - exit 1 + echo "Usage: regpkgset [options] set ..." + bomb fi case "$1" in @@ -59,10 +127,12 @@ all) list="base comp etc games man misc text" ;; *) list="$*" ;; esac -if [ x"${cache}" != x ]; then - BUILD_INFO_CACHE="$(${MKTEMP} "/var/tmp/${0##*/}-BUILD_INFO.XXXXXX")" +if ${cache} ; then + BUILD_INFO_CACHE="$(${MKTEMP} "/var/tmp/${prog}-BUILD_INFO.XXXXXX")" export BUILD_INFO_CACHE { + # These variables describe the build + # environment, not the target. echo "OPSYS=$(${UNAME} -s)" echo "OS_VERSION=$(${UNAME} -r)" ${MAKE} -f- all < "${BUILD_INFO_CACHE}" fi -for pkgset in ${list}; do - for pkg in $("${rundir}/listpkgs" "${pkgset}"); do - "${rundir}/regpkg" ${verbose} "${pkgset}" "${pkg}" - done +# +# For each pkgset mentioned in ${list}, get a list of all pkgs in the pkgset. +# +# Sort all the pkgs into dependency order (with prerequisite pkgs before +# pkgs that depend on them). +# +# Invoke ${rundir}/regpkg for each pkg, taking care to do it in dependency +# order. If there were any pkgs for which we failed to find dependency +# information, handle them at the end. +# +pkgs="$( for pkgset in ${list}; do + ${HOST_SH} "${rundir}/listpkgs" "${pkgset}" || bomb + done )" +tsort_input="$( ${AWK} '{print $2 " " $1}' <"${rundir}/deps" || bomb )" +tsort_output="$( echo "${tsort_input}" | ${TSORT} || bomb )" +for pkg in ${tsort_output} ; do + case "${nl}${pkgs}${nl}" in + *"${nl}${pkg}${nl}"*) + # We want this pkg. + pkgset="${pkg%%-*}" + ${verbose} && echo "${prog}: registering ${pkg}" + ${HOST_SH} "${rundir}/regpkg" ${all_options} \ + "${pkgset}" "${pkg}" || bomb + ;; + *) # pkg is mentioned in ${tsort_output} but not in ${pkgs}. + # We do not want this pkg. + ;; + esac +done +for pkg in ${pkgs} ; do + case "${nl}${tsort_output}${nl}" in + *"${nl}${pkg}${nl}"*) + # pkg was in the tsort output, so it would have been + # handled above. + ;; + *) # This pkg was not in the tsort output. + # This is probably an error, but process the + # pkg anyway. + echo >&2 "${prog}: WARNING: ${pkg} is not mentioned in deps file" + pkgset="${pkg%%-*}" + ${verbose} && echo "${prog}: registering ${pkg}" + ${HOST_SH} "${rundir}/regpkg" ${all_options} \ + "${pkgset}" "${pkg}" || bomb + ;; + esac done -[ x"${BUILD_INFO_CACHE}" != x ] && rm -f "${BUILD_INFO_CACHE}" - exit 0