Package: pbuilder
Version: 0.215
Severity: wishlist
Tags: patch

Hi,

the attached patch implements preliminary support for build profiles as
defined here: https://wiki.debian.org/BuildProfileSpec

I only implemented minimal support, meaning that I only tested
pbuilder-satisfydepends-aptitude and build profiles are activated via
the DEB_BUILD_PROFILES environment variable. I didnt add a --profiles
option and neither did I look at the other pbuilder-satisfydepends
scripts.

cheers, josch
>From dbed5a3479f88207e5308a99845e6de54f696d81 Mon Sep 17 00:00:00 2001
From: josch <[email protected]>
Date: Mon, 3 Mar 2014 03:23:14 +0100
Subject: [PATCH 1/2] Testcases for checkbuilddep_archdeps and filter_arch_deps

 - moved filter_arch_deps from pbuilder-satisfydepends-aptitude to
   pbuilder-satisfydepends-funcs because sourcing
   pbuilder-satisfydepends-aptitude requires dpkg to install
   pbuilder-satisfydepends-dummy.deb
---
 pbuilder-satisfydepends-aptitude   | 32 --------------------------------
 pbuilder-satisfydepends-funcs      | 31 +++++++++++++++++++++++++++++++
 test_pbuilder-satisfydepends-funcs | 16 ++++++++++++++++
 3 files changed, 47 insertions(+), 32 deletions(-)

diff --git a/pbuilder-satisfydepends-aptitude b/pbuilder-satisfydepends-aptitude
index 97c58e5..31f5353 100755
--- a/pbuilder-satisfydepends-aptitude
+++ b/pbuilder-satisfydepends-aptitude
@@ -25,38 +25,6 @@ export PBUILDER_PKGLIBDIR="${PBUILDER_PKGLIBDIR:-$PBUILDER_ROOT/usr/lib/pbuilder
 
 . "$PBUILDER_PKGLIBDIR"/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=$($CHROOTEXEC dpkg-architecture -qDEB_HOST_ARCH)
diff --git a/pbuilder-satisfydepends-funcs b/pbuilder-satisfydepends-funcs
index 6c8dc28..e028fa2 100755
--- a/pbuilder-satisfydepends-funcs
+++ b/pbuilder-satisfydepends-funcs
@@ -117,6 +117,37 @@ get_build_conflicts() {
     echo "$output"
 }
 
+# filter out dependencies sent on input not for this arch; deps can have
+# multiple lines; output is on a single line or "" if empty
+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
+}
+
 checkbuilddep_archdeps() {
     # returns FALSE on INSTALL
     local INSTALLPKG="$1"
diff --git a/test_pbuilder-satisfydepends-funcs b/test_pbuilder-satisfydepends-funcs
index 4eaa665..aafef2b 100755
--- a/test_pbuilder-satisfydepends-funcs
+++ b/test_pbuilder-satisfydepends-funcs
@@ -84,6 +84,22 @@ expect_output "autotools-dev (>= 1.2), debhelper, quilt (<< 12:0), libwxgtk2.8-d
 expect_output "autotools-dev (>= 1.2), debhelper, quilt (<< 12:0), libwxgtk2.8-dev" \
     test_get_build_deps "yes"
 
+expect_fail checkbuilddep_archdeps "foo [amd64]" "amd64"
+expect_success checkbuilddep_archdeps "foo [i386]" "amd64"
+expect_fail checkbuilddep_archdeps "foo [i386 amd64]" "amd64"
+expect_success checkbuilddep_archdeps "foo [!amd64]" "amd64"
+expect_success checkbuilddep_archdeps "foo [!i386 !amd64]" "amd64"
+
+test_filter_arch_deps() {
+    echo "$1" | filter_arch_deps "$2"
+}
+
+expect_output "foo" test_filter_arch_deps "foo" "amd64"
+expect_output "foo" test_filter_arch_deps "foo [amd64]" "amd64"
+expect_output "bar, foo" test_filter_arch_deps "bar, foo [amd64]" "amd64"
+expect_output "bar | foo" test_filter_arch_deps "bar | foo [amd64]" "amd64"
+expect_output "bar" test_filter_arch_deps "bar | foo [amd64]" "i386"
+
 expect_output "debhelper (>= 7)" test_get_build_deps_dsc
 
 testlib_summary
-- 
1.8.5.3

>From 6557439e2c049ac8ff6fc88a5976f2ce5bd85890 Mon Sep 17 00:00:00 2001
From: josch <[email protected]>
Date: Mon, 3 Mar 2014 04:09:11 +0100
Subject: [PATCH 2/2] Add build-profiles support

---
 pbuilder-satisfydepends-aptitude   |  6 ++-
 pbuilder-satisfydepends-funcs      | 79 ++++++++++++++++++++++++++++++++++++++
 test_pbuilder-satisfydepends-funcs | 41 ++++++++++++++++++++
 3 files changed, 124 insertions(+), 2 deletions(-)

diff --git a/pbuilder-satisfydepends-aptitude b/pbuilder-satisfydepends-aptitude
index 31f5353..f96486e 100755
--- a/pbuilder-satisfydepends-aptitude
+++ b/pbuilder-satisfydepends-aptitude
@@ -33,8 +33,10 @@ function checkbuilddep_internal () {
     local DEPENDS
     local CONFLICTS
     echo " -> Attempting to satisfy build-dependencies"
-    DEPENDS="$(get_build_deps | filter_arch_deps "$ARCH")"
-    CONFLICTS="$(get_build_conflicts | filter_arch_deps "$ARCH")"
+    DEPENDS="$(get_build_deps | filter_arch_deps "$ARCH" |
+        filter_restriction_deps \"$DEB_BUILD_PROFILES\" )"
+    CONFLICTS="$(get_build_conflicts | filter_arch_deps "$ARCH" |
+        filter_restriction_deps \"$DEB_BUILD_PROFILES\" )"
     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"
diff --git a/pbuilder-satisfydepends-funcs b/pbuilder-satisfydepends-funcs
index e028fa2..036ec79 100755
--- a/pbuilder-satisfydepends-funcs
+++ b/pbuilder-satisfydepends-funcs
@@ -148,6 +148,37 @@ filter_arch_deps() {
     xargs --no-run-if-empty
 }
 
+# filter out dependencies sent on input not for selected build profiles; deps
+# can have multiple lines; output is on a single line or "" if empty
+filter_restriction_deps() {
+    local profiles="$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_restrictiondeps "$INSTALLPKG" "$profiles"; then
+                        continue
+                    fi
+                fi
+                # output the selected package
+                echo "$INSTALLPKG"
+            done |
+            # remove the restriction list and add " | " between entries
+            sed 's/<.*>//; $,$! s/$/ |/' |
+            xargs --no-run-if-empty
+    done |
+    # add ", " between entries
+    sed '$,$! s/$/,/' |
+    xargs --no-run-if-empty
+}
+
 checkbuilddep_archdeps() {
     # returns FALSE on INSTALL
     local INSTALLPKG="$1"
@@ -182,6 +213,54 @@ checkbuilddep_archdeps() {
     return 1
 }
 
+checkbuilddep_restrictiondeps() {
+    # returns FALSE on INSTALL
+    local INSTALLPKG="$1"
+    local PROFILES="$2"
+    # restrictions listed between < and > for this dep
+    local DEP_RESTRICTIONS="$(echo "$INSTALLPKG" | sed -e 's/.*<\(.*\)>.*/\1/' -e 'y|/| |')"
+    local PKG="$(echo "$INSTALLPKG" | cut -d ' ' -f 1)"
+    local SEEN_RESTRICTION="no"
+    local PROFILE
+    local NEGATED
+    local FOUND
+    for r in $DEP_RESTRICTIONS; do
+        if [[ "$r" != '!profile.'* ]] && [[ "$r" != 'profile.'* ]]; then
+            continue
+        fi
+        if [[ "$r" == '!'* ]]; then
+            NEGATED="yes"
+            PROFILE=${r#!profile.}
+        else
+            NEGATED="no"
+            PROFILE=${r#profile.}
+        fi
+        FOUND="no"
+        for p in $PROFILES; do
+            if [ "$p" = "$PROFILE" ]; then
+                FOUND="yes"
+                continue
+            fi
+        done
+        if [ "$NEGATED" = "yes" ]; then
+            if [ "$FOUND" = "yes" ]; then
+                SEEN_RESTRICTION="no"
+                break
+            else
+                SEEN_RESTRICTION="yes"
+            fi
+        elif [ "$FOUND" = "yes" ]; then
+            SEEN_RESTRICTION="yes"
+            break
+        fi
+    done
+    if [ "$SEEN_RESTRICTION" = "yes" ]; then
+        return 1
+    else
+        return 0
+    fi
+}
+
 checkbuilddep_provides() {
     local PACKAGENAME="$1"
     # PROVIDED needs to be used outside of this function.
diff --git a/test_pbuilder-satisfydepends-funcs b/test_pbuilder-satisfydepends-funcs
index aafef2b..79ff458 100755
--- a/test_pbuilder-satisfydepends-funcs
+++ b/test_pbuilder-satisfydepends-funcs
@@ -100,6 +100,47 @@ expect_output "bar, foo" test_filter_arch_deps "bar, foo [amd64]" "amd64"
 expect_output "bar | foo" test_filter_arch_deps "bar | foo [amd64]" "amd64"
 expect_output "bar" test_filter_arch_deps "bar | foo [amd64]" "i386"
 
+expect_fail checkbuilddep_restrictiondeps "foo <!profile.stage1>" ""
+expect_success checkbuilddep_restrictiondeps "foo <!profile.stage1>" "stage1"
+expect_fail checkbuilddep_restrictiondeps "foo <!profile.stage1>" "notest"
+expect_success checkbuilddep_restrictiondeps "foo <!profile.stage1>" "stage1 notest"
+
+expect_success checkbuilddep_restrictiondeps "foo <profile.stage1>" ""
+expect_fail checkbuilddep_restrictiondeps "foo <profile.stage1>" "stage1"
+expect_success checkbuilddep_restrictiondeps "foo <profile.stage1>" "notest"
+expect_fail checkbuilddep_restrictiondeps "foo <profile.stage1>" "stage1 notest"
+
+expect_fail checkbuilddep_restrictiondeps "foo <!profile.stage1 !profile.notest>" ""
+expect_success checkbuilddep_restrictiondeps "foo <!profile.stage1 !profile.notest>" "stage1"
+expect_success checkbuilddep_restrictiondeps "foo <!profile.stage1 !profile.notest>" "notest"
+expect_success checkbuilddep_restrictiondeps "foo <!profile.stage1 !profile.notest>" "stage1 notest"
+
+expect_success checkbuilddep_restrictiondeps "foo <profile.stage1 profile.notest>" ""
+expect_fail checkbuilddep_restrictiondeps "foo <profile.stage1 profile.notest>" "stage1"
+expect_fail checkbuilddep_restrictiondeps "foo <profile.stage1 profile.notest>" "notest"
+expect_fail checkbuilddep_restrictiondeps "foo <profile.stage1 profile.notest>" "stage1 notest"
+
+expect_fail checkbuilddep_restrictiondeps "foo <!profile.stage1 profile.notest>" ""
+expect_success checkbuilddep_restrictiondeps "foo <!profile.stage1 profile.notest>" "stage1"
+expect_fail checkbuilddep_restrictiondeps "foo <!profile.stage1 profile.notest>" "notest"
+expect_success checkbuilddep_restrictiondeps "foo <!profile.stage1 profile.notest>" "stage1 notest"
+
+expect_fail checkbuilddep_restrictiondeps "foo <profile.stage1 !profile.notest>" ""
+expect_fail checkbuilddep_restrictiondeps "foo <profile.stage1 !profile.notest>" "stage1"
+expect_success checkbuilddep_restrictiondeps "foo <profile.stage1 !profile.notest>" "notest"
+expect_fail checkbuilddep_restrictiondeps "foo <profile.stage1 !profile.notest>" "stage1 notest"
+
+test_filter_restriction_deps() {
+    echo "$1" | filter_restriction_deps "$2"
+}
+
+expect_output "foo" test_filter_restriction_deps "foo <!profile.stage1>" ""
+expect_output "" test_filter_restriction_deps "foo <!profile.stage1>" "stage1"
+expect_output "foo" test_filter_restriction_deps "foo <profile.stage1>" "stage1"
+expect_output "bar, foo" test_filter_restriction_deps "bar, foo <profile.stage1>" "stage1"
+expect_output "bar | foo" test_filter_restriction_deps "bar | foo <profile.stage1>" "stage1"
+expect_output "bar" test_filter_restriction_deps "bar | foo <!profile.stage1>" "stage1"
+
 expect_output "debhelper (>= 7)" test_get_build_deps_dsc
 
 testlib_summary
-- 
1.8.5.3

Reply via email to