diff --git a/README.md b/README.md index 87ee642d..5e84f245 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,16 @@ variable ``CONAN_HOOK_ERROR_LEVEL``: - ``CONAN_HOOK_ERROR_LEVEL=40`` it will raise if any error happen. - ``CONAN_HOOK_ERROR_LEVEL=30`` it will raise if any error or warning happen. +If you want to decrease logging level, you can adjust it by the environment variable +``CONAN_HOOK_LOGGING_LEVEL``: + - ``CONAN_HOOK_LOGGING_LEVEL=40`` it will print out only error messages + - ``CONAN_HOOK_LOGGING_LEVEL=WARNING`` it will print out only warning and error messages + +It accepts both logging level names and logging level code: + - ERROR: 40 + - WARNING/WARN: 30 + - INFO: 20 ### [Attribute checker](hooks/attribute_checker.py) diff --git a/hooks/conan-center.py b/hooks/conan-center.py index b0b7b52f..00b4fbcb 100644 --- a/hooks/conan-center.py +++ b/hooks/conan-center.py @@ -85,6 +85,18 @@ def __init__(self, output, kb_id=None): if self.kb_id: self.kb_url = kb_url(self.kb_id) self._error_level = int(os.getenv("CONAN_HOOK_ERROR_LEVEL", str(NOTSET))) + self._set_logging_level() + + def _set_logging_level(self): + level = os.getenv("CONAN_HOOK_LOGGING_LEVEL", str(NOTSET)) + name_level = {"ERROR": 40, "WARNING": 30, "WARN": 30, "INFO": 20, "DEBUG": 10, "NOTSET": 0} + if level.isdigit(): + self._logging_level = int(level) + elif level.upper() in name_level: + self._logging_level = name_level[level.upper()] + else: + self._logging_level = NOTSET + self.error("CONAN_HOOK_LOGGING_LEVEL is set to an incorrect value") def _get_message(self, message): if self._test_name: @@ -94,30 +106,36 @@ def _get_message(self, message): return message def success(self, message): - self._output.success(self._get_message(message)) + if self._logging_level <= INFO: + self._output.success(self._get_message(message)) def debug(self, message): if self._error_level and self._error_level <= DEBUG: self._error = True - self._output.debug(self._get_message(message)) + if self._logging_level <= DEBUG: + self._output.debug(self._get_message(message)) def info(self, message): if self._error_level and self._error_level <= INFO: self._error = True - self._output.info(self._get_message(message)) + if self._logging_level <= INFO: + self._output.info(self._get_message(message)) def warn(self, message): if self._error_level and self._error_level <= WARNING: self._error = True - if hasattr(self._output, "warn"): - self._output.warn(self._get_message(message)) - else: - self._output.warning(self._get_message(message)) + + if self._logging_level <= WARNING: + if hasattr(self._output, "warn"): + self._output.warn(self._get_message(message)) + else: + self._output.warning(self._get_message(message)) def error(self, message): self._error = True - url_str = '({})'.format(self.kb_url) if self.kb_id else "" - self._output.error(self._get_message(message) + " " + url_str) + if self._logging_level <= ERROR: + url_str = '({})'.format(self.kb_url) if self.kb_id else "" + self._output.error(self._get_message(message) + " " + url_str) def __str__(self): return self._output._stream.getvalue() diff --git a/tests/test_hooks/conan-center/test_conan-center.py b/tests/test_hooks/conan-center/test_conan-center.py index 8f8e7cc2..20b2dcba 100644 --- a/tests/test_hooks/conan-center/test_conan-center.py +++ b/tests/test_hooks/conan-center/test_conan-center.py @@ -987,6 +987,100 @@ class AConan(ConanFile): self.assertIn("ERROR: [LICENSE PUBLIC DOMAIN (KB-H056)] " \ "Public Domain is not a SPDX license. Use 'Unlicense' instead.", output) + def test_library_doesnot_exist(self): + conanfile = textwrap.dedent("""\ + from conans import ConanFile + import os + + class AConan(ConanFile): + settings = "os" + + def package(self): + os.makedirs(os.path.join(self.package_folder, "lib")) + open(os.path.join(self.package_folder, "lib", "libfoo.a"), "w") + + def package_info(self): + self.cpp_info.libs = [] + """) + tools.save('conanfile.py', content=conanfile) + + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn("[LIBRARY DOES NOT EXIST (KB-H054)] OK", output) + + tools.save('conanfile.py', content=conanfile.replace("open", "# open")) + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn("[LIBRARY DOES NOT EXIST (KB-H054)] OK", output) + + tools.save('conanfile.py', content=conanfile.replace("[]", "['bar']")) + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn('ERROR: [LIBRARY DOES NOT EXIST (KB-H054)] Component ' + 'name::name library "bar" not found in libdirs', output) + + tools.save('conanfile.py', content=conanfile.replace("libs", "components['fake'].libs")) + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn("[LIBRARY DOES NOT EXIST (KB-H054)] OK", output) + + tools.save('conanfile.py', content=conanfile.replace("libs", "components['fake'].libs") + .replace("open", "# open")) + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn("[LIBRARY DOES NOT EXIST (KB-H054)] OK", output) + + tools.save('conanfile.py', content=conanfile.replace("libs = []", + "components['fake'].libs = ['bar']")) + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn('ERROR: [LIBRARY DOES NOT EXIST (KB-H054)] Component ' + 'name::fake library "bar" not found in libdirs', output) + + tools.save('conanfile.py', content=self.conanfile_header_only) + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn("[LIBRARY DOES NOT EXIST (KB-H054)] OK", output) + self.assertNotIn('does not contain any library', output) + + def test_logging_level(self): + conanfile = textwrap.dedent("""\ + from conans import ConanFile + + class FoobarConan(ConanFile): + pass + """) + tools.save('conanfile.py', content=conanfile) + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn("ERROR: [PACKAGE LICENSE (KB-H012)]", output) + self.assertIn("WARN: [HEADER_ONLY, NO COPY SOURCE (KB-H005)]", output) + self.assertIn("[FPIC MANAGEMENT (KB-H007)] OK", output) + + with tools.environment_append({"CONAN_HOOK_LOGGING_LEVEL": "oops"}): + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn("ERROR: CONAN_HOOK_LOGGING_LEVEL is set to an incorrect value", output) + + for level in ["INFO", "20"]: + with tools.environment_append({"CONAN_HOOK_LOGGING_LEVEL": level}): + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn("ERROR: [PACKAGE LICENSE (KB-H012)]", output) + self.assertIn("WARN: [HEADER_ONLY, NO COPY SOURCE (KB-H005)]", output) + self.assertIn("[FPIC MANAGEMENT (KB-H007)] OK", output) + + + for level in ["Warning", "30"]: + with tools.environment_append({"CONAN_HOOK_LOGGING_LEVEL": level}): + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn("ERROR: [PACKAGE LICENSE (KB-H012)]", output) + self.assertIn("WARN: [HEADER_ONLY, NO COPY SOURCE (KB-H005)]", output) + self.assertNotIn("[FPIC MANAGEMENT (KB-H007)] OK", output) + + for level in ["error", "40"]: + with tools.environment_append({"CONAN_HOOK_LOGGING_LEVEL": level}): + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertIn("ERROR: [PACKAGE LICENSE (KB-H012)]", output) + self.assertNotIn("WARN: [HEADER_ONLY, NO COPY SOURCE (KB-H005)]", output) + self.assertNotIn("[FPIC MANAGEMENT (KB-H007)] OK", output) + + with tools.environment_append({"CONAN_HOOK_LOGGING_LEVEL": "9001"}): # Over 9000 + output = self.conan(['create', '.', 'name/version@user/test']) + self.assertNotIn("WARN: [HEADER_ONLY, NO COPY SOURCE (KB-H005)]", output) + self.assertNotIn("[FPIC MANAGEMENT (KB-H007)] OK", output) + self.assertNotIn("ERROR: [PACKAGE LICENSE (KB-H012)]", output) + def test_os_rename_warning(self): conanfile = textwrap.dedent("""\ from conans import ConanFile, tools