makeplist revision 1.19
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
34# handle args
35while getopts a:I:m:p:s: ch; do
36	case ${ch} in
37	a)
38		MACHINE_ARCH="${OPTARG}"
39		MACHINE_CPU="$(arch_to_cpu "${OPTARG}")"
40		;;
41	I)
42		realprefix=${OPTARG}
43		got_realprefix=true
44		;;
45	m)
46		MACHINE="${OPTARG}"
47		;;
48	p)
49		prefix="${OPTARG}"
50		;;
51	s)
52		setsdir="${OPTARG}"
53		;;
54	*)
55		usage
56		;;
57	esac
58done
59shift $((${OPTIND} - 1))
60if [ $# -ne 2 ]; then
61	usage
62fi
63setname="$1"
64pkgname="$2"
65
66if ! ${got_realprefix}; then
67    realprefix="${prefix}"
68fi
69
70filename="/tmp/makeplist.$$"
71ffilename="/tmp/makeplist.files.$$"
72dfilename="/tmp/makeplist.dirs.$$"
73
74list_set_files "${setname}" | \
75    ${ENV_CMD} PLISTPKG="${pkgname}" ${AWK} '
76	$2 == ENVIRON["PLISTPKG"] {
77		sub("^\\./", "", $1);
78		print $1
79	}' | ${SORT} -u > "${filename}"
80
81SELECTDIRS="-prune -type d"
82SELECTNONDIRS="! -type d -print -o ( -type d -prune )"
83
84#
85# XXX: The "lists" do not differentiate between directories and files.
86# But we need to differentiate between them, so we do so by checking
87# what's actually present in the file system.  Files or directories that
88# are listed in the "lists" but that do not exist in the file system end
89# up not appearing in our output, and this subverts a large part of the
90# purpose of the "lists".
91#
92# XXX: Given that we have to figure out what is or is not a directory
93# without assistance from the "lists", it would be much more efficient
94# to consult the metalog instead of the file system.
95#
96
97cd "${prefix}"
98#
99# Match the directories.  Use find(1) to avoid repeat calls to
100# 'test -d'.
101#
102# This is a little clever.  I cannot use 'xargs find', because
103# find wants for the option arguments to follow the path arguments.
104# So I use 'xargs echo ${SELECTDIRS}' to make a maximum-length proto-command
105# line.  I use 'read' to peel the options off the front of the
106# command-line, and 'find ${args} ${SELECTDIRS}' to put them at the end.
107#
108xargs echo ${SELECTDIRS} < "${filename}" | \
109while read ignore ignore ignore args; do
110	[ -z "${args}" ] && break 
111	${FIND} ${args} ${SELECTDIRS}
112done | ${AWK} '{ print "@dirrm " $1; }' > "${dfilename}"
113
114#
115# Match the non-directories.  Use find(1) to avoid repeat calls to
116# 'test ! -d'.  See 'Match the directories' for an explanation of the
117# cleverness.
118#
119xargs echo ${SELECTNONDIRS} < "${filename}" | \
120while read ignore ignore ignore ignore ignore ignore ignore ignore ignore \
121    ignore args; do
122	[ -z "${args}" ] && break 
123	${FIND} ${args} ${SELECTNONDIRS}
124done > "${ffilename}"
125
126cd -
127
128echo "@cwd ${realprefix}"
129if [ -s "${ffilename}" ]; then
130	cat "${ffilename}"
131fi
132if [ -s "${dfilename}" ]; then
133        ${SORT} -r "${dfilename}"
134fi
135
136rm -f "${filename}" "${ffilename}" "${dfilename}"
137
138exit 0
139