Patch Detail
Show a patch.
GET /api/patches/23314/?format=api
{ "id": 23314, "url": "https://patchwork.libcamera.org/api/patches/23314/?format=api", "web_url": "https://patchwork.libcamera.org/patch/23314/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20250430121449.39910-7-mzamazal@redhat.com>", "date": "2025-04-30T12:14:39", "name": "[v8,06/15] config: Look up log color configuration in configuration file", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "c3869248d69c79e9124c2f6636df1d2319220dd9", "submitter": { "id": 177, "url": "https://patchwork.libcamera.org/api/people/177/?format=api", "name": "Milan Zamazal", "email": "mzamazal@redhat.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/23314/mbox/", "series": [ { "id": 5156, "url": "https://patchwork.libcamera.org/api/series/5156/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5156", "date": "2025-04-30T12:14:33", "name": "Add global configuration file", "version": 8, "mbox": "https://patchwork.libcamera.org/series/5156/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/23314/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/23314/checks/", "tags": {}, "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 195ADBE08B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 30 Apr 2025 12:15:23 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CD22068B35;\n\tWed, 30 Apr 2025 14:15:22 +0200 (CEST)", "from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AED2F68B27\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 30 Apr 2025 14:15:20 +0200 (CEST)", "from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-561-EQ6CmXZzNI2Ke0UtDOzAug-1;\n\tWed, 30 Apr 2025 08:15:14 -0400", "from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.111])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (2048 bits)\n\tserver-digest SHA256) (No client certificate requested)\n\tby mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id AB4751955DC6; Wed, 30 Apr 2025 12:15:11 +0000 (UTC)", "from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.120])\n\tby mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id E178B180010A; Wed, 30 Apr 2025 12:15:09 +0000 (UTC)" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"fyFDednn\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1746015318;\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=AhiCSXXN1JT2fUfZHTcuwk7q1S2uxOJgEb0jc1qDws8=;\n\tb=fyFDednno5+fp+rUQfPaXuW+RGTbsD10cAMse5Q0eM7CXfrTIP5v0zHeSgihX9bVlebX2K\n\tGRqcfFk83es15MbWzuldTiRZMNvfHQB/yT/3Va/PF//O/XC3NvYnf453XhGhJfEvi9ie2F\n\t+9hR0Gztzl4V5kJqyj80nAA4QLIq5CM=", "X-MC-Unique": "EQ6CmXZzNI2Ke0UtDOzAug-1", "X-Mimecast-MFC-AGG-ID": "EQ6CmXZzNI2Ke0UtDOzAug_1746015311", "From": "Milan Zamazal <mzamazal@redhat.com>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Milan Zamazal <mzamazal@redhat.com>, Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?=\n\t<pobrn@protonmail.com>, Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>", "Subject": "[PATCH v8 06/15] config: Look up log color configuration in\n\tconfiguration file", "Date": "Wed, 30 Apr 2025 14:14:39 +0200", "Message-ID": "<20250430121449.39910-7-mzamazal@redhat.com>", "In-Reply-To": "<20250430121449.39910-1-mzamazal@redhat.com>", "References": "<20250430121449.39910-1-mzamazal@redhat.com>", "MIME-Version": "1.0", "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.111", "X-Mimecast-Spam-Score": "0", "X-Mimecast-MFC-PROC-ID": "yd_1VKHqtk7cQvKeUIH6t-YKj5KQA-OdnIkH1SmZ6sM_1746015311", "X-Mimecast-Originator": "redhat.com", "Content-Transfer-Encoding": "8bit", "content-type": "text/plain; charset=\"US-ASCII\"; x-default=true", "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>" }, "content": "Let's add a configuration file item for logging in color.\n\nThe configuration snippet:\n\n configuration:\n log:\n color: BOOL\n\nIn order to use the global configuration access helper for a boolean\nvalue, we must make a template from it. To make the template visible,\nwe must implement it in the header file, otherwise undefined reference\nerror would be reported when linking.\n\nWe don't implement envOption helper for boolean here, because we would\nhave to deal with a specific value interpretation in this particular\ncase.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n .../libcamera/internal/global_configuration.h | 27 ++++++++++++++++++-\n src/libcamera/base/global_configuration.cpp | 19 ++++---------\n src/libcamera/base/log.cpp | 2 ++\n 3 files changed, 33 insertions(+), 15 deletions(-)", "diff": "diff --git a/include/libcamera/internal/global_configuration.h b/include/libcamera/internal/global_configuration.h\nindex 07062145..a6e21a2d 100644\n--- a/include/libcamera/internal/global_configuration.h\n+++ b/include/libcamera/internal/global_configuration.h\n@@ -10,6 +10,8 @@\n #include <optional>\n #include <string>\n \n+#include <libcamera/base/utils.h>\n+\n #include \"libcamera/internal/yaml_parser.h\"\n \n namespace libcamera {\n@@ -22,7 +24,30 @@ void initialize();\n \n unsigned int version();\n Configuration configuration();\n-std::optional<std::string> option(const std::string &confPath);\n+\n+template<typename T,\n+\t std::enable_if_t<\n+\t\t std::is_same_v<bool, T> ||\n+\t\t std::is_same_v<double, T> ||\n+\t\t std::is_same_v<int8_t, T> ||\n+\t\t std::is_same_v<uint8_t, T> ||\n+\t\t std::is_same_v<int16_t, T> ||\n+\t\t std::is_same_v<uint16_t, T> ||\n+\t\t std::is_same_v<int32_t, T> ||\n+\t\t std::is_same_v<uint32_t, T> ||\n+\t\t std::is_same_v<std::string, T> ||\n+\t\t std::is_same_v<Size, T>> * = nullptr>\n+std::optional<T> option(const std::string &confPath)\n+{\n+\tconst YamlObject *c = &configuration();\n+\tfor (auto part : utils::split(confPath, \".\")) {\n+\t\tc = &(*c)[part];\n+\t\tif (!*c)\n+\t\t\treturn {};\n+\t}\n+\treturn c->get<T>();\n+}\n+\n std::optional<std::string> envOption(const char *const envVariable,\n \t\t\t\t const std::string &confPath);\n \ndiff --git a/src/libcamera/base/global_configuration.cpp b/src/libcamera/base/global_configuration.cpp\nindex 073096b5..3dc31c48 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@@ -144,22 +143,14 @@ void initialize()\n */\n \n /**\n+ * \\fn 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> option(const std::string &confPath)\n-{\n-\tconst YamlObject *c = &configuration();\n-\tfor (auto part : utils::split(confPath, \".\")) {\n-\t\tc = &(*c)[part];\n-\t\tif (!*c)\n-\t\t\treturn {};\n-\t}\n-\treturn c->get<std::string>();\n-}\n \n /**\n * \\brief Return value of the configuration option from a file or environment\n@@ -185,7 +176,7 @@ std::optional<std::string> 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 /**\ndiff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp\nindex c702b825..d8cffbca 100644\n--- a/src/libcamera/base/log.cpp\n+++ b/src/libcamera/base/log.cpp\n@@ -586,6 +586,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", "prefixes": [ "v8", "06/15" ] }