aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xpbuilder-satisfydepends-classic71
1 files changed, 47 insertions, 24 deletions
diff --git a/pbuilder-satisfydepends-classic b/pbuilder-satisfydepends-classic
index 79a4bc9..280ae80 100755
--- a/pbuilder-satisfydepends-classic
+++ b/pbuilder-satisfydepends-classic
@@ -26,9 +26,41 @@ export PBUILDER_PKGLIBDIR="${PBUILDER_PKGLIBDIR:-$PBUILDER_ROOT/usr/lib/pbuilder
. "$PBUILDER_PKGLIBDIR"/pbuilder-satisfydepends-funcs
-function checkbuilddep_internal () {
-# Use this function to fulfill the dependency (almost)
+# splits lines of deps (possibly with alternates) separated by commas into one
+# dep (possibly with alternates) per line; also changes all spaces to slashes
+# first as to iterate on deps with "for"; e.g. "foo, bar | baz", "foobar (>=
+# 2)" becomes "foo", "bar/|/baz", "foobar/(>=/2)"
+split_deps() {
+ tr " " "/" | awk 'BEGIN{RS=","} {print}'
+}
+# and build-conflicts
+
+# splits build-dep with alternates into one alternate per line; e.g. "foo|bar"
+# becomes "foo", "bar"
+split_alternates() {
+ echo "$*" | awk 'BEGIN{RS="|"} {print}'
+}
+
+# filters package name out of a "/" escaped simple build-dep, possibly with
+# architecture or version specifier; e.g. "/foo/(>=/2)/[i386/amd64]" becomes
+# "foo"
+get_pkg_name() {
+ echo "$*" | sed -e 's#^/*##' -e 's#[[/(].*##'
+}
+# filter operator and version of a "/" escaped versioned build-dep; e.g.
+# "foo/(>=/2)" becomes ">= 2"
+get_dep_op_and_ver() {
+ echo "$*" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\1 \2/'
+}
+
+# call apt-get in chroot in simulate mode
+apt_sim() {
+ $CHROOTEXEC /usr/bin/apt-get -s install "$@"
+}
+
+# Use this function to fulfill the dependency (almost)
+checkbuilddep_internal() {
local ARCH=$($CHROOTEXEC dpkg-architecture -qDEB_HOST_ARCH)
local INSTALLPKG
local INSTALLPKGLIST
@@ -37,14 +69,11 @@ function checkbuilddep_internal () {
local SATISFIED
local APTFLAG="-o APT::Install-Recommends=false"
echo " -> Attempting to parse the build-deps "
- for INSTALLPKGMULTI in $(get_build_deps |
- tr " " "/" | \
- awk 'BEGIN{RS=","} {print}'); do
+ for INSTALLPKGMULTI in $(get_build_deps | split_deps); do
echo " -> Considering build-dep$(echo "$INSTALLPKGMULTI" | tr "/" " " )"
SATISFIED="no"
- for INSTALLPKG in $(echo "$INSTALLPKGMULTI" | \
- awk 'BEGIN{RS="|"} {print}'); do
- CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's#^/*##' -e 's#[[/(].*##')
+ for INSTALLPKG in $(split_alternates "$INSTALLPKGMULTI"); do
+ CURRENTREALPKGNAME=$(get_pkg_name "$INSTALLPKG")
if echo "$INSTALLPKG" | grep -q '\['; then
if checkbuilddep_archdeps "$INSTALLPKG" "$ARCH"; then
SATISFIED="yes"
@@ -54,21 +83,19 @@ function checkbuilddep_internal () {
fi
if echo "$INSTALLPKG" | grep -q '('; then
#echo "Debug: $INSTALLPKG"
- if ! checkbuilddep_versiondeps $CURRENTREALPKGNAME \
- $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\1/') \
- $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\2/') ; then
+ if ! checkbuilddep_versiondeps "$CURRENTREALPKGNAME" `get_dep_op_and_ver "$INSTALLPKG"`; then
echo " -> Does not satisfy version, not trying"
continue
fi
fi
echo " -> Trying $CURRENTREALPKGNAME"
- if $CHROOTEXEC /usr/bin/apt-get -s install $APTFLAG $INSTALLPKGLIST $CURRENTREALPKGNAME >& /dev/null; then
+ if apt_sim $APTFLAG $INSTALLPKGLIST $CURRENTREALPKGNAME >& /dev/null; then
SATISFIED="yes"
INSTALLPKGLIST="$INSTALLPKGLIST $CURRENTREALPKGNAME"
else
echo " -> Cannot install $CURRENTREALPKGNAME; apt errors follow:"
- if $CHROOTEXEC /usr/bin/apt-get -s install $APTFLAG $INSTALLPKGLIST "$CURRENTREALPKGNAME"; then
+ if apt_sim $APTFLAG $INSTALLPKGLIST "$CURRENTREALPKGNAME"; then
:
fi
# package could not be found. -- looking for alternative.
@@ -77,13 +104,13 @@ function checkbuilddep_internal () {
if [ -n "$PROVIDED" ]; then
# something provides this package
echo " -> Considering $PROVIDED to satisfy the dependency "
- if $CHROOTEXEC /usr/bin/apt-get -s install $APTFLAG $INSTALLPKGLIST $PROVIDED >& /dev/null; then
+ if apt_sim $APTFLAG $INSTALLPKGLIST $PROVIDED >& /dev/null; then
SATISFIED="yes";
INSTALLPKGLIST="$INSTALLPKGLIST $PROVIDED"
else
# show the error for diagnostic purposes
echo " -> Cannot install $PROVIDED; apt errors follow:"
- if $CHROOTEXEC /usr/bin/apt-get -s install $APTFLAG $INSTALLPKGLIST $PROVIDED; then
+ if apt_sim $APTFLAG $INSTALLPKGLIST $PROVIDED; then
:
fi
fi
@@ -115,10 +142,8 @@ function checkbuilddep_internal () {
fi
# start processing build-conflicts.
- for INSTALLPKG in $(get_build_conflicts |
- tr " " "/" | \
- awk 'BEGIN{RS=","} {print}'); do
- CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's#^/*##' -e 's#[[/(].*##')
+ for INSTALLPKG in $(get_build_conflicts | split_deps); do
+ CURRENTREALPKGNAME=$(get_pkg_name "$INSTALLPKG")
echo " -> Considering $CURRENTREALPKGNAME"
if echo "$INSTALLPKG" | grep -q '\['; then
@@ -130,16 +155,14 @@ function checkbuilddep_internal () {
fi
if echo "$INSTALLPKG" | grep -q '('; then
# this package has version-conflicts
- if ! checkbuilddep_versiondeps $CURRENTREALPKGNAME \
- $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\1/') \
- $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\2/'); then
+ if ! checkbuilddep_versiondeps "$CURRENTREALPKGNAME" `get_dep_op_and_ver "$INSTALLPKG"`; then
echo "I: Satisfies version, not trying"
continue
fi
fi
# if package exists, remove it.
- if $CHROOTEXEC /usr/bin/dpkg -s $(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}') 2>&1 | grep -q ^Package:; then
+ if $CHROOTEXEC /usr/bin/dpkg -s "$CURRENTREALPKGNAME" 2>&1 | grep -q ^Package:; then
if ! $CHROOTEXEC /usr/bin/apt-get -y remove $CURRENTREALPKGNAME ; then
echo "E: Could not satisfy build-conflicts" >&2
exit 1
@@ -152,7 +175,7 @@ function checkbuilddep_internal () {
}
-function print_help () {
+print_help() {
# print out help message
cat <<EOF
pbuilder-satisfydepends -- satisfy dependencies