summaryrefslogtreecommitdiffstats
path: root/src/ansiblelint/rules/command_instead_of_shell.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ansiblelint/rules/command_instead_of_shell.py')
-rw-r--r--src/ansiblelint/rules/command_instead_of_shell.py26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/ansiblelint/rules/command_instead_of_shell.py b/src/ansiblelint/rules/command_instead_of_shell.py
index 346a071..789adca 100644
--- a/src/ansiblelint/rules/command_instead_of_shell.py
+++ b/src/ansiblelint/rules/command_instead_of_shell.py
@@ -1,4 +1,5 @@
"""Implementation of command-instead-of-shell rule."""
+
# Copyright (c) 2016 Will Thames <will@thames.id.au>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -23,15 +24,18 @@ from __future__ import annotations
import sys
from typing import TYPE_CHECKING
-from ansiblelint.rules import AnsibleLintRule
+from ansiblelint.rules import AnsibleLintRule, TransformMixin
from ansiblelint.utils import get_cmd_args
if TYPE_CHECKING:
+ from ruamel.yaml.comments import CommentedMap, CommentedSeq
+
+ from ansiblelint.errors import MatchError
from ansiblelint.file_utils import Lintable
from ansiblelint.utils import Task
-class UseCommandInsteadOfShellRule(AnsibleLintRule):
+class UseCommandInsteadOfShellRule(AnsibleLintRule, TransformMixin):
"""Use shell only when shell functionality is required."""
id = "command-instead-of-shell"
@@ -62,13 +66,27 @@ class UseCommandInsteadOfShellRule(AnsibleLintRule):
return not any(ch in jinja_stripped_cmd for ch in "&|<>;$\n*[]{}?`")
return False
+ def transform(
+ self,
+ match: MatchError,
+ lintable: Lintable,
+ data: CommentedMap | CommentedSeq | str,
+ ) -> None:
+ if match.tag == "command-instead-of-shell":
+ target_task = self.seek(match.yaml_path, data)
+ for _ in range(len(target_task)):
+ k, v = target_task.popitem(False)
+ target_task["ansible.builtin.command" if "shell" in k else k] = v
+ match.fixed = True
+
# testing code to be loaded only with pytest or when executed the rule file
if "pytest" in sys.modules:
import pytest
- from ansiblelint.rules import RulesCollection # pylint: disable=ungrouped-imports
- from ansiblelint.runner import Runner # pylint: disable=ungrouped-imports
+ # pylint: disable=ungrouped-imports
+ from ansiblelint.rules import RulesCollection
+ from ansiblelint.runner import Runner
@pytest.mark.parametrize(
("file", "expected"),