Michael Schröder
cebe6dd1a8
OBS-URL: https://build.opensuse.org/package/show/Base:System/rpm?expand=0&rev=93
66 lines
2.1 KiB
Diff
66 lines
2.1 KiB
Diff
This patch supports an extension in the condition evaluation.
|
|
If the condition is a format and returns an nonempty string, it is
|
|
assumed to be true.
|
|
This mechanism is used by the weakdeps patch to filter the
|
|
"RPMSENSE_STRONG" flag.
|
|
|
|
--- ./lib/headerfmt.c.orig 2010-12-03 12:11:57.000000000 +0000
|
|
+++ ./lib/headerfmt.c 2011-05-10 17:06:49.000000000 +0000
|
|
@@ -568,8 +568,12 @@ static int parseExpression(headerSprintf
|
|
|
|
*endPtr = chptr;
|
|
|
|
+ token->u.cond.tag.type = NULL;
|
|
+ token->u.cond.tag.format = "";
|
|
token->type = PTOK_COND;
|
|
|
|
+ if ((token->u.cond.tag.type = strchr(str, ':')) != 0)
|
|
+ *token->u.cond.tag.type++ = 0;
|
|
(void) findTag(hsa, token, str);
|
|
|
|
return 0;
|
|
@@ -657,6 +661,7 @@ static char * singleSprintf(headerSprint
|
|
int i, j, found;
|
|
rpm_count_t count, numElements;
|
|
sprintfToken spft;
|
|
+ sprintfTag stag;
|
|
int condNumFormats;
|
|
size_t need;
|
|
|
|
@@ -687,6 +692,18 @@ static char * singleSprintf(headerSprint
|
|
headerIsEntry(hsa->h, token->u.cond.tag.tag)) {
|
|
spft = token->u.cond.ifFormat;
|
|
condNumFormats = token->u.cond.numIfTokens;
|
|
+ if (token->u.cond.tag.fmt) {
|
|
+ /* check if format creates output */
|
|
+ size_t vallen = hsa->vallen;
|
|
+ formatValue(hsa, &token->u.cond.tag, element);
|
|
+ if (hsa->vallen == vallen) {
|
|
+ spft = token->u.cond.elseFormat;
|
|
+ condNumFormats = token->u.cond.numElseTokens;
|
|
+ } else {
|
|
+ hsa->vallen = vallen;
|
|
+ hsa->val[hsa->vallen] = 0;
|
|
+ }
|
|
+ }
|
|
} else {
|
|
spft = token->u.cond.elseFormat;
|
|
condNumFormats = token->u.cond.numElseTokens;
|
|
@@ -710,10 +727,13 @@ static char * singleSprintf(headerSprint
|
|
for (i = 0; i < token->u.array.numTokens; i++, spft++)
|
|
{
|
|
rpmtd td = NULL;
|
|
- if (spft->type != PTOK_TAG ||
|
|
- spft->u.tag.justOne) continue;
|
|
+ if (spft->type != PTOK_TAG && spft->type != PTOK_COND)
|
|
+ continue;
|
|
+ stag = (spft->type == PTOK_COND ? &spft->u.cond.tag : &spft->u.tag);
|
|
+ if (stag->justOne)
|
|
+ continue;
|
|
|
|
- if (!(td = getData(hsa, spft->u.tag.tag))) {
|
|
+ if (!(td = getData(hsa, stag->tag))) {
|
|
continue;
|
|
}
|
|
|