1#!/bin/sh
2#
3# Print out the files in some or all lists.
4# Usage: makeplist [options] setname pkgname
5# options:
6# 	-a arch		set arch (e.g, m68k, mips, powerpc)	
7# 	-m machine	set machine (e.g, amiga, i386, macppc)
8# 	-s setsdir	directory to find sets
9# 	-p prefix	prefix for package creation
10# 	-I realprefix	prefix for eventual installation
11# 	setname pkgname	set and package to build plist for
12#
13
14rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
15. "${rundir}/sets.subr"
16prefix=/
17realprefix=/
18got_realprefix=false
19
20usage() {
21	cat 1>&2 <<USAGE
22Usage: $0 [options] setname pkgname"
23options:"
24	-a arch		set arch (e.g, m68k, mips, powerpc)	[${MACHINE_ARCH}]
25	-m machine	set machine (e.g, amiga, i386, macppc)	[${MACHINE}]
26	-s setsdir	directory to find sets			[${setsdir}]
27	-p prefix	prefix for created plist		[${prefix}]
28	-I realprefix	prefix for eventual installation	[${realprefix}]
29	setname pkgname	set and package to build plist for
30USAGE
31	exit 1
32}
33
34umask 022
35# handle args
36while getopts a:I:m:p:s: ch; do
37	case ${ch} in
38	a)
39		MACHINE_ARCH="${OPTARG}"
40		MACHINE_CPU="$(arch_to_cpu "${OPTARG}")"
41		;;
42	I)
43		realprefix=${OPTARG}
44		got_realprefix=true
45		;;
46	m)
47		MACHINE="${OPTARG}"
48		;;
49	p)
50		prefix="${OPTARG}"
51		;;
52	s)
53		setsdir="${OPTARG}"
54		;;
55	*)
56		usage
57		;;
58	esac
59done
60shift $((${OPTIND} - 1))
61if [ $# -ne 2 ]; then
62	usage
63fi
64setname="$1"
65pkgname="$2"
66
67if ! ${got_realprefix}; then
68    realprefix="${prefix}"
69fi
70
71filename="/tmp/makeplist.$$"
72ffilename="/tmp/makeplist.files.$$"
73dfilename="/tmp/makeplist.dirs.$$"
74
75list_set_files "${setname}" | \
76    ${ENV_CMD} PLISTPKG="${pkgname}" ${AWK} '
77	$2 == ENVIRON["PLISTPKG"] {
78		sub("^\\./", "", $1);
79		print $1
80	}' | ${SORT} -u > "${filename}"
81
82SELECTDIRS="-prune -type d"
83SELECTNONDIRS="! -type d -print -o ( -type d -prune )"
84
85#
86# XXX: The "lists" do not differentiate between directories and files.
87# But we need to differentiate between them, so we do so by checking
88# what's actually present in the file system.  Files or directories that
89# are listed in the "lists" but that do not exist in the file system end
90# up not appearing in our output, and this subverts a large part of the
91# purpose of the "lists".
92#
93# XXX: Given that we have to figure out what is or is not a directory
94# without assistance from the "lists", it would be much more efficient
95# to consult the metalog instead of the file system.
96#
97
98(
99cd "${prefix}"
100
101#
102# Match the directories.  Use find(1) to avoid repeat calls to
103# 'test -d'.
104#
105# This is a little clever.  I cannot use 'xargs find', because
106# find wants for the option arguments to follow the path arguments.
107# So I use 'xargs echo ${SELECTDIRS}' to make a maximum-length proto-command
108# line.  I use 'read' to peel the options off the front of the
109# command-line, and 'find ${args} ${SELECTDIRS}' to put them at the end.
110#
111xargs echo ${SELECTDIRS} < "${filename}" | \
112while read ignore ignore ignore args; do
113	[ -z "${args}" ] && break 
114	${FIND} ${args} ${SELECTDIRS}
115done | ${AWK} '{ print "@pkgdir " $1; }' > "${dfilename}"
116
117#
118# Match the non-directories.  Use find(1) to avoid repeat calls to
119# 'test ! -d'.  See 'Match the directories' for an explanation of the
120# cleverness.
121#
122xargs echo ${SELECTNONDIRS} < "${filename}" | \
123while read ignore ignore ignore ignore ignore ignore ignore ignore ignore \
124    ignore args; do
125	[ -z "${args}" ] && break 
126	${FIND} ${args} ${SELECTNONDIRS}
127done > "${ffilename}"
128
129)
130
131echo "@cwd ${realprefix}"
132if [ -s "${ffilename}" ]; then
133	cat "${ffilename}"
134fi
135if [ -s "${dfilename}" ]; then
136        ${SORT} -r "${dfilename}"
137fi
138
139rm -f "${filename}" "${ffilename}" "${dfilename}"
140
141exit 0
142