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):