[{"id":32524,"web_url":"https://patchwork.libcamera.org/comment/32524/","msgid":"<71hhLR3qix2SFH8FEkZ2bPpZKVkX0Fwf-t4KfO1NB2TQWUAHK5WS8EwTFkQYdbwt_Xw3QmzbkGlSFukCP3iRb5aZ8r_FHMGJxA-7yn9lku8=@protonmail.com>","date":"2024-12-04T17:45:02","subject":"Re: [PATCH v5 07/15] config: Look up log color configuration in\n\tconfiguration file","submitter":{"id":133,"url":"https://patchwork.libcamera.org/api/people/133/","name":"Pőcze Barnabás","email":"pobrn@protonmail.com"},"content":"Hi\n\n\n2024. október 1., kedd 12:27 keltezéssel, Milan Zamazal <mzamazal@redhat.com> írta:\n\n> The configuration snippet:\n> \n>   configuration:\n>     log:\n>       color: BOOL\n> \n> In order to use the global configuration access helper for a boolean\n> value, we must make a template from it.  To make the template visible,\n> we must implement it in the header file, otherwise undefined reference\n> error would be reported when linking.\n> \n> We don't implement envOption helper for boolean here, because we would\n> have to deal with a specific value interpretation in this particular\n> case.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  .../libcamera/internal/global_configuration.h | 27 ++++++++++++++++++-\n>  src/libcamera/base/global_configuration.cpp   | 20 ++++----------\n>  src/libcamera/base/log.cpp                    |  2 ++\n>  3 files changed, 33 insertions(+), 16 deletions(-)\n> \n> diff --git a/include/libcamera/internal/global_configuration.h b/include/libcamera/internal/global_configuration.h\n> index b1529f392..d34410744 100644\n> --- a/include/libcamera/internal/global_configuration.h\n> +++ b/include/libcamera/internal/global_configuration.h\n> @@ -12,6 +12,8 @@\n>  #include <string>\n>  #include <vector>\n> \n> +#include <libcamera/base/utils.h>\n> +\n>  #include \"libcamera/internal/yaml_parser.h\"\n> \n>  namespace libcamera {\n> @@ -27,7 +29,30 @@ public:\n> \n>  \tstatic unsigned int version();\n>  \tstatic Configuration configuration();\n> -\tstatic std::optional<std::string> option(const std::string &confPath);\n> +\n> +\ttemplate<typename T,\n> +\t\t std::enable_if_t<\n> +\t\t\t std::is_same_v<bool, T> ||\n> +\t\t\t std::is_same_v<double, T> ||\n> +\t\t\t std::is_same_v<int8_t, T> ||\n> +\t\t\t std::is_same_v<uint8_t, T> ||\n> +\t\t\t std::is_same_v<int16_t, T> ||\n> +\t\t\t std::is_same_v<uint16_t, T> ||\n> +\t\t\t std::is_same_v<int32_t, T> ||\n> +\t\t\t std::is_same_v<uint32_t, T> ||\n> +\t\t\t std::is_same_v<std::string, T> ||\n> +\t\t\t std::is_same_v<Size, T>> * = nullptr>\n> +\tstatic std::optional<T> option(const std::string &confPath)\n> +\t{\n> +\t\tYamlObject *c = &const_cast<YamlObject &>(configuration());\n\nWhy are the `const_cast`s needed?\n\n\n> +\t\tfor (auto part : utils::details::StringSplitter(confPath, \".\"))\n\nutils::split(...)\n\n\n> +\t\t\tif (c->contains(part))\n\nYou can get rid of this check, e.g.\n\n  for (...) {\n    c = &(*c)[part];\n    if (!*c)\n      return {};\n  }\n\nIt does not look particularly aestethic, though...\n\n\n> +\t\t\t\tc = &const_cast<YamlObject &>((*c)[part]);\n> +\t\t\telse\n> +\t\t\t\treturn std::optional<T>();\n> +\t\treturn c->get<T>();\n> +\t}\n> +\n>  \tstatic std::optional<std::string> envOption(const char *const envVariable,\n>  \t\t\t\t\t\t    const std::string &confPath);\n> \n> diff --git a/src/libcamera/base/global_configuration.cpp b/src/libcamera/base/global_configuration.cpp\n> index 1243a5f4e..82d1339c3 100644\n> --- a/src/libcamera/base/global_configuration.cpp\n> +++ b/src/libcamera/base/global_configuration.cpp\n> @@ -14,7 +14,6 @@\n> \n>  #include <libcamera/base/file.h>\n>  #include <libcamera/base/log.h>\n> -#include <libcamera/base/utils.h>\n> \n>  #include \"libcamera/internal/yaml_parser.h\"\n> \n> @@ -150,23 +149,14 @@ GlobalConfiguration::Configuration GlobalConfiguration::get()\n>  }\n> \n>  /**\n> + * \\fn static std::optional<T> GlobalConfiguration::option(const char *const confPath)\n>   * \\brief Return value of the configuration option identified by \\a confPath\n> + * \\tparam T The type of the retrieved configuration value\n>   * \\param[in] confPath Sequence of the YAML section names (excluding\n>   * `configuration') leading to the requested option separated by dots\n> - * \\return A value if an item corresponding to \\a confPath exists in the\n> - * configuration file, no value otherwise\n> + * \\return A value of type \\a T if an item corresponding to \\a confPath exists\n> + * in the configuration file and matches type \\a T, no value otherwise\n>   */\n> -std::optional<std::string> GlobalConfiguration::option(\n> -\tconst std::string &confPath)\n> -{\n> -\tYamlObject *c = &const_cast<YamlObject &>(configuration());\n> -\tfor (auto part : utils::details::StringSplitter(confPath, \".\"))\n> -\t\tif (c->contains(part))\n> -\t\t\tc = &const_cast<YamlObject &>((*c)[part]);\n> -\t\telse\n> -\t\t\treturn std::optional<std::string>();\n> -\treturn c->get<std::string>();\n> -}\n> \n>  /**\n>   * \\brief Return value of the configuration option from a file or environment\n> @@ -192,7 +182,7 @@ std::optional<std::string> GlobalConfiguration::envOption(\n>  \tconst char *envValue = utils::secure_getenv(envVariable);\n>  \tif (envValue)\n>  \t\treturn std::optional{ std::string{ envValue } };\n> -\treturn option(confPath);\n> +\treturn option<std::string>(confPath);\n>  }\n> \n>  /**\n> diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp\n> index 07352f6c1..d522e895e 100644\n> --- a/src/libcamera/base/log.cpp\n> +++ b/src/libcamera/base/log.cpp\n> @@ -590,6 +590,8 @@ void Logger::logSetLevel(const char *category, const char *level)\n>  Logger::Logger()\n>  {\n>  \tbool color = !utils::secure_getenv(\"LIBCAMERA_LOG_NO_COLOR\");\n> +\tif (color)\n> +\t\tcolor = GlobalConfiguration::option<bool>(\"log.color\").value_or(true);\n>  \tlogSetStream(&std::cerr, color);\n> \n>  \tparseLogFile();\n> --\n> 2.44.1\n> \n> \n\n\nRegards,\nBarnabás Pőcze","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 58D53BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  4 Dec 2024 17:45:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 393B1660D7;\n\tWed,  4 Dec 2024 18:45:12 +0100 (CET)","from mail-40131.protonmail.ch (mail-40131.protonmail.ch\n\t[185.70.40.131])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7DD87618B5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  4 Dec 2024 18:45:10 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=protonmail.com header.i=@protonmail.com\n\theader.b=\"lIsMXeaS\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com;\n\ts=protonmail3; t=1733334308; x=1733593508;\n\tbh=3EPqnTRnP3qYV5ZhkMsqN7zs2Ba15PPQzbxd1Iu6fCI=;\n\th=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References:\n\tFeedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID:\n\tMessage-ID:BIMI-Selector:List-Unsubscribe:List-Unsubscribe-Post;\n\tb=lIsMXeaSTw/b0P41HgAsVbl6f9sorunvZcrabrWFs0ZGdSlOu6UxNrfBlMpISN0RB\n\tNnwyGNFUpOi+/CyII3Z0v7/yVIYvR2v39chQEtJgAJExGTEWUhRa2U98B72b4N3W6F\n\tsxT9fAOqCHj60KsgJwQ39SpNqjRmESMK9nvnV8StUeiNc2vR+EnlpnKAtiFKX46TJK\n\t36Ip1Wav8X9fqj50d44bkHHlw6u1S5oU2WPF6qgFn10vYgtO7c64YwYwGGEPUdwHD/\n\ttyzMtDgApEA6QfMOqyKKwXQAzyYCDurxivPZ4L8VMiZ5xYMEb8QXwUEQukly62ym1r\n\tM9s3JXn8h4A1g==","Date":"Wed, 04 Dec 2024 17:45:02 +0000","To":"Milan Zamazal <mzamazal@redhat.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tNaushir Patuck <naush@raspberrypi.com>","Subject":"Re: [PATCH v5 07/15] config: Look up log color configuration in\n\tconfiguration file","Message-ID":"<71hhLR3qix2SFH8FEkZ2bPpZKVkX0Fwf-t4KfO1NB2TQWUAHK5WS8EwTFkQYdbwt_Xw3QmzbkGlSFukCP3iRb5aZ8r_FHMGJxA-7yn9lku8=@protonmail.com>","In-Reply-To":"<20241001102810.479285-8-mzamazal@redhat.com>","References":"<20241001102810.479285-1-mzamazal@redhat.com>\n\t<20241001102810.479285-8-mzamazal@redhat.com>","Feedback-ID":"20568564:user:proton","X-Pm-Message-ID":"c0dad2d8f0f372308d46109d5ddd5ff229f0e7ab","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":32533,"web_url":"https://patchwork.libcamera.org/comment/32533/","msgid":"<87bjxq1nfs.fsf@redhat.com>","date":"2024-12-05T09:36:23","subject":"Re: [PATCH v5 07/15] config: Look up log color configuration in\n\tconfiguration file","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Barnabás,\n\nthank you for review.\n\nBarnabás Pőcze <pobrn@protonmail.com> writes:\n\n> Hi\n>\n>\n> 2024. október 1., kedd 12:27 keltezéssel, Milan Zamazal <mzamazal@redhat.com> írta:\n>\n>> The configuration snippet:\n>> \n>>   configuration:\n>>     log:\n>>       color: BOOL\n>> \n>> In order to use the global configuration access helper for a boolean\n>> value, we must make a template from it.  To make the template visible,\n>> we must implement it in the header file, otherwise undefined reference\n>> error would be reported when linking.\n>> \n>> We don't implement envOption helper for boolean here, because we would\n>> have to deal with a specific value interpretation in this particular\n>> case.\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  .../libcamera/internal/global_configuration.h | 27 ++++++++++++++++++-\n>>  src/libcamera/base/global_configuration.cpp   | 20 ++++----------\n>>  src/libcamera/base/log.cpp                    |  2 ++\n>>  3 files changed, 33 insertions(+), 16 deletions(-)\n>> \n>> diff --git a/include/libcamera/internal/global_configuration.h b/include/libcamera/internal/global_configuration.h\n>> index b1529f392..d34410744 100644\n>> --- a/include/libcamera/internal/global_configuration.h\n>> +++ b/include/libcamera/internal/global_configuration.h\n>> @@ -12,6 +12,8 @@\n>>  #include <string>\n>>  #include <vector>\n>> \n>> +#include <libcamera/base/utils.h>\n>> +\n>>  #include \"libcamera/internal/yaml_parser.h\"\n>> \n>>  namespace libcamera {\n>> @@ -27,7 +29,30 @@ public:\n>> \n>>  \tstatic unsigned int version();\n>>  \tstatic Configuration configuration();\n>> -\tstatic std::optional<std::string> option(const std::string &confPath);\n>> +\n>> +\ttemplate<typename T,\n>> +\t\t std::enable_if_t<\n>> +\t\t\t std::is_same_v<bool, T> ||\n>> +\t\t\t std::is_same_v<double, T> ||\n>> +\t\t\t std::is_same_v<int8_t, T> ||\n>> +\t\t\t std::is_same_v<uint8_t, T> ||\n>> +\t\t\t std::is_same_v<int16_t, T> ||\n>> +\t\t\t std::is_same_v<uint16_t, T> ||\n>> +\t\t\t std::is_same_v<int32_t, T> ||\n>> +\t\t\t std::is_same_v<uint32_t, T> ||\n>> +\t\t\t std::is_same_v<std::string, T> ||\n>> +\t\t\t std::is_same_v<Size, T>> * = nullptr>\n>> +\tstatic std::optional<T> option(const std::string &confPath)\n>> +\t{\n>> +\t\tYamlObject *c = &const_cast<YamlObject &>(configuration());\n>\n> Why are the `const_cast`s needed?\n\nThey are not, I'll remove them.\n\n>> +\t\tfor (auto part : utils::details::StringSplitter(confPath, \".\"))\n>\n> utils::split(...)\n\nOK.\n\n>> +\t\t\tif (c->contains(part))\n>\n> You can get rid of this check, e.g.\n>\n>   for (...) {\n>     c = &(*c)[part];\n>     if (!*c)\n>       return {};\n>   }\n>\n> It does not look particularly aestethic, though...\n\nI don't have a preference but your version is probably more common, so\nI'll use it.\n\n>> +\t\t\t\tc = &const_cast<YamlObject &>((*c)[part]);\n>> +\t\t\telse\n>> +\t\t\t\treturn std::optional<T>();\n>> +\t\treturn c->get<T>();\n>> +\t}\n>> +\n>>  \tstatic std::optional<std::string> envOption(const char *const envVariable,\n>>  \t\t\t\t\t\t    const std::string &confPath);\n>> \n>> diff --git a/src/libcamera/base/global_configuration.cpp b/src/libcamera/base/global_configuration.cpp\n>> index 1243a5f4e..82d1339c3 100644\n>> --- a/src/libcamera/base/global_configuration.cpp\n>> +++ b/src/libcamera/base/global_configuration.cpp\n>> @@ -14,7 +14,6 @@\n>> \n>>  #include <libcamera/base/file.h>\n>>  #include <libcamera/base/log.h>\n>> -#include <libcamera/base/utils.h>\n>> \n>>  #include \"libcamera/internal/yaml_parser.h\"\n>> \n>> @@ -150,23 +149,14 @@ GlobalConfiguration::Configuration GlobalConfiguration::get()\n>>  }\n>> \n>>  /**\n>> + * \\fn static std::optional<T> GlobalConfiguration::option(const char *const confPath)\n>>   * \\brief Return value of the configuration option identified by \\a confPath\n>> + * \\tparam T The type of the retrieved configuration value\n>>   * \\param[in] confPath Sequence of the YAML section names (excluding\n>>   * `configuration') leading to the requested option separated by dots\n>> - * \\return A value if an item corresponding to \\a confPath exists in the\n>> - * configuration file, no value otherwise\n>> + * \\return A value of type \\a T if an item corresponding to \\a confPath exists\n>> + * in the configuration file and matches type \\a T, no value otherwise\n>>   */\n>> -std::optional<std::string> GlobalConfiguration::option(\n>> -\tconst std::string &confPath)\n>> -{\n>> -\tYamlObject *c = &const_cast<YamlObject &>(configuration());\n>> -\tfor (auto part : utils::details::StringSplitter(confPath, \".\"))\n>> -\t\tif (c->contains(part))\n>> -\t\t\tc = &const_cast<YamlObject &>((*c)[part]);\n>> -\t\telse\n>> -\t\t\treturn std::optional<std::string>();\n>> -\treturn c->get<std::string>();\n>> -}\n>> \n>>  /**\n>>   * \\brief Return value of the configuration option from a file or environment\n>> @@ -192,7 +182,7 @@ std::optional<std::string> GlobalConfiguration::envOption(\n>>  \tconst char *envValue = utils::secure_getenv(envVariable);\n>>  \tif (envValue)\n>>  \t\treturn std::optional{ std::string{ envValue } };\n>> -\treturn option(confPath);\n>> +\treturn option<std::string>(confPath);\n>>  }\n>> \n>>  /**\n>> diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp\n>> index 07352f6c1..d522e895e 100644\n>> --- a/src/libcamera/base/log.cpp\n>> +++ b/src/libcamera/base/log.cpp\n>> @@ -590,6 +590,8 @@ void Logger::logSetLevel(const char *category, const char *level)\n>>  Logger::Logger()\n>>  {\n>>  \tbool color = !utils::secure_getenv(\"LIBCAMERA_LOG_NO_COLOR\");\n>> +\tif (color)\n>> +\t\tcolor = GlobalConfiguration::option<bool>(\"log.color\").value_or(true);\n>>  \tlogSetStream(&std::cerr, color);\n>> \n>>  \tparseLogFile();\n>> --\n>> 2.44.1\n>> \n>> \n>\n>\n> Regards,\n> Barnabás Pőcze","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 1C7CCC323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  5 Dec 2024 09:36:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EE519660E7;\n\tThu,  5 Dec 2024 10:36:30 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C163D618B3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  5 Dec 2024 10:36:29 +0100 (CET)","from mail-wm1-f71.google.com (mail-wm1-f71.google.com\n\t[209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-180-bCSEAD1IOcS4hC8UMgr4Dg-1; Thu, 05 Dec 2024 04:36:27 -0500","by mail-wm1-f71.google.com with SMTP id\n\t5b1f17b1804b1-43499c1342aso6371715e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 05 Dec 2024 01:36:27 -0800 (PST)","from nuthatch (ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-38621909639sm1484225f8f.72.2024.12.05.01.36.24\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 05 Dec 2024 01:36:24 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"Ujfuy2ZE\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1733391388;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=dbi7asMVhtAPzgVi8ATXmmlSE8ZdbHUs7o2UGHE3VnE=;\n\tb=Ujfuy2ZE9nMEV99psjqtKBdNXnJDcb2tBd7FP9kKOYH5bP6ps4wrNA8iubiuWv5RLchKw9\n\ttZvcpo0Mr7Sfxeg6xwl+5ghqZOEztNqU2esTkBa5u1Td32/cz0jsCaMDcWS+y5KrX6SRdn\n\t/wRdoLAHmnYnubWJ+0NpD6+DgU3NgsY=","X-MC-Unique":"bCSEAD1IOcS4hC8UMgr4Dg-1","X-Mimecast-MFC-AGG-ID":"bCSEAD1IOcS4hC8UMgr4Dg","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1733391386; x=1733996186;\n\th=content-transfer-encoding:mime-version:user-agent:message-id:date\n\t:references:in-reply-to:subject:cc:to:from:x-gm-message-state:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=bVvJlCCWGYhd6EDzO71asyrRnNkjTw41i94N50F8LRE=;\n\tb=ahVmZ3oJJiUZf4ud6qPufu0+rknZWP1n0lpNog0L3uAPQ3DQSr6R+zHwUKO7i0vlP+\n\tC1SZi4QpNnAyunGRrfuhYKajYOA9ZEa6q4SI9PvEevRBuiTgFVerOqbZm8tU17F4hGCE\n\tc8zSMMm2eGWF6CZ35MY6QQ16DTzufaILMXeOBpwPSCveYA61lnj2E0w3m3+GsyR3iE26\n\tR/itJYAy7bW9OMg3QQZHyyiVzL3EhOXylBD8tW4R2S5WqyENqw0ZTOY9XBGmDn0Fkn/j\n\tfPe9GJ3w1ufZnVKOdUKQYdOOUcZe7WtuMRFWu+ZpiZB9TQ5+/QjHiY6uCBw4JYRHOyQK\n\t4Qbg==","X-Gm-Message-State":"AOJu0YyceseRarIYPCDsNp0ONarqKLI+t6JV6JPO/ZcbRtnMmEKCo53R\n\tA3UBdgkFzqqP5xJUUf+cfWOrvrjDh0BBhm9cLurwgqABOatIcOo0S68NtTdWfyG4g9zsOBhBeH+\n\tLI4ePO9ohjacG4zCK/unWgu2ShaNIYUNqAH3eGetr1hcRRtq9p/4dVeZkiKyHUkIV5WlrWow=","X-Gm-Gg":"ASbGncsa5ZMoywnBKlQqzEgrbVYEmn4AZyPLh4fyAr1BMscm0WO4U51fu7n9uNj44Co\n\tvfZDPdmdTWNybIMJhMn2YQsRgMHz00yFJOSretuKrOOD0A8IRT5ytYaxgDtKbzcEtqxCgvoiSut\n\t9WFENdwIKAXl+ZYneyXrOSSS2OOsSB7SHdNL+x5gZd8c2XIdBeKJdW0CTFaSv2ZvVQV2FB0UTYU\n\tckBYNZKdCYifLpRqBCJFlvtD0ZafYp2E8/3BuuQC7uPVT0apP6puwNRYzg3OzUOUQEASoI=","X-Received":["by 2002:a05:600c:1c82:b0:434:a5bc:70fc with SMTP id\n\t5b1f17b1804b1-434d4178987mr60685715e9.8.1733391386012; \n\tThu, 05 Dec 2024 01:36:26 -0800 (PST)","by 2002:a05:600c:1c82:b0:434:a5bc:70fc with SMTP id\n\t5b1f17b1804b1-434d4178987mr60685545e9.8.1733391385609; \n\tThu, 05 Dec 2024 01:36:25 -0800 (PST)"],"X-Google-Smtp-Source":"AGHT+IH8+Flkl5GISPnx3j6dmLcybxxJH7AbIIkXBLUuIlWGeakhtyGBqW5vFqJrbY4N4LdGOinnYg==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Cc":"libcamera-devel@lists.libcamera.org,  Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>, Naushir Patuck <naush@raspberrypi.com>","Subject":"Re: [PATCH v5 07/15] config: Look up log color configuration in\n\tconfiguration file","In-Reply-To":"<71hhLR3qix2SFH8FEkZ2bPpZKVkX0Fwf-t4KfO1NB2TQWUAHK5WS8EwTFkQYdbwt_Xw3QmzbkGlSFukCP3iRb5aZ8r_FHMGJxA-7yn9lku8=@protonmail.com>\n\t( =?utf-8?b?IkJhcm5hYsOhcyBQxZFjemUiJ3M=?= message of \"Wed,\n\t04 Dec 2024  17:45:02 +0000\")","References":"<20241001102810.479285-1-mzamazal@redhat.com>\n\t<20241001102810.479285-8-mzamazal@redhat.com>\n\t<71hhLR3qix2SFH8FEkZ2bPpZKVkX0Fwf-t4KfO1NB2TQWUAHK5WS8EwTFkQYdbwt_Xw3QmzbkGlSFukCP3iRb5aZ8r_FHMGJxA-7yn9lku8=@protonmail.com>","Date":"Thu, 05 Dec 2024 10:36:23 +0100","Message-ID":"<87bjxq1nfs.fsf@redhat.com>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"IrJZslzcNd5r3eE2SKh09pnN7gHYdGeOoFsJ6yQLdOY_1733391386","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]