Home | History | Annotate | Line # | Download | only in sets
syspkgdeps revision 1.5
      1 #!/bin/sh
      2 #
      3 # syspkgdeps [-a arch] [-m machine] [-s setsdir] [-p prefix] sets
      4 #
      5 # Compute naive package dependencies based on file & directory
      6 # nesting. E.g., if pkg P contains /foo/bar and Q contains /foo,
      7 # then Q is considered a dependency of P.
      8 #
      9 
     10 #set -u
     11 
     12 : ${TOOL_DB=db}
     13 DB="${TOOL_DB} -q"
     14 
     15 #
     16 # set defaults and import setlist subroutines
     17 #
     18 rundir=${0%/*}
     19 . ${rundir}/sets.subr
     20 prefix=/
     21 
     22 usage()
     23 {
     24 	cat 1>&2 <<USAGE
     25 Usage: ${0##*/} [-a arch] [-m machine] [-s setsdir] [-p prefix] setname [...]
     26 	-a arch		set arch (e.g, m68k, mips, powerpc)	[$MACHINE_ARCH]
     27 	-m machine	set machine (e.g, amiga, i386, macppc)	[$MACHINE]
     28 	-s setsdir	directory to find sets			[$setsdir]
     29 	-p prefix	prefix for created plist		[$prefix]
     30 	setname [...]	sets to find dependencies for
     31 USAGE
     32 	exit 1
     33 }
     34 
     35 # parse arguments
     36 while getopts a:m:ps: ch; do
     37 	case ${ch} in
     38 	a)
     39 		MACHINE_ARCH=${OPTARG}
     40 		MACHINE_CPU=$(arch_to_cpu ${OPTARG})
     41 		;;
     42 	m)
     43 		MACHINE=${OPTARG}
     44 		;;
     45 	p)
     46 		prefix=${OPTARG}
     47 		;;
     48 	s)
     49 		setsdir=${OPTARG}
     50 		;;
     51 	*)
     52 		usage
     53 		;;
     54 	esac
     55 done
     56 shift $((${OPTIND} - 1))
     57 if [ $# -lt 1 ]; then
     58 	usage
     59 fi
     60 
     61 sets=$@
     62 
     63 # TBD clean up
     64 SCRATCH=$(mktemp -d /var/tmp/$(basename $0).XXXXXX)
     65 
     66 [ $? -ne 0 ] && { echo "Could not create scratch directory." 1>&2 ; exit 1 ; }
     67 
     68 PATH_MEMBERSHIP=$SCRATCH/path-membership
     69 PATH_TO_PKGNAME=$SCRATCH/pathpkg.db
     70 PARENT_PKGNAMES=$SCRATCH/parent-pkgnames
     71 PARENT_PATHNAMES=$SCRATCH/parent-pathnames
     72 
     73 echo "indexing packages by pathnames" 1>&2
     74 
     75 list_set_files $sets | sed 's/^\.\///' | \
     76 env PREFIX=$prefix awk '{
     77 	if ($1 == ".") {
     78 		print ENVIRON["PREFIX"] " " $2;
     79 	} else {
     80 		print ENVIRON["PREFIX"] $1 " " $2;
     81 	}
     82 }' | sort -k 1 -u > $PATH_MEMBERSHIP
     83 
     84 $DB -w -f - btree $PATH_TO_PKGNAME < $PATH_MEMBERSHIP || echo "shit" 1>&2
     85 
     86 echo "computing parent pathnames" 1>&2
     87 
     88 while read pathname pkgname; do
     89 	# print parent pathname
     90 	echo ${pathname%/*}
     91 done < $PATH_MEMBERSHIP > $PARENT_PATHNAMES
     92 
     93 echo "selecting parent packages using parent pathnames" 1>&2
     94 
     95 $DB -f - btree $PATH_TO_PKGNAME < $PARENT_PATHNAMES | \
     96 	paste $PATH_MEMBERSHIP - | \
     97 	awk '{ if ($2 != $4) print $2 " " $4; }' | sort -u | $rundir/culldeps
     98 
     99 if [ $? -ne 0 ]; then
    100 	echo "error in parent-directory lookup, aborting" 1>&2
    101 	exit 1
    102 fi
    103