NetBSD/distrib/sets/makeplist
dyoung f9f7b262bb One of my users stumbled over a bug: src/distrib/sets/makeplist
uses find(1) in a non-POSIX way.  The trouble is that -maxdepth is
not an option for POSIX find(1).  His NetBSD 1.6.2 system tripped
over that.  I converted the -maxdepth uses to -prune, which is
POSIX-compatible.

While I was in makeplist, I wrote a comment about the xargs/find/read
cleverness that I use to generate the @dirrm directives.
2005-01-12 01:38:04 +00:00

108 lines
2.3 KiB
Bash
Executable File

#!/bin/sh
#
# Print out the files in some or all lists.
# Usage: makeplist [-a arch] [-m machine] [-s setsdir] [-p prefix] setname pkgname
#
rundir=${0%/*}
. ${rundir}/sets.subr
prefix=/
usage()
{
cat 1>&2 <<USAGE
Usage: ${0##*/} [-a arch] [-m machine] [-s setsdir] [-p prefix] setname pkgname
-a arch set arch (e.g, m68k, mips, powerpc) [$MACHINE_ARCH]
-m machine set machine (e.g, amiga, i386, macppc) [$MACHINE]
-s setsdir directory to find sets [$setsdir]
-p prefix prefix for created plist [$prefix]
setname pkgname set and package to build plist for
USAGE
exit 1
}
# handle args
while getopts a:m:p:s: ch; do
case ${ch} in
a)
MACHINE_ARCH=${OPTARG}
MACHINE_CPU=$(arch_to_cpu ${OPTARG})
;;
m)
MACHINE=${OPTARG}
;;
p)
prefix=${OPTARG}
;;
s)
setsdir=${OPTARG}
;;
*)
usage
;;
esac
done
shift $((${OPTIND} - 1))
if [ $# -ne 2 ]; then
usage
fi
setname="$1"
pkgname=$2
filename=/tmp/makeplist.$$
ffilename=/tmp/makeplist.files.$$
dfilename=/tmp/makeplist.dirs.$$
list_set_files $setname | \
env PLISTPKG=$pkgname awk '
$2 == ENVIRON["PLISTPKG"] {
sub("^\\./", "", $1);
print $1
}' | sort -u > $filename
SELECTDIRS="-prune -type d"
SELECTNONDIRS="! -type d -print -o ( -type d -prune )"
cd $prefix
#
# Match the directories. Use find(1) to avoid repeat calls to
# 'test -d'.
#
# This is a little clever. I cannot use 'xargs find', because
# find wants for the option arguments to follow the path arguments.
# So I use 'xargs echo $SELECTDIRS' to make a maximum-length proto-command
# line. I use 'read' to peel the options off the front of the
# command-line, and 'find $args $SELECTDIRS' to put them at the end.
#
xargs echo $SELECTDIRS < $filename | \
while read ignore ignore ignore args; do
[ -z "$args" ] && break
find $args $SELECTDIRS
done | awk '{ print "@dirrm " $1; }' > $dfilename
#
# Match the non-directories. Use find(1) to avoid repeat calls to
# 'test ! -d'. See 'Match the directories' for an explanation of the
# cleverness.
#
xargs echo $SELECTNONDIRS < $filename | \
while read ignore ignore ignore ignore ignore ignore ignore ignore ignore \
ignore args; do
[ -z "$args" ] && break
find $args $SELECTNONDIRS
done > $ffilename
cd -
echo "@cwd $prefix"
if [ -s $ffilename ]; then
cat $ffilename
fi
if [ -s $dfilename ]; then
sort -r $dfilename
fi
rm -f $filename $ffilename $dfilename
exit 0