diff --git a/lib/depends.c b/lib/depends.c index fc413a9034..7e8a242c87 100644 --- a/lib/depends.c +++ b/lib/depends.c @@ -665,7 +665,8 @@ static int unsatisfiedDepend(rpmts ts, depCache dcache, rpmds dep) } if (op != RPMRICHOP_IF || rc) rc = unsatisfiedDepend(ts, dcache, ds1); - if ((rc && op == RPMRICHOP_OR) || (!rc && op == RPMRICHOP_AND)) + if ((rc && op == RPMRICHOP_OR) || (!rc && op == RPMRICHOP_AND) || + (!rc && op == RPMRICHOP_WITH)) rc = unsatisfiedDepend(ts, dcache, ds2); ds1 = rpmdsFree(ds1); ds2 = rpmdsFree(ds2); diff --git a/lib/rpmds.c b/lib/rpmds.c index 04be012668..0212af4fc2 100644 --- a/lib/rpmds.c +++ b/lib/rpmds.c @@ -1376,6 +1376,7 @@ static struct RichOpComp { { "or", RPMRICHOP_OR}, { "if", RPMRICHOP_IF}, { "else", RPMRICHOP_ELSE}, + { "with", RPMRICHOP_WITH}, { NULL, 0 }, }; @@ -1415,6 +1416,8 @@ const char *rpmrichOpStr(rpmrichOp op) return "if"; if (op == RPMRICHOP_ELSE) return "else"; + if (op == RPMRICHOP_WITH) + return "with"; return NULL; } @@ -1462,10 +1465,13 @@ static rpmRC parseSimpleDep(const char **dstrp, char **emsg, rpmrichParseFunctio return RPMRC_OK; } -rpmRC rpmrichParse(const char **dstrp, char **emsg, rpmrichParseFunction cb, void *cbdata) +#define RPMRC_AND 128 + +static rpmRC richParse(const char **dstrp, char **emsg, rpmrichParseFunction cb, void *cbdata) { const char *p = *dstrp, *pe; rpmrichOp op = RPMRICHOP_SINGLE, chainop = 0; + rpmRC rc = RPMRC_OK, rc2 = RPMRC_OK; if (cb(cbdata, RPMRICH_PARSE_ENTER, p, 0, 0, 0, 0, op, emsg) != RPMRC_OK) return RPMRC_FAIL; @@ -1486,8 +1492,13 @@ rpmRC rpmrichParse(const char **dstrp, char **emsg, rpmrichParseFunction cb, voi return RPMRC_FAIL; } if (*p == '(') { - if (rpmrichParse(&p, emsg, cb, cbdata) != RPMRC_OK) + rc = richParse(&p, emsg, cb, cbdata); + if (rc != RPMRC_OK && rc != RPMRC_AND) { return RPMRC_FAIL; + } + if (rc == RPMRC_AND) { + rc2 = RPMRC_AND; + } } else { if (parseSimpleDep(&p, emsg, cb, cbdata) != RPMRC_OK) return RPMRC_FAIL; @@ -1510,9 +1521,10 @@ rpmRC rpmrichParse(const char **dstrp, char **emsg, rpmrichParseFunction cb, voi rasprintf(emsg, _("Cannot chain different ops")); return RPMRC_FAIL; } - if (chainop && op != RPMRICHOP_AND && op != RPMRICHOP_OR) { + if (chainop && op != RPMRICHOP_AND && op != RPMRICHOP_OR && + op != RPMRICHOP_WITH) { if (emsg) - rasprintf(emsg, _("Can only chain AND and OR ops")); + rasprintf(emsg, _("Can only chain AND, WITH and OR ops")); return RPMRC_FAIL; } if (cb(cbdata, RPMRICH_PARSE_OP, p, pe - p, 0, 0, 0, op, emsg) != RPMRC_OK) @@ -1520,13 +1532,26 @@ rpmRC rpmrichParse(const char **dstrp, char **emsg, rpmrichParseFunction cb, voi chainop = op; p = pe; } + if (op == RPMRICHOP_WITH && rc2 == RPMRC_AND) { + rasprintf(emsg, _("Cannot nest and in with clauses")); + return RPMRC_FAIL; + } + if (op == RPMRICHOP_AND) { + rc2 = RPMRC_AND; + } p++; if (cb(cbdata, RPMRICH_PARSE_LEAVE, *dstrp, p - *dstrp , 0, 0, 0, op, emsg) != RPMRC_OK) return RPMRC_FAIL; *dstrp = p; - return RPMRC_OK; + return rc2; } +rpmRC rpmrichParse(const char **dstrp, char **emsg, rpmrichParseFunction cb, void *cbdata) +{ + rpmRC rc = richParse(dstrp, emsg, cb, cbdata); + if (rc == RPMRC_AND) rc = RPMRC_OK; + return rc; +} struct rpmdsParseRichDepData { rpmds dep; diff --git a/lib/rpmds.h b/lib/rpmds.h index a113609ae4..e8c44f2255 100644 --- a/lib/rpmds.h +++ b/lib/rpmds.h @@ -468,7 +468,8 @@ typedef enum rpmrichOp_e { RPMRICHOP_AND = 2, RPMRICHOP_OR = 3, RPMRICHOP_IF = 4, - RPMRICHOP_ELSE = 5 + RPMRICHOP_ELSE = 5, + RPMRICHOP_WITH = 6 } rpmrichOp; typedef enum rpmrichParseType_e { diff --git a/tests/rpmdeps.at b/tests/rpmdeps.at index 6730d2299d..8855c5ac2e 100644 --- a/tests/rpmdeps.at +++ b/tests/rpmdeps.at @@ -303,3 +303,807 @@ runroot rpm -e hello.i686 [], []) AT_CLEANUP + +# ------------------------------ +# +AT_SETUP([unsatisfied AND require - all missing]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two and deptest-three)" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm +], +[1], +[], +[error: Failed dependencies: + (deptest-two and deptest-three) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([unsatisfied AND require - first is missing]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two and deptest-three)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg three" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm +], +[2], +[], +[error: Failed dependencies: + (deptest-two and deptest-three) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([unsatisfied AND require - second is missing]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two and deptest-three)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[2], +[], +[error: Failed dependencies: + (deptest-two and deptest-three) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([satisfied AND require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two and deptest-three)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg three" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +# ------------------------------ +# +AT_SETUP([unsatisfied OR require - all missing]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two or deptest-three)" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm +], +[1], +[], +[error: Failed dependencies: + (deptest-two or deptest-three) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([satisfied OR require - first is missing]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two or deptest-three)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg three" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +AT_SETUP([satisfied OR require - second is missing]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two or deptest-three)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +AT_SETUP([satisfied OR require - both present]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two or deptest-three)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg three" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +# ------------------------------ +# +AT_SETUP([unsatisfied IF require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two if deptest-three)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg three" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm +], +[2], +[], +[error: Failed dependencies: + (deptest-two if deptest-three) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([satisfied IF require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two if deptest-three)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg three" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +AT_SETUP([unsatisfied IF-ELSE require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two if deptest-three else deptest-four)" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm +], +[1], +[], +[error: Failed dependencies: + (deptest-two if deptest-three else deptest-four) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([satisfied IF-ELSE require - right clause]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two if deptest-three else deptest-four)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg four" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-four-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +AT_SETUP([satisfied IF-ELSE require - left clause]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two if deptest-three else deptest-four)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg three" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +# ------------------------------ +# +AT_SETUP([unsatisfied nested AND-OR require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two and (deptest-three or deptest-four))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[2], +[], +[error: Failed dependencies: + (deptest-two and (deptest-three or deptest-four)) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([satisfied nested AND-OR require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two and (deptest-three or deptest-four))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg three" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +# ------------------------------ +# +AT_SETUP([satisfied nested AND-IF require - without right clause]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two and (deptest-three if deptest-four))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +AT_SETUP([satisfied nested AND-IF require - with right clause]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two and (deptest-three if deptest-four))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg four" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg three" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-four-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +# ------------------------------ +# +AT_SETUP([satisfied nested OR-IF require - by left clause]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two or (deptest-three if deptest-four))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +AT_SETUP([satisfied nested OR-IF require - by right clause]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two or (deptest-three if deptest-four))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg four" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg three" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-four-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +# ------------------------------ +# +AT_SETUP([unsatisfied WITH require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with flavor = dekstop)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + --define "provs flavor = server" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg three" \ + --define "provs flavor = desktop" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-three-1.0-1.noarch.rpm +], +[3], +[], +[error: Failed dependencies: + (deptest-two with flavor = dekstop) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([satisfied WITH require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with flavor = desktop)" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + --define "provs flavor = desktop" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +# ------------------------------ +# +AT_SETUP([unsatisfied nested WITH-AND require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with (flavor = dekstop and featured))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + --define "provs flavor = desktop" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[2], +[], +[error: Failed dependencies: + (deptest-two with (flavor = dekstop and featured)) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([satisfied nested WITH-AND require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with (flavor = dekstop and featured))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + --define "provs flavor = desktop, featured" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +# ------------------------------ +# +AT_SETUP([unsatisfied nested WITH-OR require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with (flavor = dekstop or flavor = workstation))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm +], +[1], +[], +[error: Failed dependencies: + (deptest-two with (flavor = dekstop or flavor = workstation)) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([satisfied nested WITH-OR require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with (flavor = dekstop or flavor = workstation))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + --define "provs flavor = workstation" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +# ------------------------------ +# +AT_SETUP([unsatisfied nested WITH-IF require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with (flavor = dekstop if deptest-desktop))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg desktop" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-desktop-1.0-1.noarch.rpm +], +[2], +[], +[error: Failed dependencies: + (deptest-two with (flavor = dekstop if deptest-desktop)) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([satisfied nested WITH-IF require - not featured]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with (flavor = dekstop if deptest-desktop))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +AT_SETUP([satisfied nested WITH-IF require - full chain]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with (flavor = dekstop if deptest-desktop))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + --define "provs flavor = desktop" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg desktop" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-desktop-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +# ------------------------------ +# +AT_SETUP([unsatisfied nested WITH-IF-ELSE require]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with (flavor = dekstop if deptest-desktop else flavor = minimal))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[2], +[], +[error: Failed dependencies: + (deptest-two with (flavor = dekstop if deptest-desktop else flavor = minimal)) is needed by deptest-one-1.0-1.noarch +]) +AT_CLEANUP + +AT_SETUP([satisfied nested WITH-IF-ELSE require - left clause]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with (flavor = dekstop if deptest-desktop else flavor = minimal))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + --define "provs flavor = desktop" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg desktop" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-desktop-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP + +AT_SETUP([satisfied nested WITH-IF-ELSE require - right clause]) +AT_KEYWORDS([install, boolean]) +AT_CHECK([ +RPMDB_CLEAR +RPMDB_INIT +rm -rf "${TOPDIR}" + +runroot rpmbuild --quiet -bb \ + --define "pkg one" \ + --define "reqs (deptest-two with (flavor = dekstop if deptest-desktop else flavor = minimal))" \ + /data/SPECS/deptest.spec + +runroot rpmbuild --quiet -bb \ + --define "pkg two" \ + --define "provs flavor = minimal" \ + /data/SPECS/deptest.spec + +runroot rpm -U /build/RPMS/noarch/deptest-one-1.0-1.noarch.rpm /build/RPMS/noarch/deptest-two-1.0-1.noarch.rpm +], +[0], +[], +[]) +AT_CLEANUP