get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2230499,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2230499/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260429192611.1581223-4-jsnow@redhat.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.1/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20260429192611.1581223-4-jsnow@redhat.com>",
    "date": "2026-04-29T19:26:01",
    "name": "[v2,03/13] qapi/docs: make remaining subsection members \"private\"",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "dbcb1ef545a60b6e01e220860ada1568d9f58390",
    "submitter": {
        "id": 64343,
        "url": "http://patchwork.ozlabs.org/api/1.1/people/64343/?format=api",
        "name": "John Snow",
        "email": "jsnow@redhat.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260429192611.1581223-4-jsnow@redhat.com/mbox/",
    "series": [
        {
            "id": 502140,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/502140/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=502140",
            "date": "2026-04-29T19:25:59",
            "name": "qapi: add formal \"intro\" section",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/502140/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2230499/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2230499/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=foWJcgRX;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g5S3g0yTsz1yHZ\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 05:26:55 +1000 (AEST)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wIAYS-0006RR-UM; Wed, 29 Apr 2026 15:26:40 -0400",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <jsnow@redhat.com>) id 1wIAYQ-0006R3-HI\n for qemu-devel@nongnu.org; Wed, 29 Apr 2026 15:26:38 -0400",
            "from us-smtp-delivery-124.mimecast.com ([170.10.133.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <jsnow@redhat.com>) id 1wIAYO-0007qs-BY\n for qemu-devel@nongnu.org; Wed, 29 Apr 2026 15:26:38 -0400",
            "from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-338-NVrDnU5xPNK-mbGhr7cGVQ-1; Wed,\n 29 Apr 2026 15:26:31 -0400",
            "from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 512D91800350; Wed, 29 Apr 2026 19:26:30 +0000 (UTC)",
            "from jsnow-thinkpadp16vgen1.westford.csb (unknown [10.22.80.204])\n by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 63C511800446; Wed, 29 Apr 2026 19:26:26 +0000 (UTC)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777490795;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=r3bFlvRyNHuo5LAmox46R5ptUST3XkFKOLqwa+xbG2U=;\n b=foWJcgRXKGpr9m9CMd5cutlE6O7Ku2j/cLRJr5zGGsCdpqxACP1S+TU8FO8JWApWssnSid\n fi+dgYNu8Y3RRdAtVL9e/rWUap3ItRzcYNyqjF5nDrG/7VAzEsBOv3i4zE8CPrZo3Zhz5N\n o7pbLGCoCHUl/toFOBDgoARNJFOBVuQ=",
        "X-MC-Unique": "NVrDnU5xPNK-mbGhr7cGVQ-1",
        "X-Mimecast-MFC-AGG-ID": "NVrDnU5xPNK-mbGhr7cGVQ_1777490790",
        "From": "John Snow <jsnow@redhat.com>",
        "To": "qemu-devel@nongnu.org",
        "Cc": "Michael Roth <michael.roth@amd.com>, Eric Blake <eblake@redhat.com>,\n\t=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n Richard Henderson <richard.henderson@linaro.org>,\n John Snow <jsnow@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>,\n Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,\n \"Michael S. Tsirkin\" <mst@redhat.com>,\n Peter Maydell <peter.maydell@linaro.org>,\n Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>,\n Igor Mammedov <imammedo@redhat.com>, Gerd Hoffmann <kraxel@redhat.com>,\n Ani Sinha <anisinha@redhat.com>,\n =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>,\n Markus Armbruster <armbru@redhat.com>",
        "Subject": "[PATCH v2 03/13] qapi/docs: make remaining subsection members\n \"private\"",
        "Date": "Wed, 29 Apr 2026 15:26:01 -0400",
        "Message-ID": "<20260429192611.1581223-4-jsnow@redhat.com>",
        "In-Reply-To": "<20260429192611.1581223-1-jsnow@redhat.com>",
        "References": "<20260429192611.1581223-1-jsnow@redhat.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.111",
        "Received-SPF": "pass client-ip=170.10.133.124; envelope-from=jsnow@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com",
        "X-Spam_score_int": "-20",
        "X-Spam_score": "-2.1",
        "X-Spam_bar": "--",
        "X-Spam_report": "(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no",
        "X-Spam_action": "no action",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "qemu development <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "These fields are used to provide error checking and internal logistics\nand should not be used by a user of the library to directly access\ndocumentation sections, so make them private.\n\nThe \"since\" field alone is left public, as the qapidoc generator does\nuse this field to pull that section out of the regular flow of the\ndocument.\n\nSigned-off-by: John Snow <jsnow@redhat.com>\n---\n scripts/qapi/parser.py | 54 +++++++++++++++++++++++-------------------\n 1 file changed, 29 insertions(+), 25 deletions(-)",
    "diff": "diff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py\nindex b33edbba74f..da4756a7424 100644\n--- a/scripts/qapi/parser.py\n+++ b/scripts/qapi/parser.py\n@@ -555,7 +555,7 @@ def get_doc(self) -> 'QAPIDoc':\n                     break\n                 # Non-blank line, first of a section\n                 if line == 'Features:':\n-                    if doc.features:\n+                    if doc.has_features:\n                         raise QAPIParseError(\n                             self, \"duplicated 'Features:' line\")\n                     self.accept(False)\n@@ -570,7 +570,7 @@ def get_doc(self) -> 'QAPIDoc':\n                         if text:\n                             doc.append_line(text)\n                         line = self.get_doc_indented(doc)\n-                    if not doc.features:\n+                    if not doc.has_features:\n                         raise QAPIParseError(\n                             self, 'feature descriptions expected')\n                     no_more_args = True\n@@ -733,14 +733,18 @@ def __init__(self, info: QAPISourceInfo, symbol: Optional[str] = None):\n             QAPIDoc.Section(info, QAPIDoc.Kind.PLAIN)\n         ]\n         # dicts mapping parameter/feature names to their description\n-        self.args: Dict[str, QAPIDoc.ArgSection] = {}\n-        self.features: Dict[str, QAPIDoc.ArgSection] = {}\n+        self._args: Dict[str, QAPIDoc.ArgSection] = {}\n+        self._features: Dict[str, QAPIDoc.ArgSection] = {}\n         # a command's \"Returns\" and \"Errors\" section\n-        self.returns: Optional[QAPIDoc.Section] = None\n-        self.errors: Optional[QAPIDoc.Section] = None\n+        self._returns: Optional[QAPIDoc.Section] = None\n+        self._errors: Optional[QAPIDoc.Section] = None\n         # \"Since\" section\n         self.since: Optional[QAPIDoc.Section] = None\n \n+    @property\n+    def has_features(self) -> bool:\n+        return bool(self._features)\n+\n     def end(self) -> None:\n         for section in self.all_sections:\n             section.text = section.text.strip('\\n')\n@@ -771,15 +775,15 @@ def new_tagged_section(\n     ) -> None:\n         section = self.Section(info, kind)\n         if kind == QAPIDoc.Kind.RETURNS:\n-            if self.returns:\n+            if self._returns:\n                 raise QAPISemError(\n                     info, \"duplicated '%s' section\" % kind)\n-            self.returns = section\n+            self._returns = section\n         elif kind == QAPIDoc.Kind.ERRORS:\n-            if self.errors:\n+            if self._errors:\n                 raise QAPISemError(\n                     info, \"duplicated '%s' section\" % kind)\n-            self.errors = section\n+            self._errors = section\n         elif kind == QAPIDoc.Kind.SINCE:\n             if self.since:\n                 raise QAPISemError(\n@@ -803,16 +807,16 @@ def _new_description(\n         desc[name] = section\n \n     def new_argument(self, info: QAPISourceInfo, name: str) -> None:\n-        self._new_description(info, name, QAPIDoc.Kind.MEMBER, self.args)\n+        self._new_description(info, name, QAPIDoc.Kind.MEMBER, self._args)\n \n     def new_feature(self, info: QAPISourceInfo, name: str) -> None:\n-        self._new_description(info, name, QAPIDoc.Kind.FEATURE, self.features)\n+        self._new_description(info, name, QAPIDoc.Kind.FEATURE, self._features)\n \n     def append_line(self, line: str) -> None:\n         self.all_sections[-1].append_line(line)\n \n     def connect_member(self, member: 'QAPISchemaMember') -> None:\n-        if member.name not in self.args:\n+        if member.name not in self._args:\n             assert member.info\n             if self.symbol not in member.info.pragma.documentation_exceptions:\n                 raise QAPISemError(member.info,\n@@ -823,7 +827,7 @@ def connect_member(self, member: 'QAPISchemaMember') -> None:\n \n             section = QAPIDoc.ArgSection(\n                 self.info, QAPIDoc.Kind.MEMBER, member.name)\n-            self.args[member.name] = section\n+            self._args[member.name] = section\n \n             # Determine where to insert stub doc - it should go at the\n             # end of the members section(s), if any. Note that index 0\n@@ -835,14 +839,14 @@ def connect_member(self, member: 'QAPISchemaMember') -> None:\n                     index += 1\n             self.all_sections.insert(index, section)\n \n-        self.args[member.name].connect(member)\n+        self._args[member.name].connect(member)\n \n     def connect_feature(self, feature: 'QAPISchemaFeature') -> None:\n-        if feature.name not in self.features:\n+        if feature.name not in self._features:\n             raise QAPISemError(feature.info,\n                                \"feature '%s' lacks documentation\"\n                                % feature.name)\n-        self.features[feature.name].connect(feature)\n+        self._features[feature.name].connect(feature)\n \n     def ensure_returns(self, info: QAPISourceInfo) -> None:\n \n@@ -883,18 +887,18 @@ def _insert_near_kind(\n \n     def check_expr(self, expr: QAPIExpression) -> None:\n         if 'command' in expr:\n-            if self.returns and 'returns' not in expr:\n+            if self._returns and 'returns' not in expr:\n                 raise QAPISemError(\n-                    self.returns.info,\n+                    self._returns.info,\n                     \"'Returns' section, but command doesn't return anything\")\n         else:\n-            if self.returns:\n+            if self._returns:\n                 raise QAPISemError(\n-                    self.returns.info,\n+                    self._returns.info,\n                     \"'Returns' section is only valid for commands\")\n-            if self.errors:\n+            if self._errors:\n                 raise QAPISemError(\n-                    self.errors.info,\n+                    self._errors.info,\n                     \"'Errors' section is only valid for commands\")\n \n     def check(self) -> None:\n@@ -914,5 +918,5 @@ def check_args_section(\n                         \"do\" if len(bogus) > 1 else \"does\"\n                     ))\n \n-        check_args_section(self.args, 'member')\n-        check_args_section(self.features, 'feature')\n+        check_args_section(self._args, 'member')\n+        check_args_section(self._features, 'feature')\n",
    "prefixes": [
        "v2",
        "03/13"
    ]
}