Show a patch.

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

{
    "id": 819,
    "url": "https://patchwork.libcamera.org/api/patches/819/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/819/",
    "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": "<20190327002107.24487-4-niklas.soderlund@ragnatech.se>",
    "date": "2019-03-27T00:21:07",
    "name": "[libcamera-devel,v2,3/3] cam: options: Add support for repeatable options",
    "commit_ref": "3f906920e4d448441c442be1ce6c7376e33d4237",
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "72a01aa599791c17c5018863e1107c5d1d68cfee",
    "submitter": {
        "id": 5,
        "url": "https://patchwork.libcamera.org/api/people/5/?format=api",
        "name": "Niklas Söderlund",
        "email": "niklas.soderlund@ragnatech.se"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/819/mbox/",
    "series": [
        {
            "id": 221,
            "url": "https://patchwork.libcamera.org/api/series/221/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=221",
            "date": "2019-03-27T00:21:05",
            "name": "cam: options: Add support for repeatable options",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/221/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/819/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/819/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<niklas.soderlund@ragnatech.se>",
        "Received": [
            "from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net\n\t[195.74.38.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 493E6600F9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 27 Mar 2019 01:21:23 +0100 (CET)",
            "from bismarck.berto.se (unknown [89.233.230.99])\n\tby bin-vsp-out-03.atm.binero.net (Halon) with ESMTPA\n\tid 389555c3-5026-11e9-8144-0050569116f7;\n\tWed, 27 Mar 2019 01:21:10 +0100 (CET)"
        ],
        "X-Halon-ID": "389555c3-5026-11e9-8144-0050569116f7",
        "Authorized-sender": "niklas@soderlund.pp.se",
        "From": "=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Wed, 27 Mar 2019 01:21:07 +0100",
        "Message-Id": "<20190327002107.24487-4-niklas.soderlund@ragnatech.se>",
        "X-Mailer": "git-send-email 2.21.0",
        "In-Reply-To": "<20190327002107.24487-1-niklas.soderlund@ragnatech.se>",
        "References": "<20190327002107.24487-1-niklas.soderlund@ragnatech.se>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v2 3/3] cam: options: Add support for\n\trepeatable options",
        "X-BeenThere": "libcamera-devel@lists.libcamera.org",
        "X-Mailman-Version": "2.1.23",
        "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>",
        "X-List-Received-Date": "Wed, 27 Mar 2019 00:21:24 -0000"
    },
    "content": "Add a flag to indicate if an option can be repeatable. If an option is\nrepeatable it must be accessed thru the array interface, even if it's\nonly specified once by the user.\n\nAlso update the usage generator to indicate which options are\nrepeatable.\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/cam/options.cpp | 21 +++++++++++++++------\n src/cam/options.h   |  5 +++--\n 2 files changed, 18 insertions(+), 8 deletions(-)",
    "diff": "diff --git a/src/cam/options.cpp b/src/cam/options.cpp\nindex 556e7623c54b0658..92b6b8ef2d7d9671 100644\n--- a/src/cam/options.cpp\n+++ b/src/cam/options.cpp\n@@ -97,7 +97,11 @@ bool OptionsBase<T>::parseValue(const T &opt, const Option &option,\n \t\tbreak;\n \t}\n \n-\tvalues_[opt] = value;\n+\tif (option.isArray)\n+\t\tvalues_[opt].addValue(value);\n+\telse\n+\t\tvalues_[opt] = value;\n+\n \treturn true;\n }\n \n@@ -129,7 +133,7 @@ bool KeyValueParser::addOption(const char *name, OptionType type,\n \t\treturn false;\n \n \toptionsMap_[name] = Option({ 0, type, name, argument, nullptr,\n-\t\t\t\t     help, nullptr });\n+\t\t\t\t     help, nullptr, false });\n \treturn true;\n }\n \n@@ -339,7 +343,7 @@ std::vector<OptionValue> OptionValue::toArray() const\n \n bool OptionsParser::addOption(int opt, OptionType type, const char *help,\n \t\t\t      const char *name, OptionArgument argument,\n-\t\t\t      const char *argumentName)\n+\t\t\t      const char *argumentName, bool array)\n {\n \t/*\n \t * Options must have at least a short or long name, and a text message.\n@@ -357,16 +361,16 @@ bool OptionsParser::addOption(int opt, OptionType type, const char *help,\n \t\treturn false;\n \n \toptions_.push_back(Option({ opt, type, name, argument, argumentName,\n-\t\t\t\t    help, nullptr }));\n+\t\t\t\t    help, nullptr, array }));\n \toptionsMap_[opt] = &options_.back();\n \treturn true;\n }\n \n bool OptionsParser::addOption(int opt, KeyValueParser *parser, const char *help,\n-\t\t\t      const char *name)\n+\t\t\t      const char *name, bool array)\n {\n \tif (!addOption(opt, OptionKeyValue, help, name, ArgumentRequired,\n-\t\t       \"key=value[,key=value,...]\"))\n+\t\t       \"key=value[,key=value,...]\", array))\n \t\treturn false;\n \n \toptions_.back().keyValueParser = parser;\n@@ -464,6 +468,8 @@ void OptionsParser::usage()\n \t\t\tlength += 1 + strlen(option.argumentName);\n \t\tif (option.argument == ArgumentOptional)\n \t\t\tlength += 2;\n+\t\tif (option.isArray)\n+\t\t\tlength += 4;\n \n \t\tif (length > indent)\n \t\t\tindent = length;\n@@ -497,6 +503,9 @@ void OptionsParser::usage()\n \t\t\t\targument += \"]\";\n \t\t}\n \n+\t\tif (option.isArray)\n+\t\t\targument += \" ...\";\n+\n \t\tstd::cerr << std::setw(indent) << std::left << argument;\n \n \t\tfor (const char *help = option.help, *end = help; end; ) {\ndiff --git a/src/cam/options.h b/src/cam/options.h\nindex e0ff50af2fa74986..6e3ef62e869974b9 100644\n--- a/src/cam/options.h\n+++ b/src/cam/options.h\n@@ -36,6 +36,7 @@ struct Option {\n \tconst char *argumentName;\n \tconst char *help;\n \tKeyValueParser *keyValueParser;\n+\tbool isArray;\n \n \tbool hasShortOption() const { return isalnum(opt); }\n \tbool hasLongOption() const { return name != nullptr; }\n@@ -126,9 +127,9 @@ public:\n \tbool addOption(int opt, OptionType type, const char *help,\n \t\t       const char *name = nullptr,\n \t\t       OptionArgument argument = ArgumentNone,\n-\t\t       const char *argumentName = nullptr);\n+\t\t       const char *argumentName = nullptr, bool array = false);\n \tbool addOption(int opt, KeyValueParser *parser, const char *help,\n-\t\t       const char *name = nullptr);\n+\t\t       const char *name = nullptr, bool array = false);\n \n \tOptions parse(int argc, char *argv[]);\n \tvoid usage();\n",
    "prefixes": [
        "libcamera-devel",
        "v2",
        "3/3"
    ]
}