1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
#!/bin/sh
set -e
# Copyright 2010 Neil Williams <codehelp@debian.org>
# Copyright 2010 Philip Hands <phil@hands.com>
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# using the package directly means we don't have to deal
# with multiline Depends
while [ -n "$1" ]; do
case "$1" in
-\?|-h|--help)
shift
echo "-f path to a .deb filename; -i install the packages now."
exit 0
;;
-f|--file)
shift
FILE=$1
shift
;;
-i|--install)
shift
INSTALL=1
;;
-y|--yes)
shift
YES=1
;;
*)
FILE=$1
shift
;;
esac
done
if [ ! -f "$FILE" -o ! -r "$FILE" ]; then
echo "Please specify a path to a debian package file with the -f command."
exit 2
fi
DEPS=$(dpkg-deb -f $FILE Depends) || exit 3
IFS=,
CMD=
ERR=
for pkg in $DEPS; do
CHECK=
name=$(echo $pkg|sed -e 's/^ //'|cut -d' ' -f1)
if [ "apt" = "$name" ]; then
continue
fi
if [ -z "$name" ]; then
continue
fi
orlist=$(echo $pkg|grep "|" || true)
while [ -n "$orlist" ]; do
ORPKG=`echo $pkg|cut -d'|' -f2|sed -e 's/^ //'`
ALTERNATE="$ALTERNATE $ORPKG"
orlist=$(echo $orlist | sed -e "s/.*$ORPKG//;s/^ *//;s/ *$//")
ALTERNATE=$(echo $ALTERNATE|sed -e 's/^ *//;s/ *$//')
pkg=$(echo $pkg|sed -e "s/|//;s/$ORPKG//;s/^ *//;s/ *$//")
done
if [ -n `echo $pkg|grep '('` ]; then
VERLIMIT=`echo $pkg|cut -d'(' -f2|tr -d ')'|tr -d '\n'|grep -v $name || true`
VERCMP=`echo $VERLIMIT|sed -e 's/\(.*\) \(.*\)/\1/'`
VERLIMIT=`echo $VERLIMIT|sed -e 's/\(.*\) \(.*\)/\2/'`
fi
POLICY=`LC_ALL=C apt-cache policy $name 2>/dev/null|grep Candidate|cut -d':' -f2-3|tr -d ' '`
if [ -n "$POLICY" ]; then
if [ -n "$VERLIMIT" ]; then
set +e
CHECK=`dpkg --compare-versions $POLICY "$VERCMP" $VERLIMIT ; echo $?`
set -e
if [ -z "$CHECK" ]; then
VERLIMIT=
VERCMP=
name=$(echo $ALTERNATE|sed -e 's/^ //'|cut -d' ' -f1)
if [ -n `echo $ALTERNATE|grep '('` ]; then
VERLIMIT=`echo $ALTERNATE|cut -d'(' -f2|tr -d ')'|tr -d '\n'|grep -v $name || true`
VERCMP=`echo $VERLIMIT|sed -e 's/\(.*\) \(.*\)/\1/'`
VERLIMIT=`echo $VERLIMIT|sed -e 's/\(.*\) \(.*\)/\2/'`
fi
POLICY=`LC_ALL=C apt-cache policy $name 2>/dev/null|grep Candidate|cut -d':' -f2-3|tr -d ' '`
if [ -n "$POLICY" ]; then
if [ -n "$VERLIMIT" ]; then
set +e
CHECK=`dpkg --compare-versions $POLICY "$VERCMP" $VERLIMIT ; echo $?`
set -e
fi
fi
fi
fi
else
ERR="$ERR $name "
fi
if [ -z "$CHECK" -o "0" != "$CHECK" ]; then
if [ -n "$VERCMP" ]; then
echo "$name ($VERCMP $VERLIMIT) is NOT available."
ERR="$ERR $name ($VERCMP $VERLIMIT) "
fi
fi
if [ -n "$YES" ]; then
CMD="$CMD -y $name"
fi
MISSING=`dpkg-query -W -f '\${Status}' $name 2>/dev/null | grep "install ok installed"|sed -e 's/ //g'`
if [ -z "$MISSING" ]; then
CMD="$CMD $name"
fi
done
if [ -n "$ERR" ]; then
echo Some packages are not available: $ERR
exit 1
fi
if [ -n "$INSTALL" ]; then
eval apt-get install "$CMD"
dpkg -i $FILE
elif [ -n "$CMD" ]; then
echo apt-get install ${CMD}
fi
|