106965442SAndy Fiddaman#!/usr/bin/ksh
206965442SAndy Fiddaman#
306965442SAndy Fiddaman# This file and its contents are supplied under the terms of the
406965442SAndy Fiddaman# Common Development and Distribution License ("CDDL"), version 1.0.
506965442SAndy Fiddaman# You may only use this file in accordance with the terms of version
606965442SAndy Fiddaman# 1.0 of the CDDL.
706965442SAndy Fiddaman#
806965442SAndy Fiddaman# A full copy of the text of the CDDL should have accompanied this
906965442SAndy Fiddaman# source. A copy of the CDDL is also available via the Internet at
1006965442SAndy Fiddaman# http://www.illumos.org/license/CDDL.
1106965442SAndy Fiddaman
1206965442SAndy Fiddaman# Copyright 2021 OmniOS Community Edition (OmniOSce) Association.
1306965442SAndy Fiddaman
1406965442SAndy Fiddamanset -o errexit -o pipefail
1506965442SAndy Fiddamantrap 'echo Error occured at line $LINENO' ERR
1606965442SAndy Fiddaman
1706965442SAndy Fiddamanif [[ ! -v CODEMGR_WS ]] || (($# < 1)); then
1806965442SAndy Fiddaman	cat <<- EOM
1906965442SAndy FiddamanThis script should be run within a bldenv by issuing 'make update' in
2006965442SAndy Fiddaman\$CODEMGR_WS/usr/src/data/zoneinfo
2106965442SAndy Fiddaman	EOM
2206965442SAndy Fiddaman	exit 1
2306965442SAndy Fiddamanfi
2406965442SAndy Fiddaman
2525b05a3eSAndy FiddamanMANIFEST=$CODEMGR_WS/usr/src/pkg/manifests/system-data-zoneinfo.p5m
2606965442SAndy FiddamanPREFIX=usr/share/lib/zoneinfo
2706965442SAndy Fiddaman
2806965442SAndy Fiddamanif [[ ! -f "$MANIFEST" ]]; then
2906965442SAndy Fiddaman	echo "Could not find $MANIFEST"
3006965442SAndy Fiddaman	exit 1
3106965442SAndy Fiddamanfi
3206965442SAndy Fiddaman
33*427b4c5cSAndy Fiddamanfunction find_cmd {
34*427b4c5cSAndy Fiddaman	typeset cmd="$1"
35*427b4c5cSAndy Fiddaman	typeset var=$(echo $cmd | tr '[:lower:]' '[:upper:]')
36*427b4c5cSAndy Fiddaman	typeset -n path="$var"
37*427b4c5cSAndy Fiddaman	path=$(whence -fp "$cmd")
38*427b4c5cSAndy Fiddaman	if (($? != 0)) || [ ! -x "$path" ]; then
39*427b4c5cSAndy Fiddaman		echo "Cannot find executable '$cmd' in PATH"
40*427b4c5cSAndy Fiddaman		exit 1
41*427b4c5cSAndy Fiddaman	fi
42*427b4c5cSAndy Fiddaman}
43*427b4c5cSAndy Fiddaman
44*427b4c5cSAndy Fiddaman# This script uses a few commands which are not part of illumos and are
45*427b4c5cSAndy Fiddaman# expected to be available in the path.
46*427b4c5cSAndy Fiddamanfind_cmd pkgfmt
47*427b4c5cSAndy Fiddaman
4806965442SAndy Fiddamantypeset -A links
4906965442SAndy Fiddamantypeset -A targets
5006965442SAndy Fiddamanfor f in "$@"; do
5106965442SAndy Fiddaman	if [[ ! -r "$f" ]]; then
5206965442SAndy Fiddaman		echo "Could not read $f"
5306965442SAndy Fiddaman		exit 1
5406965442SAndy Fiddaman	fi
5506965442SAndy Fiddaman	echo "+++ Processing input file $f"
5606965442SAndy Fiddaman	grep '^Link' "$f" | tr -s '[:space:]' | \
5706965442SAndy Fiddaman	    while IFS=$' \t' read _ tgt src _; do
5806965442SAndy Fiddaman
5906965442SAndy Fiddaman		osrc=$src
6006965442SAndy Fiddaman		targets[$tgt]=1
6106965442SAndy Fiddaman
6206965442SAndy Fiddaman		printf "    %20s => %s\n" $src $tgt
6306965442SAndy Fiddaman
6406965442SAndy Fiddaman		while [[ $src == */* && ${src%%/*} == ${tgt%%/*} ]]; do
6506965442SAndy Fiddaman			src=${src#*/}
6606965442SAndy Fiddaman			tgt=${tgt#*/}
6706965442SAndy Fiddaman		done
6806965442SAndy Fiddaman
6906965442SAndy Fiddaman		# On no matches, grep -o exits non-zero, hence the || true to
7006965442SAndy Fiddaman		# satisfy the shell's errexit option.
7106965442SAndy Fiddaman		sslashes=$(echo $src | grep -o / | wc -l || true)
7206965442SAndy Fiddaman		r=
7306965442SAndy Fiddaman		while ((sslashes-- > 0)); do
7406965442SAndy Fiddaman			r+="../"
7506965442SAndy Fiddaman		done
7606965442SAndy Fiddaman		links[$osrc]="$r$tgt"
7706965442SAndy Fiddaman	done
7806965442SAndy Fiddamandone
7906965442SAndy Fiddaman
8006965442SAndy Fiddamantmpf1=`mktemp`
8106965442SAndy Fiddamantmpf2=`mktemp`
8206965442SAndy Fiddamantrap 'rm -f $tmpf1 $tmpf2' EXIT
8306965442SAndy Fiddaman[[ -n "$tmpf1" && -f "$tmpf1" ]]
8406965442SAndy Fiddaman[[ -n "$tmpf2" && -f "$tmpf2" ]]
8506965442SAndy Fiddaman
8606965442SAndy Fiddamancp $MANIFEST $tmpf1
87*427b4c5cSAndy Fiddaman$PKGFMT -u $tmpf1
8806965442SAndy Fiddaman
8906965442SAndy Fiddamanecho "+++ Removing existing hardlinks from manifest"
9006965442SAndy Fiddamanegrep -v "^hardlink " $tmpf1 > $tmpf2
9106965442SAndy Fiddamanmv $tmpf2 $tmpf1
9206965442SAndy Fiddaman
9306965442SAndy Fiddamanecho "+++ Removing existing targets from manifest"
9406965442SAndy Fiddamanfor i in "${!links[@]}" "${!targets[@]}"; do
9506965442SAndy Fiddaman	egrep -v "^file path=$PREFIX/$i\$" $tmpf1 > $tmpf2
9606965442SAndy Fiddaman	mv $tmpf2 $tmpf1
9706965442SAndy Fiddamandone
9806965442SAndy Fiddaman
9906965442SAndy Fiddamanecho "+++ Adding new entries to manifest"
10006965442SAndy Fiddaman{
10106965442SAndy Fiddaman	for i in "${!targets[@]}"; do
10206965442SAndy Fiddaman		echo "file path=$PREFIX/$i"
10306965442SAndy Fiddaman	done
10406965442SAndy Fiddaman	for i in "${!links[@]}"; do
10506965442SAndy Fiddaman		echo "hardlink path=$PREFIX/$i target=${links[$i]}"
10606965442SAndy Fiddaman	done
10706965442SAndy Fiddaman} >> $tmpf1
10806965442SAndy Fiddaman
10906965442SAndy Fiddamanecho "+++ Formatting manifest"
110*427b4c5cSAndy Fiddaman$PKGFMT -fv2 $tmpf1
11106965442SAndy Fiddaman
11206965442SAndy Fiddamanmv $tmpf1 $MANIFEST
11306965442SAndy Fiddaman
114