aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoïc Minier <lool@dooz.org>2007-04-01 09:00:08 +0200
committerLoïc Minier <lool@dooz.org>2007-04-01 09:00:08 +0200
commitefab133bb85277bb858d8660f3e748b24c95d26a (patch)
tree26db0b7a0278444b4d5e8976fb07370d6f7119ca
parent275a316ca8672eb90a5b38e3ff00d9f9ca9c07c1 (diff)
parent0b460b77a4919f3929f91eccebc0052f8e304122 (diff)
downloadpbuilder-efab133bb85277bb858d8660f3e748b24c95d26a.tar
pbuilder-efab133bb85277bb858d8660f3e748b24c95d26a.tar.gz
Merge branch 'satisfydepends-aptitude'
Conflicts: ChangeLog debian/changelog
-rw-r--r--ChangeLog7
-rw-r--r--Makefile2
-rw-r--r--debian/changelog6
-rw-r--r--pbuilder-satisfydepends202
-rwxr-xr-xpbuilder-satisfydepends-aptitude113
-rwxr-xr-xpbuilder-satisfydepends-checkparams74
-rwxr-xr-xpbuilder-satisfydepends-experimental248
-rwxr-xr-xpbuilder-satisfydepends-funcs154
-rwxr-xr-xpbuilderrc11
-rw-r--r--pbuilderrc.510
10 files changed, 439 insertions, 388 deletions
diff --git a/ChangeLog b/ChangeLog
index 96b1771..a4554ad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-04-01 Loic Minier <lool@dooz.org>
+
+ * pbuilder-satisfydepends*:
+ - Modularize with new -funcs and -checkparams shared sources.
+ - New pbuilder-satisfydepends-aptitude resolver based on aptitude.
+ - Cleanups.
+
2007-03-31 Junichi Uekawa <dancer@debian.org>
* pbuilder-user-mode-linux: spacing fix.
diff --git a/Makefile b/Makefile
index 7831be7..a24c194 100644
--- a/Makefile
+++ b/Makefile
@@ -15,6 +15,7 @@ SHELLCODES=pbuilder-buildpackage \
pbuilder-modules \
pbuilder-runhooks \
pbuilder-satisfydepends \
+ pbuilder-satisfydepends-aptitude \
pbuilder-satisfydepends-experimental \
pbuilder-updatebuildenv \
pbuilder-user-mode-linux \
@@ -71,6 +72,7 @@ install:
$(INSTALL_EXECUTABLE) pdebuild-user-mode-linux $(DESTDIR)/usr/bin
$(INSTALL_EXECUTABLE) debuild-pbuilder $(DESTDIR)/usr/bin
$(INSTALL_EXECUTABLE) pbuilder-satisfydepends $(DESTDIR)/usr/lib/pbuilder/
+ $(INSTALL_EXECUTABLE) pbuilder-satisfydepends-aptitude $(DESTDIR)/usr/lib/pbuilder/
$(INSTALL_EXECUTABLE) pbuilder-satisfydepends-experimental $(DESTDIR)/usr/lib/pbuilder/
$(INSTALL_EXECUTABLE) pdebuild-internal $(DESTDIR)/usr/lib/pbuilder/
$(INSTALL_FILE) pbuilderrc $(DESTDIR)/etc
diff --git a/debian/changelog b/debian/changelog
index a8e871d..e24b0e7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -6,7 +6,11 @@ pbuilder (0.166) UNRELEASED; urgency=low
* Bug fix: "pbuilder-uml: --uml-ip broken", thanks to Paul TBBle Hampson
(Closes: #416920).
- -- Junichi Uekawa <dancer@debian.org> Sat, 31 Mar 2007 23:38:20 +0900
+ [ Loic Minier ]
+ * New pbuilder-satisfydepends-aptitude resolver based on aptitude; based on
+ an idea by Mike Hommey; closes: #337015.
+
+ -- Loic Minier <lool@dooz.org> Sun, 01 Apr 2007 08:58:21 +0200
pbuilder (0.165) unstable; urgency=low
diff --git a/pbuilder-satisfydepends b/pbuilder-satisfydepends
index b619544..e0f7659 100644
--- a/pbuilder-satisfydepends
+++ b/pbuilder-satisfydepends
@@ -15,73 +15,12 @@
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
#
-# module to satisfy dependency.
+# module to satisfy build dependencies; default flavor
set -e
-function checkbuilddep_versiondeps () {
- local PACKAGE="$1"
- local COMPARESTRING="$2"
- local DEPSVERSION="$3"
- local PACKAGEVERSIONS=$( ( $CHROOTEXEC /usr/bin/apt-cache show "$PACKAGE" ) | sed -n 's/^Version: \(.*\)$/\1/p' | xargs)
- # no versioned provides.
- if [ "${FORCEVERSION}" = "yes" ]; then
- return 0;
- fi
- for PACKAGEVERSION in $PACKAGEVERSIONS ; do
- if dpkg --compare-versions "$PACKAGEVERSION" "$COMPARESTRING" "$DEPSVERSION"; then
- # satisfies depends
- return 0;
- fi
- done
- echo " Tried versions: $PACKAGEVERSIONS"
- # cannot satisfy depends
- return 1;
-}
-
-function expand_arch () {
- local ARCH="$1"
- local EXPANDED_ARCH
-
- # just keep the original behavior.
- echo "$ARCH"
- return
-
- # the following may be used if dpkg change is set to stone.
- if echo "$ARCH" | grep "-" > /dev/null; then
- EXPANDED_ARCH=$ARCH
- else
- EXPANDED_ARCH="linux-$ARCH"
- fi
- local WC1=$(echo $EXPANDED_ARCH | sed 's/^[^-]*/any/')
- local WC2=$(echo $EXPANDED_ARCH | sed 's/[^-]*$/any/')
- echo "$ARCH\\|$EXPANDED_ARCH\\|$WC1\\|$WC2"
-}
-
-function checkbuilddep_archdeps () {
- # returns FALSE on INSTALL
- local INSTALLPKG="$1"
- local ARCH="$2"
- if echo "$INSTALLPKG" | sed 's/.*\(\[.*\]\)/\1/' | grep "[[/][!]\($(expand_arch $ARCH)\)[]/]" > /dev/null; then
- # if !$ARCH exists in there, ERROR.
- return 0;
- fi
- if ! echo "$INSTALLPKG" | sed 's/.*\(\[.*\]\)/\1/' | grep "[!]" > /dev/null; then
- if ! echo "$INSTALLPKG" | sed 's/.*\(\[.*\]\)/\1/' | grep "[[/]\($(expand_arch $ARCH)\)[]/]" > /dev/null; then
- # if $ARCH does not exist, ERROR.
- return 0;
- fi
- fi
- return 1;
-}
-
-function checkbuilddep_provides () {
- local PACKAGENAME="$1"
- # PROVIDED needs to be used outside of this function.
- PROVIDED=$($CHROOTEXEC /usr/bin/apt-cache showpkg $PACKAGENAME | awk '{p=0}/^Reverse Provides:/,/^$/{p=1}{if(p && ($0 !~ "Reverse Provides:")){PACKAGE=$1}} END{print PACKAGE}')
-}
+. /usr/lib/pbuilder/pbuilder-satisfydepends-funcs
function checkbuilddep_internal () {
# Use this function to fulfill the dependency (almost)
@@ -93,61 +32,53 @@ function checkbuilddep_internal () {
local CURRENTREALPKGNAME
local SATISFIED
echo " -> Attempting to parse the build-deps $Id$"
- for INSTALLPKGMULTI in $(cat ${DEBIAN_CONTROL} | \
- awk '
-BEGIN{source=1}
-/^$/ {source=0}
-/^Source:/ {source=1}
-/^[^ ]*:/ {p=0}
-tolower($0) ~ /^'"${BD_REGEXP}"':/ {p=1}
-{if(p && source) {print $0}}' | \
- sed 's/^[^: ]*://' | \
+ for INSTALLPKGMULTI in $(get_control_re "$DEBIAN_CONTROL" "$BD_REGEXP" |
tr " " "/" | \
awk 'BEGIN{RS=","} {print}'); 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/[[/(].*//')
- if echo "$INSTALLPKG" | grep '\[' > /dev/null ; then
+ CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's#^/*##' -e 's#[[/(].*##')
+ if echo "$INSTALLPKG" | grep -q '\['; then
if checkbuilddep_archdeps "$INSTALLPKG" "$ARCH"; then
SATISFIED="yes"
echo " -> This package is not for this architecture"
- continue;
+ continue
fi
fi
- if echo "$INSTALLPKG" | grep '[(]' > /dev/null; then
+ 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 \
+ $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\1/') \
+ $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\2/') ; then
echo " -> Does not satisfy version, not trying"
- continue;
+ continue
fi
fi
- echo " -> Trying ${CURRENTREALPKGNAME}"
+ echo " -> Trying $CURRENTREALPKGNAME"
- if $CHROOTEXEC /usr/bin/apt-get -s install ${INSTALLPKGLIST} ${CURRENTREALPKGNAME} >& /dev/null; then
+ if $CHROOTEXEC /usr/bin/apt-get -s install $INSTALLPKGLIST $CURRENTREALPKGNAME >& /dev/null; then
SATISFIED="yes"
- INSTALLPKGLIST="${INSTALLPKGLIST} ${CURRENTREALPKGNAME}"
+ INSTALLPKGLIST="$INSTALLPKGLIST $CURRENTREALPKGNAME"
else
- echo " -> Cannot install ${CURRENTREALPKGNAME}; apt errors follow:"
- if $CHROOTEXEC /usr/bin/apt-get -s install ${INSTALLPKGLIST} "${CURRENTREALPKGNAME}"; then
+ echo " -> Cannot install $CURRENTREALPKGNAME; apt errors follow:"
+ if $CHROOTEXEC /usr/bin/apt-get -s install $INSTALLPKGLIST "$CURRENTREALPKGNAME"; then
:
fi
# package could not be found. -- looking for alternative.
PROVIDED=""
- checkbuilddep_provides "${CURRENTREALPKGNAME}"
+ checkbuilddep_provides "$CURRENTREALPKGNAME"
if [ -n "$PROVIDED" ]; then
# something provides this package
echo " -> Considering $PROVIDED to satisfy the dependency "
- if $CHROOTEXEC /usr/bin/apt-get -s install ${INSTALLPKGLIST} ${PROVIDED} >& /dev/null; then
+ if $CHROOTEXEC /usr/bin/apt-get -s install $INSTALLPKGLIST $PROVIDED >& /dev/null; then
SATISFIED="yes";
- INSTALLPKGLIST="${INSTALLPKGLIST} ${PROVIDED}"
+ 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 ${INSTALLPKGLIST} ${PROVIDED}; then
+ if $CHROOTEXEC /usr/bin/apt-get -s install $INSTALLPKGLIST $PROVIDED; then
:
fi
fi
@@ -166,11 +97,11 @@ tolower($0) ~ /^'"${BD_REGEXP}"':/ {p=1}
done;
# now actually install the packages
- echo " -> Installing ${INSTALLPKGLIST}"
- if ! $CHROOTEXEC apt-get -y --force-yes install ${INSTALLPKGLIST}; then
+ echo " -> Installing $INSTALLPKGLIST"
+ if ! $CHROOTEXEC apt-get -y --force-yes install $INSTALLPKGLIST; then
echo " -> Trying to fix apt error"
# Work around an apt bug which causes configure to fail.
- if $CHROOTEXEC dpkg --configure --pending && $CHROOTEXEC apt-get -y --force-yes install ${INSTALLPKGLIST}; then
+ if $CHROOTEXEC dpkg --configure --pending && $CHROOTEXEC apt-get -y --force-yes install $INSTALLPKGLIST; then
echo " -> Apt bug workaround succeeded"
elif [ "$CONTINUE_FAIL" != "yes" ]; then
echo "E: Unrecoverable error installing build-dependencies." >&2
@@ -179,44 +110,37 @@ tolower($0) ~ /^'"${BD_REGEXP}"':/ {p=1}
fi
# start processing build-conflicts.
- for INSTALLPKG in $(cat "${DEBIAN_CONTROL}" | \
- awk 'BEGIN{source=1}
-/^$/ {source=0}
-/^Source:/ {source=1}
-/^[^ ]*:/{p=0}
-tolower($0) ~ /^'"${BC_REGEXP}"':/ {p=1}
-{if(p && source) {print $0}}' | \
- sed 's/^[^: ]*://' | \
+ for INSTALLPKG in $(get_control_re "$DEBIAN_CONTROL" "$BC_REGEXP" |
tr " " "/" | \
awk 'BEGIN{RS=","} {print}'); do
- CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's/^[/]*//' -e 's/[[/(].*//')
- echo " -> Considering ${CURRENTREALPKGNAME}"
+ CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's#^/*##' -e 's#[[/(].*##')
+ echo " -> Considering $CURRENTREALPKGNAME"
- if echo "$INSTALLPKG" | grep '\[' > /dev/null ; then
+ if echo "$INSTALLPKG" | grep -q '\['; then
# this package has arch-conflicts.
if checkbuilddep_archdeps "$INSTALLPKG" "$ARCH"; then
echo "I: Ignoring other-arch"
- continue;
+ continue
fi
fi
- if echo "$INSTALLPKG" | grep '[(]' > /dev/null ; then
+ 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 \
+ $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\1/') \
+ $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\2/'); then
echo "I: Satisfies version, not trying"
- continue;
+ continue
fi
fi
# if package exists, remove it.
- if $CHROOTEXEC /usr/bin/dpkg -s $(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}') 2>&1 | grep ^Package: > /dev/null; then
- if ! $CHROOTEXEC /usr/bin/apt-get -y remove ${CURRENTREALPKGNAME} ; then
+ if $CHROOTEXEC /usr/bin/dpkg -s $(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}') 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
fi
else
- echo "I: ${CURRENTREALPKGNAME} package is not installed, no need to remove"
+ echo "I: $CURRENTREALPKGNAME package is not installed, no need to remove"
fi
done
echo " -> Finished parsing the build-deps"
@@ -241,57 +165,5 @@ Copyright 2002-2007 Junichi Uekawa <dancer@debian.org>
EOF
}
+. /usr/lib/pbuilder/pbuilder-satisfydepends-checkparams
-DEBIAN_CONTROL=debian/control
-CHROOTEXEC=""
-BD_REGEXP="build-(depends|depends-indep)"
-BC_REGEXP="build-(conflicts|conflicts-indep)"
-FORCEVERSION=""
-CONTINUE_FAIL="no"
-
-
-while [ -n "$1" ]; do
- case "$1" in
- --control|-c)
- DEBIAN_CONTROL="$2"
- shift; shift
- ;;
- --chroot)
- CHROOTEXEC="chroot $2 "
- shift; shift
- ;;
- --internal-chrootexec)
- CHROOTEXEC="$2"
- shift; shift
- ;;
- --binary-all)
- BD_REGEXP='build-(depends|depends-indep)'
- BC_REGEXP='build-(conflicts|conflicts-indep)'
- shift
- ;;
- --binary-arch)
- BD_REGEXP='build-depends'
- BC_REGEXP='build-conflicts'
- shift
- ;;
- --echo)
- CHROOTEXEC="echo $CHROOTEXEC"
- shift
- ;;
- --continue-fail)
- CONTINUE_FAIL="yes"
- shift
- ;;
- --force-version)
- FORCEVERSION="yes"
- shift;
- ;;
- --help|-h|*)
- print_help
- exit 1
- ;;
- esac
-done
-
-
-checkbuilddep_internal
diff --git a/pbuilder-satisfydepends-aptitude b/pbuilder-satisfydepends-aptitude
new file mode 100755
index 0000000..6f94d74
--- /dev/null
+++ b/pbuilder-satisfydepends-aptitude
@@ -0,0 +1,113 @@
+#!/bin/bash
+# pbuilder -- personal Debian package builder
+# Copyright (C) 2001,2002,2003,2005-2007 Junichi Uekawa
+# Copyright (C) 2007 Loïc Minier
+#
+# This program 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# module to satisfy build dependencies; aptitude flavor
+
+set -e
+
+. /usr/lib/pbuilder/pbuilder-satisfydepends-funcs
+
+# filter out dependencies sent on input not for this arch; deps can have
+# multiple lines; output is on a single line or "" if empty
+function filter_arch_deps() {
+ local arch="$1"
+ local INSTALLPKGMULTI
+ local INSTALLPKG
+
+ # split on ","
+ sed 's/[[:space:]]*,[[:space:]]*/\n/g' |
+ while read INSTALLPKGMULTI; do
+ echo "$INSTALLPKGMULTI" |
+ # split on "|"
+ sed 's/[[:space:]]*|[[:space:]]*/\n/g' |
+ while read INSTALLPKG; do
+ if echo "$INSTALLPKG" | grep -q '\['; then
+ if checkbuilddep_archdeps "$INSTALLPKG" "$ARCH"; then
+ continue
+ fi
+ fi
+ # output the selected package
+ echo "$INSTALLPKG"
+ done |
+ # remove the arch list and add " | " between entries
+ sed 's/\[.*\]//; $,$! s/$/ |/' |
+ xargs --no-run-if-empty
+ done |
+ # add ", " between entries
+ sed '$,$! s/$/,/' |
+ xargs --no-run-if-empty
+}
+
+function checkbuilddep_internal () {
+# Use this function to fulfill the dependency (almost)
+ local ARCH=$(dpkg-architecture -qDEB_HOST_ARCH)
+ local BUILD_DEP_DEB_DIR
+ local BUILD_DEP_DEB_CONTROL
+ local DEPENDS
+ local CONFLICTS
+ echo " -> Attempting to satisfy build-dependencies $Id$"
+ DEPENDS="$(get_control_re "$DEBIAN_CONTROL" "$BD_REGEXP" | filter_arch_deps "$ARCH")"
+ CONFLICTS="$(get_control_re "$DEBIAN_CONTROL" "$BC_REGEXP" | filter_arch_deps "$ARCH")"
+ echo " -> Creating pbuilder-satisfydepends-dummy package"
+ BUILD_DEP_DEB_DIR="/tmp/satisfydepends-aptitude"
+ BUILD_DEP_DEB_CONTROL="$BUILD_DEP_DEB_DIR/pbuilder-satisfydepends-dummy/DEBIAN/control"
+ $CHROOTEXEC mkdir -p "$BUILD_DEP_DEB_DIR/pbuilder-satisfydepends-dummy/DEBIAN/"
+ $CHROOTEXEC sh -c "cat >\"$BUILD_DEP_DEB_CONTROL\"" <<EOF
+Package: pbuilder-satisfydepends-dummy
+Version: 0.invalid.0
+Architecture: $ARCH
+Maintainer: Debian Pbuilder Team <pbuilder-maint@lists.alioth.debian.org>
+Description: Dummy package to satisfy dependencies with aptitude - created by pbuilder
+ This package was created automatically by pbuilder and should
+EOF
+ if [ -n "$DEPENDS" ]; then
+ $CHROOTEXEC sh -c "echo \"Depends: $DEPENDS\" >>\"$BUILD_DEP_DEB_CONTROL\""
+ fi
+ if [ -n "$CONFLICTS" ]; then
+ $CHROOTEXEC sh -c "echo \"Conflicts: $CONFLICTS\" >>\"$BUILD_DEP_DEB_CONTROL\""
+ fi
+ $CHROOTEXEC sh -c "cat \"$BUILD_DEP_DEB_CONTROL\""
+ $CHROOTEXEC sh -c "dpkg-deb -b \"$BUILD_DEP_DEB_DIR/pbuilder-satisfydepends-dummy\""
+ $CHROOTEXEC apt-get -y --force-yes install aptitude
+ $CHROOTEXEC dpkg -i "$BUILD_DEP_DEB_DIR/pbuilder-satisfydepends-dummy.deb" || true
+ $CHROOTEXEC aptitude -y install pbuilder-satisfydepends-dummy
+ echo " -> Finished parsing the build-deps"
+}
+
+
+function print_help () {
+ # print out help message
+ cat <<EOF
+pbuilder-satisfydepends -- satisfy dependencies
+Copyright 2002-2007 Junichi Uekawa <dancer@debian.org>
+
+--help: give help
+--control: specify control file (debian/control, *.dsc)
+--chroot: operate inside chroot
+--binary-all: include binary-all
+--binary-arch: include binary-arch only
+--echo: echo mode, do nothing. (--force-version required for most operation)
+--force-version: skip version check.
+--continue-fail: continue even when failed.
+
+EOF
+}
+
+. /usr/lib/pbuilder/pbuilder-satisfydepends-checkparams
+
diff --git a/pbuilder-satisfydepends-checkparams b/pbuilder-satisfydepends-checkparams
new file mode 100755
index 0000000..3314c64
--- /dev/null
+++ b/pbuilder-satisfydepends-checkparams
@@ -0,0 +1,74 @@
+#!/bin/bash
+# pbuilder -- personal Debian package builder
+# Copyright (C) 2001,2002,2003,2005-2007 Junichi Uekawa
+#
+# This program 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# module to satisfy build dependencies; parse command line parameters
+
+
+DEBIAN_CONTROL=debian/control
+CHROOTEXEC=""
+BD_REGEXP="build-(depends|depends-indep)"
+BC_REGEXP="build-(conflicts|conflicts-indep)"
+FORCEVERSION=""
+CONTINUE_FAIL="no"
+
+
+while [ -n "$1" ]; do
+ case "$1" in
+ --control|-c)
+ DEBIAN_CONTROL="$2"
+ shift; shift
+ ;;
+ --chroot)
+ CHROOTEXEC="chroot $2 "
+ shift; shift
+ ;;
+ --internal-chrootexec)
+ CHROOTEXEC="$2"
+ shift; shift
+ ;;
+ --binary-all)
+ BD_REGEXP='build-(depends|depends-indep)'
+ BC_REGEXP='build-(conflicts|conflicts-indep)'
+ shift
+ ;;
+ --binary-arch)
+ BD_REGEXP='build-depends'
+ BC_REGEXP='build-conflicts'
+ shift
+ ;;
+ --echo)
+ CHROOTEXEC="echo $CHROOTEXEC"
+ shift
+ ;;
+ --continue-fail)
+ CONTINUE_FAIL="yes"
+ shift
+ ;;
+ --force-version)
+ FORCEVERSION="yes"
+ shift;
+ ;;
+ --help|-h|*)
+ print_help
+ exit 1
+ ;;
+ esac
+done
+
+
+checkbuilddep_internal
diff --git a/pbuilder-satisfydepends-experimental b/pbuilder-satisfydepends-experimental
index 7f5f73d..39a3a2b 100755
--- a/pbuilder-satisfydepends-experimental
+++ b/pbuilder-satisfydepends-experimental
@@ -1,6 +1,7 @@
#!/bin/bash
# pbuilder -- personal Debian package builder
# Copyright (C) 2001,2002,2003,2005-2007 Junichi Uekawa
+# Copyright (C) 2006,2007 Loïc Minier
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -15,129 +16,15 @@
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
#
-# module to satisfy dependency.
+# module to satisfy build dependencies; experimental flavor
set -e
-function package_versions() {
- local PACKAGE="$1"
- ( $CHROOTEXEC /usr/bin/apt-cache show "$PACKAGE" ) | sed -n 's/^Version: \(.*\)$/\1/p'
-}
-
-function candidate_version() {
- local PACKAGE="$1"
- LC_ALL=C $CHROOTEXEC apt-cache policy "$PACKAGE" | sed -n 's/ *Candidate: *\(.*\)/\1/p'
-}
-
-function checkbuilddep_versiondeps () {
- local PACKAGE="$1"
- local COMPARESTRING="$2"
- local DEPSVERSION="$3"
- local PACKAGEVERSIONS=$( package_versions "$PACKAGE" | xargs)
- # no versioned provides.
- if [ "${FORCEVERSION}" = "yes" ]; then
- return 0;
- fi
- for PACKAGEVERSION in $PACKAGEVERSIONS ; do
- if dpkg --compare-versions "$PACKAGEVERSION" "$COMPARESTRING" "$DEPSVERSION"; then
- # satisfies depends
- return 0;
- fi
- done
- echo " Tried versions: $PACKAGEVERSIONS"
- # cannot satisfy depends
- return 1;
-}
-
-function expand_arch () {
- local ARCH="$1"
- local EXPANDED_ARCH
-
- # just keep the original behavior.
- echo "$ARCH"
- return
-
- # the following may be used if dpkg change is set to stone.
- if echo "$ARCH" | grep "-" > /dev/null; then
- EXPANDED_ARCH=$ARCH
- else
- EXPANDED_ARCH="linux-$ARCH"
- fi
- local WC1=$(echo $EXPANDED_ARCH | sed 's/^[^-]*/any/')
- local WC2=$(echo $EXPANDED_ARCH | sed 's/[^-]*$/any/')
- echo "$ARCH\\|$EXPANDED_ARCH\\|$WC1\\|$WC2"
-}
-
-function checkbuilddep_archdeps () {
- # returns FALSE on INSTALL
- local INSTALLPKG="$1"
- local ARCH="$2"
- if echo "$INSTALLPKG" | sed 's/.*\(\[.*\]\)/\1/' | grep "[[/][!]\($(expand_arch $ARCH)\)[]/]" > /dev/null; then
- # if !$ARCH exists in there, ERROR.
- return 0;
- fi
- if ! echo "$INSTALLPKG" | sed 's/.*\(\[.*\]\)/\1/' | grep "[!]" > /dev/null; then
- if ! echo "$INSTALLPKG" | sed 's/.*\(\[.*\]\)/\1/' | grep "[[/]\($(expand_arch $ARCH)\)[]/]" > /dev/null; then
- # if $ARCH does not exist, ERROR.
- return 0;
- fi
- fi
- return 1;
-}
+. /usr/lib/pbuilder/pbuilder-satisfydepends-funcs
-function checkbuilddep_provides () {
- local PACKAGENAME="$1"
- # PROVIDED needs to be used outside of this function.
- PROVIDED=$($CHROOTEXEC /usr/bin/apt-cache showpkg $PACKAGENAME | awk '{p=0}/^Reverse Provides:/,/^$/{p=1}{if(p && ($0 !~ "Reverse Provides:")){PACKAGE=$1}} END{print PACKAGE}')
-}
-
-# returns either "package=version", to append to an apt-get install line, or
-# package
-function versioneddep_to_aptcmd () {
- local INSTALLPKG="$1"
-
- local PACKAGE
- local PACKAGE_WITHVERSION
- local PACKAGEVERSIONS
- local CANDIDATE_VERSION
- local COMPARESTRING
- local DEPSVERSION
-
- PACKAGE="$(echo "$INSTALLPKG" | sed -e 's/^[/]*//' -e 's/[[/(].*//')"
- PACKAGE_WITHVERSION="$PACKAGE"
-
- # if not versionned, we skip directly to outputting $PACKAGE
- if echo "$INSTALLPKG" | grep '[(]' > /dev/null; then
- # package versions returned by APT, in reversed order
- PACKAGEVERSIONS="$( package_versions "$PACKAGE" | tac | xargs )"
- CANDIDATE_VERSION="$( candidate_version "$PACKAGE" )"
-
- COMPARESTRING="$(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*([ ]*\(<<\|<=\|>=\|=\|<\|>>\|>\)[ ]*\(.*\)).*$/\1/')"
- DEPSVERSION="$(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*([ ]*\(<<\|<=\|>=\|=\|<\|>>\|>\)[ ]*\(.*\)).*$/\2/')"
- # if strictly versionned, we skip to outputting that version
- if [ "=" = "$COMPARESTRING" ]; then
- PACKAGE_WITHVERSION="$PACKAGE=$DEPSVERSION"
- else
- # try the candidate version, then all available versions (asc)
- for VERSION in $CANDIDATE_VERSION $PACKAGEVERSIONS; do
- if dpkg --compare-versions "$VERSION" "$COMPARESTRING" "$DEPSVERSION"; then
- if [ $VERSION != $CANDIDATE_VERSION ]; then
- PACKAGE_WITHVERSION="$PACKAGE=$VERSION"
- fi
- break;
- fi
- done
- fi
- fi
-
- echo "$PACKAGE_WITHVERSION"
-}
-
-function checkbuilddep_internal () {
# Use this function to fulfill the dependency (almost)
-
+function checkbuilddep_internal () {
local ARCH=$(dpkg-architecture -qDEB_HOST_ARCH)
local INSTALLPKG
local INSTALLPKGLIST
@@ -147,38 +34,30 @@ function checkbuilddep_internal () {
local PACKAGEVERSIONS
local CANDIDATE_VERSION
echo " -> Attempting to parse the build-deps $Id$"
- for INSTALLPKGMULTI in $(cat ${DEBIAN_CONTROL} | \
- awk '
-BEGIN{source=1}
-/^$/ {source=0}
-/^Source:/ {source=1}
-/^[^ ]*:/ {p=0}
-tolower($0) ~ /^'"${BD_REGEXP}"':/ {p=1}
-{if(p && source) {print $0}}' | \
- sed 's/^[^: ]*://' | \
+ for INSTALLPKGMULTI in $(get_control_re "$DEBIAN_CONTROL" "$BD_REGEXP" |
tr " " "/" | \
awk 'BEGIN{RS=","} {print}'); 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/[[/(].*//')
- if echo "$INSTALLPKG" | grep '\[' > /dev/null ; then
+ CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's#^/*##' -e 's#[[/(].*##')
+ if echo "$INSTALLPKG" | grep -q '\['; then
if checkbuilddep_archdeps "$INSTALLPKG" "$ARCH"; then
SATISFIED="yes"
echo " -> This package is not for this architecture"
- continue;
+ continue
fi
fi
CURRENT_APT_COMMAND="$(versioneddep_to_aptcmd "$INSTALLPKG")"
while [ "$SATISFIED" = "no" ]; do
- echo " -> Trying to add ${CURRENT_APT_COMMAND}"
- if APT_OUTPUT="$( exec 2>&1; LC_ALL=C $CHROOTEXEC /usr/bin/apt-get -s install ${INSTALLPKGLIST} ${CURRENT_APT_COMMAND} )"; then
+ echo " -> Trying to add $CURRENT_APT_COMMAND"
+ if APT_OUTPUT="$( exec 2>&1; LC_ALL=C $CHROOTEXEC /usr/bin/apt-get -s install $INSTALLPKGLIST $CURRENT_APT_COMMAND )"; then
# success, we're done
SATISFIED="yes"
- INSTALLPKGLIST="${INSTALLPKGLIST} ${CURRENT_APT_COMMAND}"
+ INSTALLPKGLIST="$INSTALLPKGLIST $CURRENT_APT_COMMAND"
break
fi
# try to parse APT's output to recognize lines such as:
@@ -205,23 +84,23 @@ tolower($0) ~ /^'"${BD_REGEXP}"':/ {p=1}
break;
fi
- echo " -> Cannot install ${CURRENT_APT_COMMAND}; apt errors follow:"
- if $CHROOTEXEC /usr/bin/apt-get -s install ${INSTALLPKGLIST} "${CURRENT_APT_COMMAND}"; then
+ echo " -> Cannot install $CURRENT_APT_COMMAND; apt errors follow:"
+ if $CHROOTEXEC /usr/bin/apt-get -s install $INSTALLPKGLIST "$CURRENT_APT_COMMAND"; then
:
fi
# package could not be found. -- looking for alternative.
PROVIDED=""
- checkbuilddep_provides "${CURRENTREALPKGNAME}"
+ checkbuilddep_provides "$CURRENTREALPKGNAME"
if [ -n "$PROVIDED" ]; then
# something provides this package
echo " -> Considering $PROVIDED to satisfy the dependency "
- if $CHROOTEXEC /usr/bin/apt-get -s install ${INSTALLPKGLIST} ${PROVIDED} >& /dev/null; then
+ if $CHROOTEXEC /usr/bin/apt-get -s install $INSTALLPKGLIST $PROVIDED >& /dev/null; then
SATISFIED="yes";
- INSTALLPKGLIST="${INSTALLPKGLIST} ${PROVIDED}"
+ 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 ${INSTALLPKGLIST} ${PROVIDED}; then
+ if $CHROOTEXEC /usr/bin/apt-get -s install $INSTALLPKGLIST $PROVIDED; then
:
fi
fi
@@ -239,11 +118,11 @@ tolower($0) ~ /^'"${BD_REGEXP}"':/ {p=1}
done;
# now actually install the packages
- echo " -> Installing ${INSTALLPKGLIST}"
- if ! $CHROOTEXEC apt-get -y --force-yes install ${INSTALLPKGLIST}; then
+ echo " -> Installing $INSTALLPKGLIST"
+ if ! $CHROOTEXEC apt-get -y --force-yes install $INSTALLPKGLIST; then
echo " -> Trying to fix apt error"
# Work around an apt bug which causes configure to fail.
- if $CHROOTEXEC dpkg --configure --pending && $CHROOTEXEC apt-get -y --force-yes install ${INSTALLPKGLIST}; then
+ if $CHROOTEXEC dpkg --configure --pending && $CHROOTEXEC apt-get -y --force-yes install $INSTALLPKGLIST; then
echo " -> Apt bug workaround succeeded"
elif [ "$CONTINUE_FAIL" != "yes" ]; then
echo "E: Unrecoverable error installing build-dependencies." >&2
@@ -252,44 +131,37 @@ tolower($0) ~ /^'"${BD_REGEXP}"':/ {p=1}
fi
# start processing build-conflicts.
- for INSTALLPKG in $(cat "${DEBIAN_CONTROL}" | \
- awk 'BEGIN{source=1}
-/^$/ {source=0}
-/^Source:/ {source=1}
-/^[^ ]*:/{p=0}
-tolower($0) ~ /^'"${BC_REGEXP}"':/ {p=1}
-{if(p && source) {print $0}}' | \
- sed 's/^[^: ]*://' | \
+ for INSTALLPKG in $(get_control_re "$DEBIAN_CONTROL" "$BC_REGEXP" |
tr " " "/" | \
awk 'BEGIN{RS=","} {print}'); do
- CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's/^[/]*//' -e 's/[[/(].*//')
- echo " -> Considering ${CURRENTREALPKGNAME}"
+ CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's#^/*##' -e 's#[[/(].*##')
+ echo " -> Considering $CURRENTREALPKGNAME"
- if echo "$INSTALLPKG" | grep '\[' > /dev/null ; then
+ if echo "$INSTALLPKG" | grep -q '\['; then
# this package has arch-conflicts.
if checkbuilddep_archdeps "$INSTALLPKG" "$ARCH"; then
echo "I: Ignoring other-arch"
- continue;
+ continue
fi
fi
- if echo "$INSTALLPKG" | grep '[(]' > /dev/null ; then
+ 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 \
+ $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\1/') \
+ $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\2/'); then
echo "I: Satisfies version, not trying"
- continue;
+ continue
fi
fi
# if package exists, remove it.
- if $CHROOTEXEC /usr/bin/dpkg -s $(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}') 2>&1 | grep ^Package: > /dev/null; then
- if ! $CHROOTEXEC /usr/bin/apt-get -y remove ${CURRENTREALPKGNAME} ; then
+ if $CHROOTEXEC /usr/bin/dpkg -s $(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}') 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
fi
else
- echo "I: ${CURRENTREALPKGNAME} package is not installed, no need to remove"
+ echo "I: $CURRENTREALPKGNAME package is not installed, no need to remove"
fi
done
echo " -> Finished parsing the build-deps"
@@ -314,57 +186,5 @@ Copyright 2002-2007 Junichi Uekawa <dancer@debian.org>
EOF
}
+. /usr/lib/pbuilder/pbuilder-satisfydepends-checkparams
-DEBIAN_CONTROL=debian/control
-CHROOTEXEC=""
-BD_REGEXP="build-(depends|depends-indep)"
-BC_REGEXP="build-(conflicts|conflicts-indep)"
-FORCEVERSION=""
-CONTINUE_FAIL="no"
-
-
-while [ -n "$1" ]; do
- case "$1" in
- --control|-c)
- DEBIAN_CONTROL="$2"
- shift; shift
- ;;
- --chroot)
- CHROOTEXEC="chroot $2 "
- shift; shift
- ;;
- --internal-chrootexec)
- CHROOTEXEC="$2"
- shift; shift
- ;;
- --binary-all)
- BD_REGEXP='build-(depends|depends-indep)'
- BC_REGEXP='build-(conflicts|conflicts-indep)'
- shift
- ;;
- --binary-arch)
- BD_REGEXP='build-depends'
- BC_REGEXP='build-conflicts'
- shift
- ;;
- --echo)
- CHROOTEXEC="echo $CHROOTEXEC"
- shift
- ;;
- --continue-fail)
- CONTINUE_FAIL="yes"
- shift
- ;;
- --force-version)
- FORCEVERSION="yes"
- shift;
- ;;
- --help|-h|*)
- print_help
- exit 1
- ;;
- esac
-done
-
-
-checkbuilddep_internal
diff --git a/pbuilder-satisfydepends-funcs b/pbuilder-satisfydepends-funcs
new file mode 100755
index 0000000..0e8270c
--- /dev/null
+++ b/pbuilder-satisfydepends-funcs
@@ -0,0 +1,154 @@
+#!/bin/bash
+# pbuilder -- personal Debian package builder
+# Copyright (C) 2001,2002,2003,2005-2007 Junichi Uekawa
+# Copyright (C) 2007 Loïc Minier
+#
+# This program 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# module to satisfy build dependencies; common functions
+
+
+function package_versions() {
+ local PACKAGE="$1"
+ ( $CHROOTEXEC /usr/bin/apt-cache show "$PACKAGE" ) | sed -n 's/^Version: \(.*\)$/\1/p'
+}
+
+function candidate_version() {
+ local PACKAGE="$1"
+ LC_ALL=C $CHROOTEXEC apt-cache policy "$PACKAGE" | sed -n 's/ *Candidate: *\(.*\)/\1/p'
+}
+
+function checkbuilddep_versiondeps () {
+ local PACKAGE="$1"
+ local COMPARESTRING="$2"
+ local DEPSVERSION="$3"
+ local PACKAGEVERSIONS=$( package_versions "$PACKAGE" | xargs)
+ # no versioned provides.
+ if [ "${FORCEVERSION}" = "yes" ]; then
+ return 0;
+ fi
+ for PACKAGEVERSION in $PACKAGEVERSIONS ; do
+ if dpkg --compare-versions "$PACKAGEVERSION" "$COMPARESTRING" "$DEPSVERSION"; then
+ # satisfies depends
+ return 0;
+ fi
+ done
+ echo " Tried versions: $PACKAGEVERSIONS"
+ # cannot satisfy depends
+ return 1;
+}
+
+get_control_re() {
+ control="$1"
+ re="$2"
+
+ cat "$control" |
+ awk '
+ BEGIN { source=1 }
+ /^$/ { source=0 }
+ /^Source:/ { source=1 }
+ /^[^ ]*:/ { p=0 }
+ tolower($0) ~ /^'"$re"':/ { p=1 }
+ { if (p && source) { print $0 } }' |
+ sed 's/^[^: ]*://'
+}
+
+function checkbuilddep_archdeps () {
+ # returns FALSE on INSTALL
+ local INSTALLPKG="$1"
+ local ARCH="$2"
+ # architectures listed between [ and ] for this dep
+ local DEP_ARCHES="$(echo "$INSTALLPKG" | sed 's/.*\[\(.*\)\].*/\1/')"
+ # check for !$ARCH in DEP_ARCHES
+ if echo "$DEP_ARCHES" | egrep -q "(^|[[:space:]/]+)\![[:space:]/]*$ARCH($|[[:space:]/]+)"; then
+ return 0;
+ fi
+ # check for a "!" which would mean there's a !<otherarch> and hence $ARCH
+ # is included
+ if ! echo "$DEP_ARCHES" | grep -q '!'; then
+ # check for $ARCH in DEP_ARCHES
+ if ! echo "$DEP_ARCHES" | egrep -q "(^|[[:space:]/]+)$ARCH($|[[:space:]/]+)"; then
+ return 0;
+ fi
+ fi
+ return 1;
+}
+
+function checkbuilddep_provides () {
+ local PACKAGENAME="$1"
+ # PROVIDED needs to be used outside of this function.
+ PROVIDED=$($CHROOTEXEC /usr/bin/apt-cache showpkg $PACKAGENAME | awk '{p=0}/^Reverse Provides:/,/^$/{p=1}{if(p && ($0 !~ "Reverse Provides:")){PACKAGE=$1}} END{print PACKAGE}')
+}
+
+# returns either "package=version", to append to an apt-get install line, or
+# package
+function versioneddep_to_aptcmd () {
+ local INSTALLPKG="$1"
+
+ local PACKAGE
+ local PACKAGE_WITHVERSION
+ local PACKAGEVERSIONS
+ local CANDIDATE_VERSION
+ local COMPARESTRING
+ local DEPSVERSION
+
+ PACKAGE="$(echo "$INSTALLPKG" | sed -e 's/^[/]*//' -e 's/[[/(].*//')"
+ PACKAGE_WITHVERSION="$PACKAGE"
+
+ # if not versionned, we skip directly to outputting $PACKAGE
+ if echo "$INSTALLPKG" | grep '[(]' > /dev/null; then
+ # package versions returned by APT, in reversed order
+ PACKAGEVERSIONS="$( package_versions "$PACKAGE" | tac | xargs )"
+ CANDIDATE_VERSION="$( candidate_version "$PACKAGE" )"
+
+ COMPARESTRING="$(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\1/')"
+ DEPSVERSION="$(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*( *\(<<\|<=\|>=\|=\|<\|>>\|>\) *\(.*\)).*$/\2/')"
+ # if strictly versionned, we skip to outputting that version
+ if [ "=" = "$COMPARESTRING" ]; then
+ PACKAGE_WITHVERSION="$PACKAGE=$DEPSVERSION"
+ else
+ # try the candidate version, then all available versions (asc)
+ for VERSION in $CANDIDATE_VERSION $PACKAGEVERSIONS; do
+ if dpkg --compare-versions "$VERSION" "$COMPARESTRING" "$DEPSVERSION"; then
+ if [ $VERSION != $CANDIDATE_VERSION ]; then
+ PACKAGE_WITHVERSION="$PACKAGE=$VERSION"
+ fi
+ break;
+ fi
+ done
+ fi
+ fi
+
+ echo "$PACKAGE_WITHVERSION"
+}
+
+function print_help () {
+ # print out help message
+ cat <<EOF
+pbuilder-satisfydepends -- satisfy dependencies
+Copyright 2002-2007 Junichi Uekawa <dancer@debian.org>
+
+--help: give help
+--control: specify control file (debian/control, *.dsc)
+--chroot: operate inside chroot
+--binary-all: include binary-all
+--binary-arch: include binary-arch only
+--echo: echo mode, do nothing. (--force-version required for most operation)
+--force-version: skip version check.
+--continue-fail: continue even when failed.
+
+EOF
+}
+
diff --git a/pbuilderrc b/pbuilderrc
index 7ec5f45..1b8da3b 100755
--- a/pbuilderrc
+++ b/pbuilderrc
@@ -35,10 +35,13 @@ BUILDSOURCEROOTCMD="fakeroot"
PBUILDERROOTCMD="sudo"
# command to satisfy build-dependencies; the default is an internal shell
-# implementation which is relatively slow; there's an alternate experimental
-# implementation, "pbuilder-satisfydepends-experimental", which might be useful
-# to pull packages from experimental or from repositories with a low APT Pin
-# Priority
+# implementation which is relatively slow; there are two alternate
+# implementations, the "experimental" implementation,
+# "pbuilder-satisfydepends-experimental", which might be useful to pull
+# packages from experimental or from repositories with a low APT Pin Priority,
+# and the "aptitude" implementation, which will resolve build-dependencies and
+# build-conflicts with aptitude which helps dealing with complex cases but does
+# not support unsigned APT repositories
PBUILDERSATISFYDEPENDSCMD="/usr/lib/pbuilder/pbuilder-satisfydepends"
#default is to build everything. Passed on to dpkg-buildpackage
diff --git a/pbuilderrc.5 b/pbuilderrc.5
index 832c5e6..98c2fc5 100644
--- a/pbuilderrc.5
+++ b/pbuilderrc.5
@@ -216,10 +216,12 @@ in
.BI "PBUILDERSATISFYDEPENDSCMD=" "/usr/lib/pbuilder/pbuilder-satisfydepends"
This option is used by various parts of pbuilder to satisfy (i.e. install) the
-build-dependencies of a package. There is an alternate experimental
-implementation, "pbuilder-satisfydepends-experimental", which might be useful
-to pull packages from experimental or from repositories with a low APT Pin
-Priority.
+build-dependencies of a package. There are two alternate implementations, the
+"experimental" implementation, "pbuilder-satisfydepends-experimental", which
+might be useful to pull packages from experimental or from repositories with a
+low APT Pin Priority, and the "aptitude" implementation, which will resolve
+build-dependencies and build-conflicts with aptitude which helps dealing with
+complex cases but does not support unsigned APT repositories
.TP
.BI "BUILDUSERID=" "1234"