From 3c9f003fe6ccca3f8c7c228f8ea487b316b0c7f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikola=20Forr=C3=B3?= Date: Wed, 11 Mar 2026 14:39:57 +0100 Subject: [PATCH] Convert also shell expansions doing string processing on constants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For instance `%(echo 1.27.9-rc1 | sed 's/-/~/g')`. Signed-off-by: Nikola Forró Assisted-by: Claude Opus 4.6 via Cursor --- specfile/sanitizer.py | 10 ++++++++-- tests/unit/test_sanitizer.py | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/specfile/sanitizer.py b/specfile/sanitizer.py index ed0945d..8f49c34 100644 --- a/specfile/sanitizer.py +++ b/specfile/sanitizer.py @@ -359,6 +359,12 @@ def normalize_macro(expr): return None return expr + def normalize_literal(expr): + expr = strip_quotes(expr.strip()) + if not expr or re.search(r"[%{}]", expr): + return None + return f"%{{quote:{expr}}}" + def is_safe_for_expand(s): return not re.search(r"%(\{\w+[\s:]|\(|\[)", s) @@ -709,7 +715,7 @@ def convert_glob_removal(expr, op, pat): # --- echo EXPR | CMD (pipe pattern) --- m = _RE_PIPE.match(body) if m: - expr = normalize_macro(m.group(1)) + expr = normalize_macro(m.group(1)) or normalize_literal(m.group(1)) if expr is not None: cmd = m.group(2).strip() result = convert_string_op(expr, cmd) @@ -720,7 +726,7 @@ def convert_glob_removal(expr, op, pat): m = _RE_HERESTRING.match(body) if m: cmd = m.group(1).strip() - expr = normalize_macro(m.group(2)) + expr = normalize_macro(m.group(2)) or normalize_literal(m.group(2)) if expr is not None: result = convert_string_op(expr, cmd) if result: diff --git a/tests/unit/test_sanitizer.py b/tests/unit/test_sanitizer.py index a9556f1..20b41fe 100644 --- a/tests/unit/test_sanitizer.py +++ b/tests/unit/test_sanitizer.py @@ -319,6 +319,10 @@ def test_pipe_to_tr(body, expected): "echo %{unversion} | sed 's/_/./g'", '%{lua:print((rpm.expand("%{unversion}"):gsub("_", ".")))}', ), + ( + "echo 1.2.3-rc4 | sed 's/-/~/g'", + '%{lua:print((rpm.expand("%{quote:1.2.3-rc4}"):gsub("-", "~")))}', + ), ], ) def test_pipe_to_sed(body, expected): @@ -390,6 +394,10 @@ def test_pipe_to_awk(body, expected): "sed 's/\\.//g' <<<%{version}", '%{lua:print((rpm.expand("%{version}"):gsub("%.", "")))}', ), + ( + "sed 's/-/~/g' <<<1.2.3-rc4", + '%{lua:print((rpm.expand("%{quote:1.2.3-rc4}"):gsub("-", "~")))}', + ), ], ) def test_herestring(body, expected):