summaryrefslogtreecommitdiff
path: root/bootstrap/pkg.sh
diff options
context:
space:
mode:
authorgrant <grant@pkgsrc.org>2004-03-11 13:03:58 +0000
committergrant <grant@pkgsrc.org>2004-03-11 13:03:58 +0000
commitdc1847996633ea9194a36b797e49f693c9f5fc72 (patch)
tree3434d463e0789e4ff8d9e78dbc0ec913e5aec800 /bootstrap/pkg.sh
parent19aa548dc050dbaf77264e958e3f443d950ee350 (diff)
downloadpkgsrc-dc1847996633ea9194a36b797e49f693c9f5fc72.tar.gz
import the required bits of bootstrap-pkgsrc from 20040311.
Diffstat (limited to 'bootstrap/pkg.sh')
-rwxr-xr-xbootstrap/pkg.sh569
1 files changed, 569 insertions, 0 deletions
diff --git a/bootstrap/pkg.sh b/bootstrap/pkg.sh
new file mode 100755
index 00000000000..28fb82c45ea
--- /dev/null
+++ b/bootstrap/pkg.sh
@@ -0,0 +1,569 @@
+#! /bin/sh
+#
+# $NetBSD: pkg.sh,v 1.1.1.1 2004/03/11 13:03:59 grant 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
+# for the NetBSD project.
+# 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
+
+version=20020615
+
+opsys=`uname -s`
+
+case "$opsys" in
+Darwin)
+ awkprog=/usr/bin/awk
+ catprog=/bin/cat
+ chmodprog=/bin/chmod
+ cpprog=/bin/cp
+ lnprog=/bin/ln
+ mkdirprog=/bin/mkdir
+ rmprog=/bin/rm
+ sedprog=/usr/bin/sed
+ ;;
+Linux)
+ awkprog=/usr/bin/awk
+ catprog=/bin/cat
+ chmodprog=/bin/chmod
+ cpprog=/bin/cp
+ lnprog=/bin/ln
+ mkdirprog=/bin/mkdir
+ rmprog=/bin/rm
+ sedprog=/bin/sed
+ ;;
+NetBSD)
+ awkprog=/usr/bin/awk
+ catprog=/bin/cat
+ chmodprog=/bin/chmod
+ cpprog=/bin/cp
+ lnprog=/bin/ln
+ mkdirprog=/bin/mkdir
+ rmprog=/bin/rm
+ sedprog=/usr/bin/sed
+ ;;
+SunOS)
+ awkprog=/usr/bin/nawk
+ catprog=/usr/bin/cat
+ chmodprog=/usr/bin/chmod
+ cpprog=/usr/bin/cp
+ lnprog=/usr/bin/ln
+ mkdirprog=/usr/bin/mkdir
+ rmprog=/usr/bin/rm
+ sedprog=/usr/xpg4/bin/sed
+ ;;
+*)
+ awkprog=awk
+ catprog=cat
+ chmodprog=chmod
+ cpprog=cp
+ lnprog=ln
+ mkdirprog=mkdir
+ rmprog=rm
+ sedprog=sed
+ ;;
+esac
+
+getpkg()
+{
+ if test -d $PKG_DBDIR/$1; then
+ d=$PKG_DBDIR/$1
+ else
+ d="`echo $PKG_DBDIR/${1}-*`"
+ fi
+ echo $d
+}
+
+case "$DIGESTPROG" in
+"") DIGESTPROG=/usr/pkg/bin/digest ;;
+esac
+case "$PKG_DBDIR" in
+"") PKG_DBDIR=/var/db/pkg ;;
+esac
+case "$PKG_DIGEST" in
+"") PKG_DIGEST=sha1 ;;
+esac
+
+ALLDIGESTS="sha1 sha512"
+
+case "$0" in
+*pkg_create) cmd=create ;;
+*pkg_delete) cmd=delete ;;
+*pkg_info) cmd=info ;;
+*pkg.sh|*pkg) cmd=$1; shift ;;
+esac
+
+case "$cmd" in
+create)
+ if [ $# -lt 1 ]; then
+ echo "Usage: pkg create ..." > /dev/stderr
+ exit 1
+ fi
+
+ BUILDINFOFILE="" # done
+ BUILDVERSIONFILE="" # done
+ CONFLICTS="" # done
+ comment="" # done
+ DISPLAYFILE="" # done
+ DESCRFILE="" # done
+ plist="" # done
+ minush=no
+ realprefix=""
+ installfile="" # done
+ deinstallfile="" # done
+ srcdir=""
+ relsymlinks=no
+ mtreefile=""
+ plistonly=no
+ PREREQS=""
+ #prefix=""
+ reorder=no
+ requirements=""
+ allsizefile="" # done
+ thissizefile="" # done
+ updatefilecache=yes
+ excludefrom=""
+
+ while [ $# -gt 0 ]; do
+ case "$1" in
+ -B) BUILDINFOFILE="$2"; shift ;;
+ -C) CONFLICTS="$2"; shift ;;
+ -D) DISPLAYFILE="$2"; shift ;;
+ -I) realprefix="$2"; shift ;;
+ -L) srcdir="$2"; shift ;;
+ -O) plistonly=yes ;;
+ -P) PREREQS="$PREREQS $2"; shift ;;
+ -R) reorder=yes ;;
+ -S) allsizefile="$2"; shift ;;
+ -U) updatefilecache=no ;;
+ -V) echo $version; exit 0 ;;
+ -X) excludefrom="$excludefrom $2"; shift ;;
+ -b) BUILDVERSIONFILE="$2"; shift ;;
+ -c) case "$2" in
+ -*) comment="`echo $2 | $sedprog -e 's|^-||'`"; shift ;;
+ *) comment=`$catprog $2` ;;
+ esac
+ shift ;;
+ -d) DESCRFILE=$2; shift ;;
+ -f) plist="$2"; shift ;;
+ -h) minush=yes ;;
+ -i) installfile="$2"; shift ;;
+ -k) deinstallfile="$2"; shift ;;
+ -l) relsymlinks=yes ;;
+ -m) mtreefile="$2"; shift ;;
+ -p) PREFIX="$2"; shift ;;
+ -r) requirements="$2"; shift ;;
+ -s) thissizefile="$2"; shift ;;
+ -t) shift ;;
+ -v) set -x ;;
+ --) shift; break ;;
+ *) break ;;
+ esac
+ shift
+ done
+
+ PKGNAME=$1
+
+ if [ ! -d $PKG_DBDIR/$PKGNAME ]; then
+ $mkdirprog $PKG_DBDIR/$PKGNAME
+ fi
+
+ if [ -f "$BUILDINFOFILE" ]; then
+ $cpprog $BUILDINFOFILE $PKG_DBDIR/$PKGNAME/+BUILD_INFO
+ fi
+ if [ -f "$BUILDVERSIONFILE" ]; then
+ $cpprog $BUILDVERSIONFILE $PKG_DBDIR/$PKGNAME/+BUILD_VERSION
+ fi
+ echo $comment > $PKG_DBDIR/$PKGNAME/+COMMENT
+ $cpprog $DESCRFILE $PKG_DBDIR/$PKGNAME/+DESC
+
+ case "$installfile" in
+ "") ;;
+ *) $cpprog $installfile $PKG_DBDIR/$PKGNAME/+INSTALL ;;
+ esac
+ case "$deinstallfile" in
+ "") ;;
+ *) $cpprog $deinstallfile $PKG_DBDIR/$PKGNAME/+DEINSTALL ;;
+ esac
+ case "$DISPLAYFILE" in
+ "") ;;
+ *) $cpprog $DISPLAYFILE $PKG_DBDIR/$PKGNAME/+DISPLAY ;;
+ esac
+ case "$allsizefile" in
+ "") ;;
+ *) $cpprog $allsizefile $PKG_DBDIR/$PKGNAME/+SIZE_ALL ;;
+ esac
+ case "$thissizefile" in
+ "") ;;
+ *) $cpprog $thissizefile $PKG_DBDIR/$PKGNAME/+SIZE_PKG ;;
+ esac
+
+ export PREFIX PKGNAME CONFLICTS PREREQS DIGESTPROG PKG_DIGEST
+
+ $awkprog '
+ BEGIN {
+ if (ENVIRON["CONFLICTS"] != "") {
+ cflc = split(ENVIRON["CONFLICTS"], cflv);
+ for (i = 1 ; i <= cflc ; i++)
+ printf("@pkgcfl %s\n", cflv[i])
+ }
+ if (ENVIRON["PREREQS"] != "") {
+ prec = split(ENVIRON["PREREQS"], prev);
+ for (i = 1 ; i <= prec ; i++)
+ printf("@pkgdep %s\n", prev[i])
+ }
+ prefix = ENVIRON["PREFIX"];
+ printf("@name %s\n@cwd %s\n", ENVIRON["PKGNAME"], prefix) }
+ /^@(comment|dirrm|src)/ { print $0; next }
+ /^@(un)?exec/ { last = filename; gsub(".*/", "", last); gsub("%f", last);
+ fc = split(filename, fv, "/"); fn = prefix; for (i = 1 ; i < fc ; i++) fn = fn "/" fv[i]; gsub("%B", fn);
+ gsub("%F", filename);
+ gsub("%D", prefix); print $0; next }
+ { filename = $0; printf("%s\n@comment MD5:", $0); cmd = sprintf("'$catprog' %s/%s | %s %s", prefix, $0, ENVIRON["DIGESTPROG"], ENVIRON["PKG_DIGEST"]); system(cmd) }
+ ' < $plist > $PKG_DBDIR/$PKGNAME/+CONTENTS
+
+ # construct the digests of all the metafiles
+ echo "#! /bin/sh" > $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo "" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo 'case $# in' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo '0) ;;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo '*) cd '$PKG_DBDIR/$PKGNAME ';;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo 'esac' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo "" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo "$awkprog '" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo 'BEGIN { ex = 0 }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo 'END { exit(ex) }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo '/^@cwd/ { prefix = $2; next }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo '/^@/ { next }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' {' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' for (done = 0 ; !done ; ) {' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' filename = prefix "/" $0;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' getline;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' if ($0 ~ /^@comment (MD5|SHA1):/) {' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' alg = dig = $2;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' gsub(":.*", "", alg);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' gsub("[A-Za-z0-9]*:", "", dig);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' cmd = sprintf("s=`'$catprog' %s | '$DIGESTPROG' %s`; if test \"%s\" != \"$s\"; then echo \"Checksum mismatch (%s): expected %s, got $s\"; fi", filename, alg, dig, filename, dig);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' if (system(cmd) != 0) ex = 1' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' done = 1;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo ' }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo "}' +CONTENTS" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo "" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo "$awkprog '" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo "BEGIN { ex = 0 }" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo "END { exit(ex) }" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo " {" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo 'cmd = sprintf("s=`'$catprog' %s | '$DIGESTPROG' %s`; if test \"%s\" != \"$s\"; then echo \"Checksum mismatch (%s): expected %s, got $s\"; fi", $1, $2, $3, $1, $3);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo "if (system(cmd) != 0) ex = 1" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ echo "}' << filesEOF" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ # construct the digests of all the metafiles
+ for f in +BUILD_INFO +BUILD_VERSION +COMMENT +CONTENTS +DEINSTALL +DESC +DISPLAY +INSTALL +SIZE_ALL +SIZE_PKG; do
+ if [ -f $PKG_DBDIR/$PKGNAME/$f ]; then
+ for dig in $ALLDIGESTS; do
+ echo "$f $dig `$catprog $PKG_DBDIR/$PKGNAME/$f | $DIGESTPROG $dig`" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ done
+ fi
+ done
+ echo "filesEOF" >> $PKG_DBDIR/$PKGNAME/+VERIFY
+ $chmodprog 0755 $PKG_DBDIR/$PKGNAME/+VERIFY
+
+ # change absolute symlinks to relative ones
+ case "$relsymlinks" in
+ yes) for f in `$awkprog '
+ $1 == "prefix" { prefix = $2; next }
+ $1 == "file" { printf("%s/%s\n", prefix, $0) }
+ ' < $PKG_DBDIR/$PKGNAME/+INVENTORY`; do
+ if [ -h $f ]; then
+ target="`ls -al $1 | awk '{ print $11 }'`"
+ case "$target" in
+ /*) echo $prefix $target $f | /usr/bin/awk '
+ {
+ pc = split($1, pv, "/");
+ tc = split($2, tv, "/");
+ for (i = tc - pc + 2 ; i <= tc ; i++)
+ linkname = linkname "../";
+ for (i = pc + 1 ; i <= tc ; i++)
+ linkname = linkname "/" tv[i];
+ cmd = sprintf("'$rmprog' -f %s && '$lnprog' -s %s %s", $3, linkname, $3);
+ exit(system(cmd));
+ }'
+ ;;
+ esac
+ fi
+ done
+ ;;
+ esac
+
+ ;;
+
+delete)
+ deinstall=yes
+ force=no
+ doit=yes
+ justdb=no
+ prefix=""
+ needs=no
+ reqs=no
+ while [ $# -gt 0 ]; do
+ case "$1" in
+ -D) deinstall=no ;;
+ -O) justdb=yes ;;
+ -R) needs=yes ;;
+ -f) force=yes ;;
+ -n) doit=no ;;
+ -p) prefix=$2; shift ;;
+ -r) reqs=yes ;;
+ esac
+ shift
+ done
+ for pkg in $@; do
+ d=`getpkg $pkg`
+ hitme=yes
+ if [ -f $d/+REQUIRED_BY ]; then
+ hitme=no
+ case "$force" in
+ yes) hitme=yes ;;
+ esac
+ case "$needs" in
+ yes) hitme=yes ;;
+ esac
+ case "$hitme" in
+ no) echo "pkg_delete: package $pkg is required by other packages:"
+ $catprog $d/+REQUIRED_BY
+ echo "pkg_delete: 1 package deletion failed"
+ continue
+ ;;
+ esac
+ fi
+ case "$hitme" in
+ yes) if [ -f $d/+VERIFY ]; then
+ $d/+VERIFY
+ fi
+ ;;
+ esac
+ case "$reqs" in
+ yes) ;;
+ esac
+ done
+ ;;
+
+info)
+ allpackages=no
+ buildinfo=no
+ buildversion=no
+ comment=no
+ display=no
+ descr=no
+ exist=no
+ filedb=no
+ plist=no
+ index=no
+ install=no
+ deinstall=no
+ entries=no
+ needs=no
+ prefix=no
+ reqby=no
+ sizeall=no
+ sizepkg=no
+ version=no
+ if [ $# -eq 0 ]; then
+ set -- -I -a
+ fi
+ while [ $# -gt 0 ]; do
+ case "$1" in
+ -B) buildinfo=yes ;;
+ -D) display=yes ;;
+ -F) filedb=yes ;;
+ -I) index=yes ;;
+ -L) entries=yes ;;
+ -S) sizeall=yes ;;
+ -V) version=yes ;;
+ -a) allpackages=yes ;;
+ -b) buildversion=yes ;;
+ -c) comment=yes ;;
+ -d) descr=yes ;;
+ -e) exist=yes ;;
+ -f) plist=yes ;;
+ -i) install=yes ;;
+ -k) deinstall=yes ;;
+ -n) needs=yes ;;
+ -p) prefix=yes ;;
+ -r) reqby=yes ;;
+ -s) sizepkg=yes ;;
+ *) break ;;
+ esac
+ shift
+ done
+ case "$version" in
+ yes) echo $version; exit 0 ;;
+ esac
+ case "$filedb" in
+ yes) echo "-F is unimplemented" ;;
+ esac
+ case "$exist" in
+ yes) echo "-e is unimplemented" ;;
+ esac
+ case "$allpackages" in
+ yes) pkglist="`(cd $PKG_DBDIR; ls -d *-*)`" ;;
+ *) pkglist="$@" ;;
+ esac
+ for pkg in $pkglist; do
+ d=`getpkg $pkg`
+ case "$buildinfo" in
+ yes) $catprog $d/+BUILD_INFO ;;
+ esac
+ case "$display" in
+ yes) if [ -f $d/+DISPLAY ]; then
+ $catprog $d/+DISPLAY
+ fi ;;
+ esac
+ case "$index" in
+ yes) echo "`echo $d | $sedprog -e 's|.*/||'` `$catprog $d/+COMMENT`" ;;
+ esac
+ case "$entries" in
+ yes) $awkprog '
+ /^@cwd/ { prefix = $2 }
+ /^@/ { next }
+ { printf("%s/%s\n", prefix, $0) }
+ ' < $d/+CONTENTS ;;
+ esac
+ case "$buildversion" in
+ yes) $catprog $d/+BUILD_VERSION ;;
+ esac
+ case "$comment" in
+ yes) $catprog $d/+COMMENT ;;
+ esac
+ case "$descr" in
+ yes) $catprog $d/+DESC ;;
+ esac
+ case "$install" in
+ yes) if [ -f $d/+INSTALL ]; then
+ $catprog $d/+INSTALL
+ fi ;;
+ esac
+ case "$deinstall" in
+ yes) if [ -f $d/+DEINSTALL ]; then
+ $catprog $d/+DEINSTALL
+ fi ;;
+ esac
+ case "$needs" in
+ yes) $awkprog '/^@pkgdep/ { print $2 }' < $d/+CONTENTS ;;
+ esac
+ case "$prefix" in
+ yes) $awkprog '/^@cwd/ { print $2; exit }' < $d/+CONTENTS ;;
+ esac
+ case "$reqby" in
+ yes) if [ -f $d/+REQUIRED_BY ]; then
+ $catprog $d/+REQUIRED_BY
+ fi ;;
+ esac
+ case "$sizeall" in
+ yes) $catprog $d/+SIZE_ALL
+ esac
+ case "$sizepkg" in
+ yes) $catprog $d/+SIZE_PKG
+ esac
+ done
+ ;;
+
+show)
+ if [ $# -lt 1 ]; then
+ echo "Usage: pkg show type packages" > /dev/stderr
+ exit 1
+ fi
+
+ showtype=$1
+ shift
+ for pkg in $@; do
+ d=`getpkg $pkg`
+ case "$d" in
+ "") echo "No such package ($pkg)" ;;
+ *)
+ case "$showtype" in
+ allsizes)
+ $catprog $d/+SIZE_ALL ;;
+ blddep|blddeps)
+ $awkprog '/^@blddep/ { print $2 }' $d/+CONTENTS ;;
+ comment)
+ $catprog $d/+COMMENT ;;
+ description|desc|descr)
+ $catprog $d/+DESC ;;
+ deinstall)
+ if [ -f $d/+DEINSTALL ]; then
+ $catprog $d/+DEINSTALL
+ fi ;;
+ display)
+ if [ -f $d/+DISPLAY ]; then
+ $catprog $d/+DISPLAY
+ fi ;;
+ files)
+ $awkprog '
+ /^@cwd/ { prefix = $2 }
+ /^@/ { next }
+ { printf("%s/%s\n", prefix, $0) }
+ ' < $d/+CONTENTS ;;
+ index)
+ echo "`echo $d | $sedprog -e 's|.*/||'` `$catprog $d/+COMMENT`" ;;
+ info)
+ $catprog $d/+BUILD_INFO ;;
+ install)
+ if [ -f $d/+INSTALL ]; then
+ $catprog $d/+INSTALL
+ fi ;;
+ prefix)
+ $awkprog '/^@cwd/ { print $2 }' $d/+CONTENTS ;;
+ prereqs|pkgdep)
+ $awkprog '/^@pkgdep/ { print $2 }' $d/+CONTENTS ;;
+ size)
+ $catprog $d/+SIZE_PKG ;;
+ version)
+ $catprog $d/+BUILD_VERSION ;;
+ *)
+ echo "Unknown type \"$showtype\""
+ exit 1 ;;
+ esac
+ esac
+ done
+ ;;
+
+version)
+ echo $version
+ exit 0
+ ;;
+
+*) echo "$0: \"$cmd\" not found"
+ exit 1
+ ;;
+esac
+
+exit 0