syspkgdeps revision 1.10
11.1Sdyoung#!/bin/sh
21.1Sdyoung#
31.1Sdyoung# syspkgdeps [-a arch] [-m machine] [-s setsdir] [-p prefix] sets
41.1Sdyoung#
51.1Sdyoung# Compute naive package dependencies based on file & directory
61.1Sdyoung# nesting. E.g., if pkg P contains /foo/bar and Q contains /foo,
71.1Sdyoung# then Q is considered a dependency of P.
81.1Sdyoung#
91.1Sdyoung
101.1Sdyoung#set -u
111.1Sdyoung
121.10Sapbprog="${0##*/}"
131.7Sapbrundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
141.7Sapb. "${rundir}/sets.subr"
151.7Sapb
161.10Sapb#
171.10Sapb# set defaults
181.10Sapb#
191.10Sapbprefix=/
201.1Sdyoung
211.3Slukemusage()
221.3Slukem{
231.3Slukem	cat 1>&2 <<USAGE
241.3SlukemUsage: ${0##*/} [-a arch] [-m machine] [-s setsdir] [-p prefix] setname [...]
251.9Sapb	-a arch		set arch (e.g, m68k, mips, powerpc)	[${MACHINE_ARCH}]
261.9Sapb	-m machine	set machine (e.g, amiga, i386, macppc)	[${MACHINE}]
271.9Sapb	-s setsdir	directory to find sets			[${setsdir}]
281.9Sapb	-p prefix	prefix for created plist		[${prefix}]
291.3Slukem	setname [...]	sets to find dependencies for
301.3SlukemUSAGE
311.3Slukem	exit 1
321.1Sdyoung}
331.1Sdyoung
341.1Sdyoung# parse arguments
351.10Sapbwhile getopts a:m:p:s: ch; do
361.3Slukem	case ${ch} in
371.3Slukem	a)
381.9Sapb		MACHINE_ARCH="${OPTARG}"
391.9Sapb		MACHINE_CPU="$(arch_to_cpu "${OPTARG}")"
401.1Sdyoung		;;
411.3Slukem	m)
421.9Sapb		MACHINE="${OPTARG}"
431.1Sdyoung		;;
441.3Slukem	p)
451.9Sapb		prefix="${OPTARG}"
461.1Sdyoung		;;
471.3Slukem	s)
481.9Sapb		setsdir="${OPTARG}"
491.1Sdyoung		;;
501.3Slukem	*)
511.1Sdyoung		usage
521.1Sdyoung		;;
531.1Sdyoung	esac
541.1Sdyoungdone
551.3Slukemshift $((${OPTIND} - 1))
561.1Sdyoungif [ $# -lt 1 ]; then
571.1Sdyoung	usage
581.1Sdyoungfi
591.1Sdyoung
601.9Sapbsets="$*"
611.10Sapbcase "${sets}" in
621.10Sapball)	sets="${nlists}" ;;
631.10Sapbesac
641.1Sdyoung
651.1Sdyoung# TBD clean up
661.10SapbSCRATCH="$(${MKTEMP} -d "/var/tmp/${prog}.XXXXXX")"
671.1Sdyoung
681.1Sdyoung[ $? -ne 0 ] && { echo "Could not create scratch directory." 1>&2 ; exit 1 ; }
691.1Sdyoung
701.9SapbPATH_MEMBERSHIP="${SCRATCH}/path-membership"
711.9SapbPATH_TO_PKGNAME="${SCRATCH}/pathpkg.db"
721.9SapbPARENT_PKGNAMES="${SCRATCH}/parent-pkgnames"
731.9SapbPARENT_PATHNAMES="${SCRATCH}/parent-pathnames"
741.1Sdyoung
751.1Sdyoungecho "indexing packages by pathnames" 1>&2
761.1Sdyoung
771.9Sapblist_set_files ${sets} | ${SED} 's/^\.\///' | \
781.9Sapb${ENV_CMD} PREFIX="${prefix}" ${AWK} '{
791.1Sdyoung	if ($1 == ".") {
801.1Sdyoung		print ENVIRON["PREFIX"] " " $2;
811.1Sdyoung	} else {
821.1Sdyoung		print ENVIRON["PREFIX"] $1 " " $2;
831.1Sdyoung	}
841.9Sapb}' | ${SORT} -k 1 -u > "${PATH_MEMBERSHIP}"
851.1Sdyoung
861.9Sapb${DB} -q -w -f - btree "${PATH_TO_PKGNAME}" < "${PATH_MEMBERSHIP}" || \
871.9Sapb	echo "shit" 1>&2
881.1Sdyoung
891.1Sdyoungecho "computing parent pathnames" 1>&2
901.1Sdyoung
911.1Sdyoungwhile read pathname pkgname; do
921.10Sapb	# print parent pathname.
931.10Sapb	# (This uses a cheap implementation of dirname from sets.subr.)
941.10Sapb	dirname "${pathname}"
951.9Sapbdone < "${PATH_MEMBERSHIP}" > "${PARENT_PATHNAMES}"
961.1Sdyoung
971.1Sdyoungecho "selecting parent packages using parent pathnames" 1>&2
981.1Sdyoung
991.9Sapb${DB} -q -f - btree "${PATH_TO_PKGNAME}" < "${PARENT_PATHNAMES}" | \
1001.9Sapb	${PASTE} "${PATH_MEMBERSHIP}" - | \
1011.8Sapb	${AWK} '{ if ($2 != $4) print $2 " " $4; }' | \
1021.8Sapb	${SORT} -u | \
1031.10Sapb	${HOST_SH} "${rundir}/culldeps"
1041.1Sdyoung
1051.1Sdyoungif [ $? -ne 0 ]; then
1061.1Sdyoung	echo "error in parent-directory lookup, aborting" 1>&2
1071.1Sdyoung	exit 1
1081.1Sdyoungfi
109