syspkgdeps revision 1.9
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.1Sdyoung#
131.1Sdyoung# set defaults and import setlist subroutines
141.1Sdyoung#
151.7Sapbrundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
161.7Sapb. "${rundir}/sets.subr"
171.7Sapb
181.1Sdyoung
191.3Slukemusage()
201.3Slukem{
211.3Slukem	cat 1>&2 <<USAGE
221.3SlukemUsage: ${0##*/} [-a arch] [-m machine] [-s setsdir] [-p prefix] setname [...]
231.9Sapb	-a arch		set arch (e.g, m68k, mips, powerpc)	[${MACHINE_ARCH}]
241.9Sapb	-m machine	set machine (e.g, amiga, i386, macppc)	[${MACHINE}]
251.9Sapb	-s setsdir	directory to find sets			[${setsdir}]
261.9Sapb	-p prefix	prefix for created plist		[${prefix}]
271.3Slukem	setname [...]	sets to find dependencies for
281.3SlukemUSAGE
291.3Slukem	exit 1
301.1Sdyoung}
311.1Sdyoung
321.1Sdyoung# parse arguments
331.3Slukemwhile getopts a:m:ps: ch; do
341.3Slukem	case ${ch} in
351.3Slukem	a)
361.9Sapb		MACHINE_ARCH="${OPTARG}"
371.9Sapb		MACHINE_CPU="$(arch_to_cpu "${OPTARG}")"
381.1Sdyoung		;;
391.3Slukem	m)
401.9Sapb		MACHINE="${OPTARG}"
411.1Sdyoung		;;
421.3Slukem	p)
431.9Sapb		prefix="${OPTARG}"
441.1Sdyoung		;;
451.3Slukem	s)
461.9Sapb		setsdir="${OPTARG}"
471.1Sdyoung		;;
481.3Slukem	*)
491.1Sdyoung		usage
501.1Sdyoung		;;
511.1Sdyoung	esac
521.1Sdyoungdone
531.3Slukemshift $((${OPTIND} - 1))
541.1Sdyoungif [ $# -lt 1 ]; then
551.1Sdyoung	usage
561.1Sdyoungfi
571.1Sdyoung
581.9Sapbsets="$*"
591.1Sdyoung
601.1Sdyoung# TBD clean up
611.9SapbSCRATCH="$(${MKTEMP} -d "/var/tmp/${0##*/}.XXXXXX")"
621.1Sdyoung
631.1Sdyoung[ $? -ne 0 ] && { echo "Could not create scratch directory." 1>&2 ; exit 1 ; }
641.1Sdyoung
651.9SapbPATH_MEMBERSHIP="${SCRATCH}/path-membership"
661.9SapbPATH_TO_PKGNAME="${SCRATCH}/pathpkg.db"
671.9SapbPARENT_PKGNAMES="${SCRATCH}/parent-pkgnames"
681.9SapbPARENT_PATHNAMES="${SCRATCH}/parent-pathnames"
691.1Sdyoung
701.1Sdyoungecho "indexing packages by pathnames" 1>&2
711.1Sdyoung
721.9Sapblist_set_files ${sets} | ${SED} 's/^\.\///' | \
731.9Sapb${ENV_CMD} PREFIX="${prefix}" ${AWK} '{
741.1Sdyoung	if ($1 == ".") {
751.1Sdyoung		print ENVIRON["PREFIX"] " " $2;
761.1Sdyoung	} else {
771.1Sdyoung		print ENVIRON["PREFIX"] $1 " " $2;
781.1Sdyoung	}
791.9Sapb}' | ${SORT} -k 1 -u > "${PATH_MEMBERSHIP}"
801.1Sdyoung
811.9Sapb${DB} -q -w -f - btree "${PATH_TO_PKGNAME}" < "${PATH_MEMBERSHIP}" || \
821.9Sapb	echo "shit" 1>&2
831.1Sdyoung
841.1Sdyoungecho "computing parent pathnames" 1>&2
851.1Sdyoung
861.1Sdyoungwhile read pathname pkgname; do
871.1Sdyoung	# print parent pathname
881.9Sapb	echo "${pathname%/*}"
891.9Sapbdone < "${PATH_MEMBERSHIP}" > "${PARENT_PATHNAMES}"
901.1Sdyoung
911.1Sdyoungecho "selecting parent packages using parent pathnames" 1>&2
921.1Sdyoung
931.9Sapb${DB} -q -f - btree "${PATH_TO_PKGNAME}" < "${PARENT_PATHNAMES}" | \
941.9Sapb	${PASTE} "${PATH_MEMBERSHIP}" - | \
951.8Sapb	${AWK} '{ if ($2 != $4) print $2 " " $4; }' | \
961.8Sapb	${SORT} -u | \
971.9Sapb	"${rundir}/culldeps"
981.1Sdyoung
991.1Sdyoungif [ $? -ne 0 ]; then
1001.1Sdyoung	echo "error in parent-directory lookup, aborting" 1>&2
1011.1Sdyoung	exit 1
1021.1Sdyoungfi
103