Show a patch.

GET /api/1.1/patches/21360/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 21360,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/21360/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/21360/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/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": "<20240925095850.348259-8-mzamazal@redhat.com>",
    "date": "2024-09-25T09:58:39",
    "name": "[v4,07/15] config: Look up log color configuration in configuration file",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "ae8c293a13d2db828bc1013e1c9fae242f0f4e24",
    "submitter": {
        "id": 177,
        "url": "https://patchwork.libcamera.org/api/1.1/people/177/?format=api",
        "name": "Milan Zamazal",
        "email": "mzamazal@redhat.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/21360/mbox/",
    "series": [
        {
            "id": 4623,
            "url": "https://patchwork.libcamera.org/api/1.1/series/4623/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4623",
            "date": "2024-09-25T09:58:32",
            "name": "Add global configuration file",
            "version": 4,
            "mbox": "https://patchwork.libcamera.org/series/4623/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/21360/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/21360/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 A148BC0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 25 Sep 2024 09:59:30 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 00D3E63521;\n\tWed, 25 Sep 2024 11:59:29 +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 A7B606351A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 25 Sep 2024 11:59:23 +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-99-SRnENPHMPbaOBuVTO5UY9Q-1;\n\tWed, 25 Sep 2024 05:59:18 -0400",
            "from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (unknown\n\t[10.30.177.12])\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 EDC101955E8C; Wed, 25 Sep 2024 09:59:17 +0000 (UTC)",
            "from nuthatch.redhat.com (unknown [10.45.225.29])\n\tby mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id 7FBA919560AD; Wed, 25 Sep 2024 09:59:16 +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=\"bZjDf4ih\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1727258362;\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=/7xfJKFby5/UpefHEae6aKH2gEzWLkQMWMh1Zcw39eY=;\n\tb=bZjDf4ihIuKHzoHrzBrBgKmYFTx1RwA+sa25D/VETI/Bg6kiNiGmfXdkWv5dC6y0ciGWVi\n\tHhBYIUNtnQsRJim9EySmdtIE/PibOBaZR/syrIaqtnxQwspGzh3N2lgWubNjipT85rGgfc\n\tpcnm0DogqnTtAYu86A/eZTtfqbt3FgM=",
        "X-MC-Unique": "SRnENPHMPbaOBuVTO5UY9Q-1",
        "From": "Milan Zamazal <mzamazal@redhat.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Milan Zamazal <mzamazal@redhat.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tNaushir Patuck <naush@raspberrypi.com>",
        "Subject": "[PATCH v4 07/15] config: Look up log color configuration in\n\tconfiguration file",
        "Date": "Wed, 25 Sep 2024 11:58:39 +0200",
        "Message-ID": "<20240925095850.348259-8-mzamazal@redhat.com>",
        "In-Reply-To": "<20240925095850.348259-1-mzamazal@redhat.com>",
        "References": "<20240925095850.348259-1-mzamazal@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 3.0 on 10.30.177.12",
        "X-Mimecast-Spam-Score": "0",
        "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": "The 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   | 20 ++++----------\n src/libcamera/base/log.cpp                    |  2 ++\n 3 files changed, 33 insertions(+), 16 deletions(-)",
    "diff": "diff --git a/include/libcamera/internal/global_configuration.h b/include/libcamera/internal/global_configuration.h\nindex 7c39c969a..42c60417e 100644\n--- a/include/libcamera/internal/global_configuration.h\n+++ b/include/libcamera/internal/global_configuration.h\n@@ -11,6 +11,8 @@\n #include <optional>\n #include <vector>\n \n+#include <libcamera/base/utils.h>\n+\n #include \"libcamera/internal/yaml_parser.h\"\n \n namespace libcamera {\n@@ -22,7 +24,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+\t\tfor (auto part : utils::details::StringSplitter(confPath, \".\"))\n+\t\t\tif (c->contains(part))\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 \ndiff --git a/src/libcamera/base/global_configuration.cpp b/src/libcamera/base/global_configuration.cpp\nindex b64bf28e2..f18ca28bc 100644\n--- a/src/libcamera/base/global_configuration.cpp\n+++ b/src/libcamera/base/global_configuration.cpp\n@@ -15,7 +15,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@@ -146,23 +145,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@@ -188,7 +178,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 /**\ndiff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp\nindex 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",
    "prefixes": [
        "v4",
        "07/15"
    ]
}