141 lines
3.5 KiB
Text
141 lines
3.5 KiB
Text
|
#!/bin/sh
|
||
|
#
|
||
|
# Print out the files in some or all lists.
|
||
|
# Usage: makeplist [options] setname pkgname
|
||
|
# options:
|
||
|
# -a arch set arch (e.g, m68k, mips, powerpc)
|
||
|
# -m machine set machine (e.g, amiga, i386, macppc)
|
||
|
# -s setsdir directory to find sets
|
||
|
# -p prefix prefix for package creation
|
||
|
# -I realprefix prefix for eventual installation
|
||
|
# setname pkgname set and package to build plist for
|
||
|
#
|
||
|
|
||
|
rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
|
||
|
. "${rundir}/sets.subr"
|
||
|
prefix=/
|
||
|
realprefix=/
|
||
|
got_realprefix=false
|
||
|
|
||
|
usage() {
|
||
|
cat 1>&2 <<USAGE
|
||
|
Usage: $0 [options] setname pkgname"
|
||
|
options:"
|
||
|
-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}]
|
||
|
-I realprefix prefix for eventual installation [${realprefix}]
|
||
|
setname pkgname set and package to build plist for
|
||
|
USAGE
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
# handle args
|
||
|
while getopts a:I:m:p:s: ch; do
|
||
|
case ${ch} in
|
||
|
a)
|
||
|
MACHINE_ARCH="${OPTARG}"
|
||
|
MACHINE_CPU="$(arch_to_cpu "${OPTARG}")"
|
||
|
;;
|
||
|
I)
|
||
|
realprefix=${OPTARG}
|
||
|
got_realprefix=true
|
||
|
;;
|
||
|
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"
|
||
|
|
||
|
if ! ${got_realprefix}; then
|
||
|
realprefix="${prefix}"
|
||
|
fi
|
||
|
|
||
|
filename="/tmp/makeplist.$$"
|
||
|
ffilename="/tmp/makeplist.files.$$"
|
||
|
dfilename="/tmp/makeplist.dirs.$$"
|
||
|
|
||
|
list_set_files "${setname}" | \
|
||
|
${ENV_CMD} 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 )"
|
||
|
|
||
|
#
|
||
|
# XXX: The "lists" do not differentiate between directories and files.
|
||
|
# But we need to differentiate between them, so we do so by checking
|
||
|
# what's actually present in the file system. Files or directories that
|
||
|
# are listed in the "lists" but that do not exist in the file system end
|
||
|
# up not appearing in our output, and this subverts a large part of the
|
||
|
# purpose of the "lists".
|
||
|
#
|
||
|
# XXX: Given that we have to figure out what is or is not a directory
|
||
|
# without assistance from the "lists", it would be much more efficient
|
||
|
# to consult the metalog instead of the file system.
|
||
|
#
|
||
|
|
||
|
(
|
||
|
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}"
|
||
|
|
||
|
)
|
||
|
|
||
|
echo "@cwd ${realprefix}"
|
||
|
if [ -s "${ffilename}" ]; then
|
||
|
cat "${ffilename}"
|
||
|
fi
|
||
|
if [ -s "${dfilename}" ]; then
|
||
|
${SORT} -r "${dfilename}"
|
||
|
fi
|
||
|
|
||
|
rm -f "${filename}" "${ffilename}" "${dfilename}"
|
||
|
|
||
|
exit 0
|