Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2227551/?format=api
{ "id": 2227551, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2227551/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260423220022.2180059-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": "<20260423220022.2180059-4-jsnow@redhat.com>", "date": "2026-04-23T22:00:12", "name": "[03/12] 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/20260423220022.2180059-4-jsnow@redhat.com/mbox/", "series": [ { "id": 501255, "url": "http://patchwork.ozlabs.org/api/1.1/series/501255/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=501255", "date": "2026-04-23T22:00:11", "name": "qapi: add formal \"intro\" section", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/501255/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2227551/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2227551/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=OrQcYOEp;\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 4g1qp21Znvz1yDD\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 24 Apr 2026 08:02:34 +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 1wG26I-0005hD-2l; Thu, 23 Apr 2026 18:00:46 -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 1wG26G-0005gb-Fg\n for qemu-devel@nongnu.org; Thu, 23 Apr 2026 18:00:44 -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 1wG26E-0005n7-Oh\n for qemu-devel@nongnu.org; Thu, 23 Apr 2026 18:00:44 -0400", "from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-256-pIl8z927PF20ALKDevGW7Q-1; Thu,\n 23 Apr 2026 18:00:38 -0400", "from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4])\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-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id B2D4119560B4; Thu, 23 Apr 2026 22:00:36 +0000 (UTC)", "from jsnow-thinkpadp16vgen1.westford.csb (unknown [10.22.64.143])\n by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id D55693007572; Thu, 23 Apr 2026 22:00:33 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1776981641;\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=4U5mLgPq13tmE2cbCVg+v4MMqU//WVhAAqdpEanptww=;\n b=OrQcYOEpSLTknxOeFMmfKOsSLpsn1WPTVSa72oDKDawI24OtI0fb8MN3Kf6mRc+7qpi955\n 1Zfd5zEVDhksWHBFve67B742wVJQYyiWOm/3U4BrPRp/ihn4e5zQQ44T6NozbGJU/DYJzV\n REEtpQmrDsDle0QYdeGwM1U1hGgxRQ8=", "X-MC-Unique": "pIl8z927PF20ALKDevGW7Q-1", "X-Mimecast-MFC-AGG-ID": "pIl8z927PF20ALKDevGW7Q_1776981636", "From": "John Snow <jsnow@redhat.com>", "To": "qemu-devel@nongnu.org", "Cc": "Igor Mammedov <imammedo@redhat.com>,\n Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,\n \"Michael S. Tsirkin\" <mst@redhat.com>, Michael Roth <michael.roth@amd.com>,\n Markus Armbruster <armbru@redhat.com>, Ani Sinha <anisinha@redhat.com>,\n Gerd Hoffmann <kraxel@redhat.com>, Eric Blake <eblake@redhat.com>,\n Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>, =?utf-8?q?Philippe_Ma?=\n\t=?utf-8?q?thieu-Daud=C3=A9?= <philmd@linaro.org>, =?utf-8?q?Marc-Andr=C3=A9?=\n\t=?utf-8?q?_Lureau?= <marcandre.lureau@redhat.com>,\n Richard Henderson <richard.henderson@linaro.org>,\n Paolo Bonzini <pbonzini@redhat.com>,\n Peter Maydell <peter.maydell@linaro.org>, John Snow <jsnow@redhat.com>", "Subject": "[PATCH 03/12] qapi/docs: make remaining subsection members \"private\"", "Date": "Thu, 23 Apr 2026 18:00:12 -0400", "Message-ID": "<20260423220022.2180059-4-jsnow@redhat.com>", "In-Reply-To": "<20260423220022.2180059-1-jsnow@redhat.com>", "References": "<20260423220022.2180059-1-jsnow@redhat.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.4", "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": "12", "X-Spam_score": "1.2", "X-Spam_bar": "+", "X-Spam_report": "(1.2 / 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 RCVD_IN_SBL_CSS=3.335, SPF_HELO_PASS=-0.001,\n SPF_PASS=-0.001 autolearn=no 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": [ "03/12" ] }