summaryrefslogtreecommitdiff
path: root/pkgtools/pkg_install/files/view/pkg_view.sh.in
diff options
context:
space:
mode:
authorjlam <jlam>2003-09-08 04:49:05 +0000
committerjlam <jlam>2003-09-08 04:49:05 +0000
commit8a32dd55c86606689302050fb22d60f95d696c7c (patch)
tree5f94668ed6234e7878b7875bea345141543ff13e /pkgtools/pkg_install/files/view/pkg_view.sh.in
parentbecb6b51a2685b649b7627890fdbd3d2314b5688 (diff)
downloadpkgsrc-8a32dd55c86606689302050fb22d60f95d696c7c.tar.gz
Substitute for various program paths used by the linkfarm(1) and
pkg_view(1) shell scripts.
Diffstat (limited to 'pkgtools/pkg_install/files/view/pkg_view.sh.in')
-rw-r--r--pkgtools/pkg_install/files/view/pkg_view.sh.in272
1 files changed, 272 insertions, 0 deletions
diff --git a/pkgtools/pkg_install/files/view/pkg_view.sh.in b/pkgtools/pkg_install/files/view/pkg_view.sh.in
new file mode 100644
index 00000000000..447c27813e4
--- /dev/null
+++ b/pkgtools/pkg_install/files/view/pkg_view.sh.in
@@ -0,0 +1,272 @@
+#! /bin/sh
+
+# $NetBSD: pkg_view.sh.in,v 1.1 2003/09/08 04:49:07 jlam Exp $
+
+#
+# Copyright (c) 2001 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
+
+prefix="@prefix@"
+exec_prefix="@exec_prefix@"
+sbindir="@sbindir@"
+
+# set up program definitions
+chmodprog="@CHMOD@"
+cmpprog="@CMP@"
+cpprog="@CP@"
+envprog="@ENV@"
+findprog="@FIND@"
+grepprog="@GREP@"
+linkfarmprog="@sbindir@/linkfarm"
+lnprog="@LN@"
+mkdirprog="@MKDIR@"
+paxprog="@PAX@"
+pkginfoprog="@sbindir@/pkg_info"
+rmprog="@RM@"
+rmdirprog="@RMDIR@"
+sedprog="@SED@"
+touchprog="@TOUCH@"
+
+usage() {
+ echo 'Usage: pkg_view [-n] [-v] [-i ignore] [-k pkg_dbdir_dflt] [-w viewname] [-d stowdir] [-W viewbase] add|check|delete pkgname...'
+ exit 1
+}
+
+version() {
+ $pkginfoprog -V
+ exit 0
+}
+
+checkpkg() {
+ if [ ! -d "$2/$1" ]; then
+ echo "pkg_view: \`$1' doesn't exist in \`$2'" 1>&2
+ exit 1
+ fi
+}
+
+#########################################
+# Initialization and Options Processing #
+#########################################
+
+doit=""
+stowdir=""
+viewbase=${LOCALBASE:-/usr/pkg}
+view=${PKG_VIEW:-""}
+dflt_ignorefiles=${PLIST_IGNORE_FILES:-"info/dir *[~#] *.OLD *.orig *,v"}
+dflt_pkg_dbdir=${PKG_DBDIR:-/var/db/pkg}
+ignorefiles=""
+verbose=0
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -d) stowdir=$2; shift ;;
+ -d*) stowdir=`echo $1 | $sedprog -e 's|^-d||'` ;;
+ -i) ignorefiles="$ignorefiles $2"; shift ;;
+ -i*) ignorefiles="$ignorefiles `echo $1 | $sedprog -e 's|^-i||'`" ;;
+ -k) dflt_pkg_dbdir="$2"; shift ;;
+ -k*) dflt_pkg_dbdir=`echo $1 | $sedprog -e 's|^-k||'` ;;
+ -n) doit=":" ;;
+ -V) version ;;
+ -v) verbose=`expr $verbose + 1` ;;
+ -W) viewbase=$2; shift ;;
+ -W*) viewbase=`echo $1 | $sedprog -e 's|^-p||'` ;;
+ -w) view=$2; shift ;;
+ --view=*) view=`echo $1 | $sedprog -e 's|--view=||'` ;;
+ --) shift; break ;;
+ *) break ;;
+ esac
+ shift
+done
+
+if [ $# -lt 1 ]; then
+ usage
+fi
+
+# echoN will actually give output if ${verbose} > N.
+echo1=":"
+echo2=":"
+if [ ${verbose} -gt 0 ]; then echo1=echo; fi
+if [ ${verbose} -gt 1 ]; then echo2=echo; fi
+
+action=""
+case "$1" in
+add) action=add ;;
+check) action=check ;;
+delete|rm) action=delete ;;
+*) usage ;;
+esac
+shift
+
+# if standard view, put package info into ${dflt_pkg_dbdir}
+# if not standard view, put package info into view's pkgdb
+case "$view" in
+"")
+ pkg_dbdir=${dflt_pkg_dbdir}
+ targetdir=${viewbase}
+ viewstr="the standard view"
+ ;;
+*)
+ pkg_dbdir=${viewbase}/${view}/.pkgdb
+ targetdir=${viewbase}/${view}
+ viewstr="view \"${view}\""
+ ;;
+esac
+
+# Use stowdir if it's given, else fall back to ${DEPOTBASE} or else
+# default to ${viewbase}/packages.
+#
+depot_pkg_dbdir=${stowdir:-${DEPOTBASE:-${viewbase}/packages}}
+
+case "${depot_pkg_dbdir}" in
+${pkg_dbdir})
+ echo "pkg_view: the depot and the view package database directories are the same" 1>&2
+ exit 1
+ ;;
+esac
+
+##########################
+# Shell helper functions #
+##########################
+
+# symlinks check|add|delete <pkg>
+#
+# Calls linkfarm(1) to check, add or delete the symlink farm in
+# ${targetdir}. We also ignore the right set of files when doing the
+# linkfarm operations.
+#
+symlinks() {
+ pkg=$2
+ case "$1" in
+ add) linkfarmflags="" ;;
+ check) linkfarmflags="-c" ;;
+ delete) linkfarmflags="-D" ;;
+ esac
+ if [ -f ${depot_pkg_dbdir}/$pkg/+BUILD_INFO ]; then
+ ignore=`$grepprog "^_PLIST_IGNORE_FILES=" ${depot_pkg_dbdir}/$pkg/+BUILD_INFO | $sedprog -e 's|^_PLIST_IGNORE_FILES=[ ]*||'`
+ fi
+ case "$ignore" in
+ "") ignore="${dflt_ignorefiles}" ;;
+ esac
+ dbs=`(cd ${depot_pkg_dbdir}/$pkg; echo +*)`
+ ignore="${ignore} ${ignorefiles} $dbs"
+ $doit $envprog PLIST_IGNORE_FILES="${ignore}" $linkfarmprog $linkfarmflags --target=${targetdir} --dir=${depot_pkg_dbdir} $pkg
+}
+
+#############
+# Main Loop #
+#############
+
+while [ $# -gt 0 ]; do
+ case $action in
+ add)
+ checkpkg $1 ${depot_pkg_dbdir}
+ if [ -f ${pkg_dbdir}/$1/+DEPOT ]; then
+ echo "pkg_view: \`$1' already exists in $viewstr" 1>&2
+ exit 1
+ fi
+ $echo1 "Adding $1 to ${targetdir}."
+ symlinks add $1
+ $doit $mkdirprog -p ${depot_pkg_dbdir}/$1
+ temp=${depot_pkg_dbdir}/$1/+VIEWS.$$
+ $doit $touchprog ${depot_pkg_dbdir}/$1/+VIEWS
+ $doit $cpprog ${depot_pkg_dbdir}/$1/+VIEWS ${temp}
+ case "$doit" in
+ "") ($grepprog -v '^'${pkg_dbdir}'$' ${temp} || true; echo ${pkg_dbdir}) > ${depot_pkg_dbdir}/$1/+VIEWS ;;
+ esac
+ $doit $rmprog ${temp}
+ $doit $mkdirprog -p ${pkg_dbdir}/$1
+ #
+ # Copy all of the metadata files except for +VIEWS,
+ # which is only for the depoted package, and
+ # +REQUIRED_BY, which is irrelevant for a package in
+ # a view.
+ #
+ case "$doit" in
+ "") (cd ${depot_pkg_dbdir}/$1; $paxprog -rwpe '-s|\./\+VIEWS$||' '-s|\./\+REQUIRED_BY$||' ./+* ${pkg_dbdir}/$1)
+ $sedprog -e 's|'${depot_pkg_dbdir}/$1'|'${targetdir}'|g' < ${depot_pkg_dbdir}/$1/+CONTENTS > ${pkg_dbdir}/$1/+CONTENTS
+ echo "${depot_pkg_dbdir}/$1" > ${pkg_dbdir}/$1/+DEPOT
+ ;;
+ esac
+ if [ -f ${pkg_dbdir}/$1/+INSTALL ]; then
+ $doit $chmodprog +x ${pkg_dbdir}/$1/+INSTALL
+ $doit $envprog -i PKG_PREFIX=${targetdir} ${pkg_dbdir}/$1/+INSTALL $1 VIEW-INSTALL
+ ec=$?
+ if [ $ec != 0 ]; then
+ echo "pkg_view: install script returned an error." 1>&2
+ exit $ec
+ fi
+ fi
+ ;;
+ check)
+ checkpkg $1 ${depot_pkg_dbdir}
+ $echo1 "Checking $1 in ${targetdir}."
+ symlinks check $1
+ exit $?
+ ;;
+ delete)
+ checkpkg $1 ${depot_pkg_dbdir}
+ if [ ! -f ${pkg_dbdir}/$1/+DEPOT ]; then
+ echo "pkg_view: \`$1' doesn't exist in $viewstr" 1>&2
+ exit 1
+ fi
+ $echo1 "Deleting $1 from ${targetdir}."
+ if [ -f ${pkg_dbdir}/$1/+REQUIRED_BY ]; then
+ if $cmpprog -s ${pkg_dbdir}/$1/+REQUIRED_BY /dev/null; then
+ : # not really required by another pkg
+ else
+ (echo "pkg_view: \`$1' is required by other packages:"
+ $sedprog -e 's|^| |' ${pkg_dbdir}/$1/+REQUIRED_BY) 1>&2
+ exit 1
+ fi
+ fi
+ if [ -f ${pkg_dbdir}/$1/+DEINSTALL ]; then
+ $doit $chmodprog +x ${pkg_dbdir}/$1/+DEINSTALL
+ $doit $envprog -i PKG_PREFIX=${targetdir} ${pkg_dbdir}/$1/+DEINSTALL $1 VIEW-DEINSTALL
+ ec=$?
+ if [ $ec != 0 ]; then
+ echo "pkg_view: de-install script returned an error." 1>&2
+ exit $ec
+ fi
+ fi
+ symlinks delete $1
+ temp=${depot_pkg_dbdir}/$1/+VIEWS.$$
+ $doit $cpprog ${depot_pkg_dbdir}/$1/+VIEWS ${temp}
+ case "$doit" in
+ "") ($grepprog -v '^'${pkg_dbdir}'$' ${temp} || true) > ${depot_pkg_dbdir}/$1/+VIEWS ;;
+ esac
+ $doit $rmprog ${temp}
+ $doit $rmprog -rf ${pkg_dbdir}/$1
+ ;;
+ esac
+ shift
+done
+
+exit 0