Show a patch.

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

{
    "id": 794,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/794/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/794/",
    "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": "<20190325234736.12533-4-niklas.soderlund@ragnatech.se>",
    "date": "2019-03-25T23:47:36",
    "name": "[libcamera-devel,3/3] cam: options: Add support for repeatable options",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "7e95342ca0a9ca7d1d8125c151b8b35d0092671e",
    "submitter": {
        "id": 5,
        "url": "https://patchwork.libcamera.org/api/1.1/people/5/?format=api",
        "name": "Niklas Söderlund",
        "email": "niklas.soderlund@ragnatech.se"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/794/mbox/",
    "series": [
        {
            "id": 218,
            "url": "https://patchwork.libcamera.org/api/1.1/series/218/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=218",
            "date": "2019-03-25T23:47:35",
            "name": "cam: options: Add support for repeatable options",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/218/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/794/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/794/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<niklas.soderlund@ragnatech.se>",
        "Received": [
            "from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net\n\t[195.74.38.229])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E4CF061111\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 26 Mar 2019 00:47:46 +0100 (CET)",
            "from bismarck.berto.se (unknown [89.233.230.99])\n\tby bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA\n\tid 62f44f80-4f58-11e9-846a-005056917a89;\n\tTue, 26 Mar 2019 00:47:45 +0100 (CET)"
        ],
        "X-Halon-ID": "62f44f80-4f58-11e9-846a-005056917a89",
        "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": "Tue, 26 Mar 2019 00:47:36 +0100",
        "Message-Id": "<20190325234736.12533-4-niklas.soderlund@ragnatech.se>",
        "X-Mailer": "git-send-email 2.21.0",
        "In-Reply-To": "<20190325234736.12533-1-niklas.soderlund@ragnatech.se>",
        "References": "<20190325234736.12533-1-niklas.soderlund@ragnatech.se>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH 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": "Mon, 25 Mar 2019 23:47:47 -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 that tan option is\nrepeatable.\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\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 0dec154815d3cad5..0fdde9d84ba0de0e 100644\n--- a/src/cam/options.cpp\n+++ b/src/cam/options.cpp\n@@ -96,7 +96,11 @@ bool OptionsBase<T>::parseValue(const T &opt, const Option &option,\n \t\tbreak;\n \t}\n \n-\tvalues_[opt] = value;\n+\tif (option.array)\n+\t\tvalues_[opt].add(value);\n+\telse\n+\t\tvalues_[opt] = value;\n+\n \treturn true;\n }\n \n@@ -128,7 +132,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@@ -336,7 +340,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@@ -354,16 +358,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@@ -461,6 +465,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.array)\n+\t\t\tlength += 4;\n \n \t\tif (length > indent)\n \t\t\tindent = length;\n@@ -494,6 +500,9 @@ void OptionsParser::usage()\n \t\t\t\targument += \"]\";\n \t\t}\n \n+\t\tif (option.array)\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 6a887416c0070c41..1dac15ea90f2ffd2 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 array;\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",
        "3/3"
    ]
}