teknoraver / rpms / rpm

Forked from rpms/rpm 6 months ago
Clone

Blame 0001-Allow-parametric-macros-to-opt-out-of-option-process.patch

Miro Hrončok 9f20db
From 1f9a0e049e2db70e6fc6d630fa3c63f57517dea4 Mon Sep 17 00:00:00 2001
Miro Hrončok 9f20db
From: Panu Matilainen <pmatilai@redhat.com>
Miro Hrončok 9f20db
Date: Fri, 9 Oct 2020 14:43:14 +0300
Miro Hrončok 9f20db
Subject: [PATCH] Allow parametric macros to opt out of option processing
Miro Hrončok 9f20db
 (#547)
Miro Hrončok 9f20db
MIME-Version: 1.0
Miro Hrončok 9f20db
Content-Type: text/plain; charset=UTF-8
Miro Hrončok 9f20db
Content-Transfer-Encoding: 8bit
Miro Hrončok 9f20db
Miro Hrončok 9f20db
Macros might want to pass along options meant for others while perhaps
Miro Hrončok 9f20db
modifying some of them, without exposing it all to users.
Miro Hrončok 9f20db
Miro Hrončok 9f20db
Have "-" as the parametric macro opts string disable all options processing
Miro Hrončok 9f20db
in rpm, allowing the macro to handle the raw argument list as they place.
Miro Hrončok 9f20db
Miro Hrončok 9f20db
Fixes: #547
Miro Hrončok 9f20db
Miro Hrončok 9f20db
(cherry picked from commit f9516434dd70cf0d5125e9e997b2c278b4fb4bf2)
Miro Hrončok 9f20db
Miro Hrončok 9f20db
Co-Authored-By: Miro Hrončok <miro@hroncok.cz>
Miro Hrončok 9f20db
---
Miro Hrončok 9f20db
 doc/manual/macros |  3 ++-
Miro Hrončok 9f20db
 rpmio/macro.c     |  7 ++++++-
Miro Hrončok 9f20db
 tests/rpmmacro.at | 12 ++++++++++++
Miro Hrončok 9f20db
 3 files changed, 20 insertions(+), 2 deletions(-)
Miro Hrončok 9f20db
Miro Hrončok 9f20db
diff --git a/doc/manual/macros b/doc/manual/macros
Miro Hrončok 9f20db
index 45345d036..a33c54e03 100644
Miro Hrončok 9f20db
--- a/doc/manual/macros
Miro Hrončok 9f20db
+++ b/doc/manual/macros
Miro Hrončok 9f20db
@@ -22,7 +22,8 @@ All whitespace surrounding \<body\> is removed.  Name may be composed
Miro Hrončok 9f20db
 of alphanumeric characters, and the character `_' and must be at least
Miro Hrončok 9f20db
 3 characters in length. A macro without an (opts) field is "simple" in that
Miro Hrončok 9f20db
 only recursive macro expansion is performed. A parameterized macro contains
Miro Hrončok 9f20db
-an (opts) field. The opts (i.e. string between parentheses) is passed
Miro Hrončok 9f20db
+an (opts) field. "-" as opts disables all option processing, otherwise
Miro Hrončok 9f20db
+the opts (i.e. string between parentheses) are passed
Miro Hrončok 9f20db
 exactly as is to getopt(3) for argc/argv processing at the beginning of
Miro Hrončok 9f20db
 a macro invocation.  While a parameterized macro is being expanded, the
Miro Hrončok 9f20db
 following shell-like macros are available:
Miro Hrončok 9f20db
diff --git a/rpmio/macro.c b/rpmio/macro.c
Miro Hrončok 9f20db
index 35d896049..490bf9a6a 100644
Miro Hrončok 9f20db
--- a/rpmio/macro.c
Miro Hrončok 9f20db
+++ b/rpmio/macro.c
Miro Hrončok 9f20db
@@ -910,6 +910,7 @@ grabArgs(MacroBuf mb, const rpmMacroEntry me, const char * se,
Miro Hrončok 9f20db
     ARGV_t argv = NULL;
Miro Hrončok 9f20db
     int argc = 0;
Miro Hrončok 9f20db
     int c;
Miro Hrončok 9f20db
+    int run;
Miro Hrončok 9f20db
 
Miro Hrončok 9f20db
     /* 
Miro Hrončok 9f20db
      * Prepare list of call arguments, starting with macro name as argv[0].
Miro Hrončok 9f20db
@@ -960,8 +961,12 @@ grabArgs(MacroBuf mb, const rpmMacroEntry me, const char * se,
Miro Hrončok 9f20db
     opts = me->opts;
Miro Hrončok 9f20db
     argc = argvCount(argv);
Miro Hrončok 9f20db
 
Miro Hrončok 9f20db
+    /* If option processing is disabled, the while below will be skipped */
Miro Hrončok 9f20db
+    run = strcmp(opts, "-");
Miro Hrončok 9f20db
+    if (!run)
Miro Hrončok 9f20db
+	optind = 1;
Miro Hrončok 9f20db
     /* Define option macros. */
Miro Hrončok 9f20db
-    while ((c = getopt(argc, argv, opts)) != -1)
Miro Hrončok 9f20db
+    while (run && (c = getopt(argc, argv, opts)) != -1)
Miro Hrončok 9f20db
     {
Miro Hrončok 9f20db
 	char *name = NULL, *body = NULL;
Miro Hrončok 9f20db
 	if (c == '?' || strchr(opts, c) == NULL) {
Miro Hrončok 9f20db
diff --git a/tests/rpmmacro.at b/tests/rpmmacro.at
Miro Hrončok 9f20db
index 873783153..faafb170d 100644
Miro Hrončok 9f20db
--- a/tests/rpmmacro.at
Miro Hrončok 9f20db
+++ b/tests/rpmmacro.at
Miro Hrončok 9f20db
@@ -198,6 +198,18 @@ bar' \
Miro Hrončok 9f20db
 ])
Miro Hrončok 9f20db
 AT_CLEANUP
Miro Hrončok 9f20db
 
Miro Hrončok 9f20db
+AT_SETUP([parametrized macro 6])
Miro Hrončok 9f20db
+AT_KEYWORDS([macros])
Miro Hrončok 9f20db
+AT_CHECK([
Miro Hrončok 9f20db
+runroot rpm \
Miro Hrončok 9f20db
+    --define '%foo(-) %{*}' \
Miro Hrončok 9f20db
+    --eval '%foo 5 a -z -b2'
Miro Hrončok 9f20db
+],
Miro Hrončok 9f20db
+[0],
Miro Hrončok 9f20db
+[5 a -z -b2
Miro Hrončok 9f20db
+])
Miro Hrončok 9f20db
+AT_CLEANUP
Miro Hrončok 9f20db
+
Miro Hrončok 9f20db
 AT_SETUP([uncompress macro 1])
Miro Hrončok 9f20db
 AT_KEYWORDS([macros])
Miro Hrončok 9f20db
 AT_CHECK([
Miro Hrončok 9f20db
-- 
Miro Hrončok 9f20db
2.47.1
Miro Hrončok 9f20db