NetBSD/usr.sbin/pkg_install/view/linkfarm.sh

222 lines
5.4 KiB
Bash

#! /bin/sh
# $NetBSD: linkfarm.sh,v 1.3 2003/09/13 09:20:27 jlam Exp $
#
# Copyright (c) 2002 Alistair G. Crooks. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
# must display the following acknowledgement:
# This product includes software developed by Alistair G. Crooks.
# 4. The name of the author may not be used to endorse or promote
# products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# set -x
# set up program definitions
findprog=/usr/bin/find
grepprog=/usr/bin/grep
lnprog=/bin/ln
mkdirprog=/bin/mkdir
pkginfoprog=/usr/sbin/pkg_info
rmprog=/bin/rm
rmdirprog=/bin/rmdir
sedprog=/usr/bin/sed
sortprog=/usr/bin/sort
usage() {
echo 'Usage: linkfarm [options] package'
exit 1
}
version() {
$pkginfoprog -V
exit 0
}
checkdir() {
if [ ! -d "$1" ]; then
echo "linkfarm: \`$1' doesn't exist"
exit 1
fi
}
ignorefiles=${PLIST_IGNORE_FILES:-"info/dir *[~#] *.OLD *.orig *,v"}
linktype=-s
# default action: create a linkfarm in $target from $stowdir/$1
# i.e. linkfarm --target=${prefix}/${view} --dir=${prefix}/packages $1
#
doit=""
target=${LOCALBASE:-/usr/pkg}
stowdir=${target}/packages
subdir=""
verbose=0
# default action is to create
check=no
delete=no
create=yes
# process args - can't use getopt(1) because of '--' style args
while [ $# -gt 0 ]; do
case "$1" in
-D) delete=yes; create=no ;;
-R) delete=yes; create=yes ;;
-V) version ;;
-c) check=yes; doit=":" ;;
-d) stowdir=$2; shift ;;
-d*) stowdir=`echo $1 | $sedprog -e 's|-d||'` ;;
-s) subdir=$2; shift ;;
-s*) subdir=`echo $1 | $sedprog -e 's|-s||'` ;;
-t) target=$2; shift ;;
-t*) target=`echo $1 | $sedprog -e 's|-t||'` ;;
-n) doit=":" ;;
-v) verbose=`expr $verbose + 1` ;;
--delete) delete=yes; create=no ;;
--dir=*) stowdir=`echo $1 | $sedprog -e 's|--dir=||'` ;;
--restow) delete=yes; create=yes ;;
--subdir=*) subdir=`echo $1 | $sedprog -e 's|--subdir=||'` ;;
--target=*) target=`echo $1 | $sedprog -e 's|--target=||'` ;;
--version) version ;;
--) shift; break ;;
*) break ;;
esac
shift
done
# set the package name
package=$1
# make sure stowdir has a full pathname
case $stowdir in
/*) ;;
*) stowdir=`pwd`/$stowdir ;;
esac
# Set the directory from which we symlink.
case $subdir in
"") fromdir=$stowdir/$package ;;
*) fromdir=$stowdir/$package/$subdir ;;
esac
# Set the directory to which we symlink.
case $target in
/*) todir=$target ;;
*) todir=`pwd`/$target ;;
esac
# if we're checking the entries, check, then exit
case $check in
yes)
checkdir $fromdir
(cd $fromdir;
ex=0;
for f in `$findprog . ! -type d -print`; do
newf=`echo $f | $sedprog -e 's|^\./||'`
if [ -e $todir/$newf ]; then
ignore=no
for i in $ignorefiles; do
case $newf in
$i) ignore=yes; break ;;
esac
done
case $ignore in
no)
echo "${newf}"; ex=1 ;;
esac
fi
done
exit $ex) || exit 1
;;
esac
# if we need to get rid of old linkfarms, do it
case $delete in
yes)
checkdir $fromdir
(cd $fromdir;
for f in `$findprog . ! -type d -print`; do
newf=`echo $f | $sedprog -e 's|^\./||'`
ignore=no
for i in $ignorefiles; do
case $newf in
$i) ignore=yes; break ;;
esac
done
case $ignore in
no)
if [ $verbose -gt 0 ]; then
echo "$rmprog -f $todir/$newf"
fi
$doit $rmprog -f $todir/$f ;;
esac
done
for d in `$findprog . -type d -print | $sortprog -r`; do
if [ $verbose -gt 0 ]; then
echo "$rmdirprog $todir/$d"
fi
$doit $rmdirprog $todir/$d > /dev/null 2>&1
done)
;;
esac
# if we need to create new linkfarms, do it
case $create in
yes)
checkdir $fromdir
(cd $fromdir;
for d in `$findprog . -type d -print`; do
newd=`echo $d | $sedprog -e 's|^\./||'`
case "$d" in
"") continue ;;
esac
if [ $verbose -gt 0 ]; then
echo "$mkdirprog -p $todir/$newd"
fi
$doit $mkdirprog -p $todir/$newd > /dev/null 2>&1
done
for f in `$findprog . ! -type d -print`; do
newf=`echo $f | $sedprog -e 's|^\./||'`
ignore=no
for i in $ignorefiles; do
case $newf in
$i) ignore=yes; break ;;
esac
done
case $ignore in
no)
if [ $verbose -gt 0 ]; then
echo "$lnprog ${linktype} $fromdir/$newf $todir/$newf"
fi
$doit $lnprog ${linktype} $fromdir/$newf $todir/$newf ;;
esac
done)
;;
esac
exit 0