3 # Copyright (c) 2014 Lev Serebryakov.
4 # Copyright (c) 2009 Poul-Henning Kamp.
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
10 # 1. Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # 2. Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
16 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 # $0 PACKAGE_DUMP NANO_PACKAGE_DIR /usr/ports/foo/bar [package.txz]...
33 # Will symlink the packages listed, including their runtime dependencies,
34 # from the PACKAGE_DUMP to the NANO_PACKAGE_DIR.
37 : ${PORTSDIR:=/usr/ports}
40 echo "Usage: $0 [-v] package-dump-dir nano-package-dir port-dir-or-pkg ..." 1>&2
47 [ "$l" -le "$VERBOSE" ] && echo $*
51 local outputfile dumpdir type fullpath pkgname p
55 if [ -d "$p" -a -f "$p/Makefile" ] ; then
56 msg 3 "$p: full path to port"
57 pkgname=`cd "$p" && make -V pkgname`
60 elif [ -d "${PORTSDIR}/$p" -a -f "${PORTSDIR}/$p/Makefile" ] ; then
61 msg 3 "$p: path to port relative to ${PORTSDIR}}"
62 pkgname=`cd "${PORTSDIR}/$p" && make -V pkgname`
64 fullpath=${PORTSDIR}/$p
65 elif [ "${p%.txz}" != "$p" -a -f "$p" ] && pkg info -F "$p" > /dev/null 2>&1 ; then
66 msg 3 "$p: full package file name"
67 pkgname=`basename "$p" | sed 's/\.txz$//I'`
70 elif [ "${p%.txz}" != "$p" -a -f "$dumpdir/$p" ] && pkg info -F "$dumpdir/$p" > /dev/null 2>&1 ; then
71 msg 3 "$p: package file name relative to $dumpdir"
72 pkgname=`basename "$p" | sed 's/\.txz$//I'`
75 elif [ -f "$dumpdir/$p.txz" ] && pkg info -F "$dumpdir/$p.txz" > /dev/null 2>&1 ; then
76 msg 3 "$p: package name relative to $dumpdir"
77 pkgname=`basename "$p"`
79 fullpath=$dumpdir/$p.txz
81 echo "Missing port or package $p" 1>&2
84 if grep -q "^$pkgname\$" "$outputfile" ; then
85 msg 3 "$pkgname was added already"
87 elif [ "$type" = "port" ] ; then
90 rd=`make -V RUN_DEPENDS ${PORTS_OPTS}`
91 ld=`make -V LIB_DEPENDS ${PORTS_OPTS}`
93 for dep in $rd $ld ; do
94 arg=`echo $dep | sed 's/^[^:]*:\([^:]*\).*$/\1/'`
95 msg 2 "Check $arg as requirement for port $pkgname"
96 ports_recurse "$outputfile" "$dumpdir" "$arg"
100 echo "$pkgname" >> "$outputfile"
102 dir=`dirname "$p"` # Get directory from SPECIFIED path, not from full path
103 if [ "$dir" = "." ] ; then
108 deps=`pkg info -dF "$fullpath" | grep -v "$pkgname:"`
109 for dep in $deps ; do
110 arg=`echo $dep | sed -e "s|^|$dir|" -e 's/$/.txz/'`
111 msg 2 "Check $arg as requirement for package $pkgname"
112 ports_recurse "$outputfile" "$dumpdir" "$arg"
115 echo "$pkgname" >> "$outputfile"
122 while getopts v opt ; do
124 v) VERBOSE=$(($VERBOSE + 1)) ;;
128 shift $(( ${OPTIND} - 1 ))
130 if [ "$#" -lt 3 ] ; then
134 NANO_PKG_DUMP=`realpath $1`
136 if [ ! -d "$NANO_PKG_DUMP" ] ; then
137 echo "$NANO_PKG_DUMP is not a directory" 1>&2
141 NANO_PKG_DIR=`realpath $1`
143 if [ ! -d "$NANO_PKG_DIR" ] ; then
144 echo "$NANO_PKG_DIR is not a directory" 1>&2
149 rm -rf "$NANO_PKG_DIR/"*
151 PL=$NANO_PKG_DIR/_list
155 ports_recurse "$PL" "$NANO_PKG_DUMP" "$p"
158 for i in `cat "$PL"` ; do
159 if [ -f "$NANO_PKG_DUMP/$i.txz" ] ; then
160 ln -s "$NANO_PKG_DUMP/$i.txz" "$NANO_PKG_DIR"
162 echo "Package $i misssing in $NANO_PKG_DUMP" 1>&2