diff --git a/conan/internal/conan_app.py b/conan/internal/conan_app.py index 1319df62d64..36f1e1361a6 100644 --- a/conan/internal/conan_app.py +++ b/conan/internal/conan_app.py @@ -21,10 +21,10 @@ def __init__(self, cache): else: self._wrapper = None - def wrap(self, cmd): + def wrap(self, cmd, conanfile, **kwargs): if self._wrapper is None: return cmd - return self._wrapper(cmd) + return self._wrapper(cmd, conanfile=conanfile, **kwargs) class ConanFileHelpers: diff --git a/conans/model/conan_file.py b/conans/model/conan_file.py index 98082a8e490..802738098af 100644 --- a/conans/model/conan_file.py +++ b/conans/model/conan_file.py @@ -299,7 +299,7 @@ def generators_path(self) -> Path: def run(self, command, stdout=None, cwd=None, ignore_errors=False, env="", quiet=False, shell=True, scope="build"): # NOTE: "self.win_bash" is the new parameter "win_bash" for Conan 2.0 - command = self._conan_helpers.cmd_wrapper.wrap(command) + command = self._conan_helpers.cmd_wrapper.wrap(command, conanfile=self) if env == "": # This default allows not breaking for users with ``env=None`` indicating # they don't want any env-file applied env = "conanbuild" if scope == "build" else "conanrun" diff --git a/conans/test/integration/extensions/test_plugin_cmd_wrapper.py b/conans/test/integration/extensions/test_plugin_cmd_wrapper.py index 6635734341f..7c13f4e4fd0 100644 --- a/conans/test/integration/extensions/test_plugin_cmd_wrapper.py +++ b/conans/test/integration/extensions/test_plugin_cmd_wrapper.py @@ -10,10 +10,9 @@ def test_plugin_cmd_wrapper(): c = TestClient() plugins = os.path.join(c.cache.cache_folder, "extensions", "plugins") wrapper = textwrap.dedent(""" - def cmd_wrapper(cmd): + def cmd_wrapper(cmd, **kwargs): return 'echo "{}"'.format(cmd) """) - # TODO: Decide name save(os.path.join(plugins, "cmd_wrapper.py"), wrapper) conanfile = textwrap.dedent(""" from conan import ConanFile @@ -28,6 +27,28 @@ def generate(self): assert 'Other stuff' in c.out +def test_plugin_cmd_wrapper_conanfile(): + """ + we can get the name of the caller conanfile too + """ + c = TestClient() + plugins = os.path.join(c.cache.cache_folder, "extensions", "plugins") + wrapper = textwrap.dedent(""" + def cmd_wrapper(cmd, conanfile, **kwargs): + return 'echo "{}!:{}!"'.format(conanfile.ref, cmd) + """) + save(os.path.join(plugins, "cmd_wrapper.py"), wrapper) + conanfile = textwrap.dedent(""" + from conan import ConanFile + class Pkg(ConanFile): + def generate(self): + self.run("Hello world") + """) + c.save({"conanfile.py": conanfile}) + c.run("install . --name=pkg --version=0.1") + assert 'pkg/0.1!:Hello world!' in c.out + + def test_plugin_profile_error_vs(): c = TestClient() c.save({"conanfile.py": GenConanfile("pkg", "1.0")})