Show a cover letter.

GET /api/covers/812311/?format=api
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 812311,
    "url": "http://patchwork.ozlabs.org/api/covers/812311/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/cover/20170911110623.24981-1-marcandre.lureau@redhat.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/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": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20170911110623.24981-1-marcandre.lureau@redhat.com>",
    "list_archive_url": null,
    "date": "2017-09-11T11:05:33",
    "name": "[v3,00/50] Hi,",
    "submitter": {
        "id": 66774,
        "url": "http://patchwork.ozlabs.org/api/people/66774/?format=api",
        "name": "Marc-André Lureau",
        "email": "marcandre.lureau@redhat.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/cover/20170911110623.24981-1-marcandre.lureau@redhat.com/mbox/",
    "series": [
        {
            "id": 2480,
            "url": "http://patchwork.ozlabs.org/api/series/2480/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=2480",
            "date": "2017-09-11T11:05:33",
            "name": "Hi,",
            "version": 3,
            "mbox": "http://patchwork.ozlabs.org/series/2480/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/covers/812311/comments/",
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)",
            "ext-mx05.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com",
            "ext-mx05.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=marcandre.lureau@redhat.com"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xrQB20Vv1z9s7G\n\tfor <incoming@patchwork.ozlabs.org>;\n\tMon, 11 Sep 2017 21:07:22 +1000 (AEST)",
            "from localhost ([::1]:56735 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1drMYi-0004lH-44\n\tfor incoming@patchwork.ozlabs.org; Mon, 11 Sep 2017 07:07:20 -0400",
            "from eggs.gnu.org ([2001:4830:134:3::10]:42497)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <marcandre.lureau@redhat.com>) id 1drMXv-0004hv-DE\n\tfor qemu-devel@nongnu.org; Mon, 11 Sep 2017 07:06:35 -0400",
            "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <marcandre.lureau@redhat.com>) id 1drMXt-0005vI-0u\n\tfor qemu-devel@nongnu.org; Mon, 11 Sep 2017 07:06:31 -0400",
            "from mx1.redhat.com ([209.132.183.28]:38794)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <marcandre.lureau@redhat.com>)\n\tid 1drMXs-0005ug-Ot\n\tfor qemu-devel@nongnu.org; Mon, 11 Sep 2017 07:06:28 -0400",
            "from smtp.corp.redhat.com\n\t(int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 31351362ADD\n\tfor <qemu-devel@nongnu.org>; Mon, 11 Sep 2017 11:06:27 +0000 (UTC)",
            "from localhost (ovpn-112-47.ams2.redhat.com [10.36.112.47])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 6A60C5C684;\n\tMon, 11 Sep 2017 11:06:24 +0000 (UTC)"
        ],
        "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com 31351362ADD",
        "From": "=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>",
        "To": "qemu-devel@nongnu.org",
        "Date": "Mon, 11 Sep 2017 13:05:33 +0200",
        "Message-Id": "<20170911110623.24981-1-marcandre.lureau@redhat.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.13",
        "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.29]);\n\tMon, 11 Sep 2017 11:06:27 +0000 (UTC)",
        "Content-Transfer-Encoding": "quoted-printable",
        "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]",
        "X-Received-From": "209.132.183.28",
        "Subject": "[Qemu-devel] [PATCH v3 00/50] Hi,",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.21",
        "Precedence": "list",
        "List-Id": "<qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<http://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\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Cc": "=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n\tarmbru@redhat.com",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"
    },
    "content": "In order to clean-up some hacks in qapi (having to unregister commands\nat runtime), I proposed a \"[PATCH v5 02/20] qapi.py: add a simple #ifdef condition\"\n\n(see http://lists.gnu.org/archive/html/qemu-devel/2016-08/msg03106.html).\n\nHowever, we decided to drop that patch from the series and solve the\nproblem later. The main issues were:\n- the syntax was awkward to the JSON schema and documentation\n- the evaluation of the condition was done in the qapi scripts, with\n  very limited capability\n- each target/config would need different generated files.\n\nInstead, it could defer the #if evaluation to the C-preprocessor.\n\nWith this series, top-level qapi JSON entity can take 'if' keys:\n\n{ 'struct': 'TestIfStruct', 'data': { 'foo': 'int' },\n  'if': 'defined(TEST_IF_STRUCT)' }\n\nMembers can be exploded as dictionnary with 'type'/'if' keys:\n\n{ 'struct': 'TestIfStruct', 'data':\n  { 'foo': 'int',\n    'bar': { 'type': 'int', 'if': 'defined(TEST_IF_STRUCT_BAR)'} } }\n\nEnum values can be exploded as dictionnary with 'type'/'if' keys:\n\n{ 'enum': 'TestIfEnum', 'data':\n  [ 'foo',\n    { 'name' : 'bar', 'if': 'defined(TEST_IF_ENUM_BAR)' } ] }\n\nA good benefit from having conditional schema is that introspection\nwill reflect more accurately the capability of the server. Another\nbenefit is that it may help to remove some dead code when disabling a\nfunctionality.\n\nStarting from patch \"qapi: add conditions to VNC type/commands/events\non the schema\", the series demonstrate adding conditions, in order to\nremove qmp_unregister_commands_hack(). The main difference with v2, is\nthe addition of a per-target schema in \"build-sys: add a target\nschema\". This removes the NEED_CPU_H hack, and keep most of the qapi\nfiles in common build.\n\nThere are a lot more things we could make conditional in the QAPI\nschema, like pci/kvm/xen/numa/vde/slirp/posix/win32/vsock/lzo etc etc,\nhowever I am still evaluating the implication of such changes both\nexternally and internally, for those interested, I can share my wip\nbranch.\n\nComments welcome,\n\nv3:\n- rebased (qlit is now merged upstream)\n- solve the per-target #ifdef problem by using a target.json\n  and new qapi generated target files\n- update some commit messages based on Markus review\n- more schema error reporting\n- move the ifcond argument closer to info/doc\n- use mcgen() in gen_if()/gen_endif()\n- simplify \"modify to_qlit() to take an optional suffix\"\n- fix generated qlit indentation\n- fix temporary build break by merging #if types & visitors patch\n- fix some redundant condtionals generation\n- change enum visitor to take QAPISchemaMember\n- reject unknown dictionnary keys in { .., 'if': ..}\n- split qapi test visitor print() with trailing ',' trick\n\nMarc-André Lureau (50):\n  qlit: add qobject_from_qlit()\n  qapi: generate a literal qobject for introspection\n  qapi2texi: minor python code simplification\n  qapi: add 'if' to top-level expressions\n  qapi: add tests for invalid 'if'\n  qapi: pass 'if' condition into QAPISchemaEntity objects\n  qapi: add 'ifcond' to visitor methods\n  qapi: mcgen() shouldn't indent # lines\n  qapi: add #if/#endif helpers\n  qapi-introspect: modify to_qlit() to append ',' on level > 0\n  qapi-introspect: modify to_qlit() to generate #if code\n  qapi-introspect: add preprocessor conditions to generated QLit\n  qapi-commands: add #if conditions to commands\n  qapi-event: add #if conditions to events\n  qapi-types: refactor variants handling\n  qapi-types: add #if conditions to types & visitors\n  qapi: do not define enumeration value explicitely\n  qapi: change enum visitor to take QAPISchemaMember\n  qapi: add 'if' to enum members\n  qapi-event: add 'if' condition to generated enum\n  qapi: add #if conditions on generated enum members\n  tests: add some enum members tests\n  qapi: add 'if' to struct members and implicit objects members\n  qapi: add some struct member tests\n  qapi: add #if conditions to generated struct members\n  qapi: add 'if' on union variants\n  qapi: add #if conditions to generated variants\n  qapi: add 'if' to alternate variant\n  qapi: add tests for invalid alternate\n  qapi: add #if conditions to generated alternate variants\n  docs: document schema configuration\n  qapi2texi: add 'If:' section to generated documentation\n  qapi2texi: add 'If:' condition to enum values\n  qapi2texi: add 'If:' condition to struct members\n  qapi2texi: add condition to variants\n  qapi: add conditions to VNC type/commands/events on the schema\n  qapi: add conditions to SPICE type/commands/events on the schema\n  qapi: add conditions to REPLICATION type/commands on the schema\n  qapi-commands: don't initialize command list in qmp_init_marshall()\n  qapi: add -i/--include filename.h\n  qapi: add a 'unit' pragma\n  qapi: add a -u/--unit option to specify which unit to visit\n  build-sys: move qmp-introspect per target\n  build-sys: add a target schema\n  qapi: make rtc-reset-reinjection depend on TARGET_I386\n  qapi: make s390 commands depend on TARGET_S390X\n  target.json: add a note about query-cpu* not being s390x-specific\n  qapi: make query-gic-capabilities depend on TARGET_ARM\n  qapi: make query-cpu-model-expansion depend on s390 or x86\n  qapi: make query-cpu-definitions depend on specific targets\n\n qapi-schema.json                                   | 212 +-----------\n qapi/block-core.json                               |  15 +-\n qapi/char.json                                     |  10 +-\n qapi/crypto.json                                   |   3 +-\n qapi/migration.json                                |  12 +-\n qapi/target.json                                   | 228 +++++++++++++\n qapi/ui.json                                       |  75 +++--\n scripts/qapi.py                                    | 372 +++++++++++++++------\n scripts/qapi-commands.py                           |  13 +-\n scripts/qapi-event.py                              |  12 +-\n scripts/qapi-introspect.py                         | 121 ++++---\n scripts/qapi-types.py                              |  71 ++--\n scripts/qapi-visit.py                              |  24 +-\n scripts/qapi2texi.py                               |  52 +--\n include/qapi/qmp/qlit.h                            |   2 +\n include/sysemu/arch_init.h                         |  11 -\n ui/vnc.h                                           |   2 +\n crypto/cipher-builtin.c                            |   9 +\n crypto/cipher-gcrypt.c                             |  10 +-\n crypto/cipher-nettle.c                             |  14 +-\n crypto/cipher.c                                    |  13 +-\n hmp.c                                              |   9 +-\n hw/s390x/s390-skeys.c                              |   2 +-\n hw/timer/mc146818rtc.c                             |   2 +-\n migration/colo.c                                   |  16 +-\n monitor.c                                          |  73 +---\n qga/main.c                                         |   1 +\n qmp.c                                              |  72 +---\n qobject/qlit.c                                     |  36 ++\n stubs/arch-query-cpu-def.c                         |  10 -\n stubs/arch-query-cpu-model-baseline.c              |  12 -\n stubs/arch-query-cpu-model-comparison.c            |  12 -\n stubs/arch-query-cpu-model-expansion.c             |  12 -\n target/arm/helper.c                                |   3 +-\n target/arm/monitor.c                               |   2 +-\n target/i386/cpu.c                                  |   5 +-\n target/ppc/translate_init.c                        |   3 +-\n target/s390x/cpu_models.c                          |   9 +-\n tests/check-qlit.c                                 |  26 ++\n tests/test-crypto-cipher.c                         |   2 +\n tests/test-qmp-commands.c                          |   7 +\n tests/test-qobject-input-visitor.c                 |  10 +-\n Makefile                                           |  29 +-\n Makefile.objs                                      |   3 +-\n Makefile.target                                    |   4 +\n docs/devel/qapi-code-gen.txt                       |  69 +++-\n hmp-commands-info.hx                               |   2 +\n stubs/Makefile.objs                                |   4 -\n tests/Makefile.include                             |  10 +-\n tests/qapi-schema/alternate-dict-invalid.err       |   1 +\n ...ict-member.exit => alternate-dict-invalid.exit} |   0\n tests/qapi-schema/alternate-dict-invalid.json      |   4 +\n ...-dict-member.out => alternate-dict-invalid.out} |   0\n tests/qapi-schema/bad-if-empty-list.err            |   1 +\n tests/qapi-schema/bad-if-empty-list.exit           |   1 +\n tests/qapi-schema/bad-if-empty-list.json           |   3 +\n tests/qapi-schema/bad-if-empty-list.out            |   0\n tests/qapi-schema/bad-if-empty.err                 |   1 +\n tests/qapi-schema/bad-if-empty.exit                |   1 +\n tests/qapi-schema/bad-if-empty.json                |   3 +\n tests/qapi-schema/bad-if-empty.out                 |   0\n tests/qapi-schema/bad-if.err                       |   1 +\n tests/qapi-schema/bad-if.exit                      |   1 +\n tests/qapi-schema/bad-if.json                      |   3 +\n tests/qapi-schema/bad-if.out                       |   0\n tests/qapi-schema/comments.out                     |  14 +-\n tests/qapi-schema/doc-good.out                     |  17 +-\n tests/qapi-schema/empty.out                        |   9 +-\n tests/qapi-schema/enum-dict-member-invalid.err     |   1 +\n tests/qapi-schema/enum-dict-member-invalid.exit    |   1 +\n tests/qapi-schema/enum-dict-member-invalid.json    |   2 +\n tests/qapi-schema/enum-dict-member-invalid.out     |   0\n tests/qapi-schema/enum-dict-member-invalid2.err    |   1 +\n tests/qapi-schema/enum-dict-member-invalid2.exit   |   1 +\n tests/qapi-schema/enum-dict-member-invalid2.json   |   2 +\n tests/qapi-schema/enum-dict-member-invalid2.out    |   0\n tests/qapi-schema/enum-dict-member.err             |   1 -\n tests/qapi-schema/enum-dict-member.json            |   2 -\n tests/qapi-schema/enum-if-invalid.err              |   1 +\n tests/qapi-schema/enum-if-invalid.exit             |   1 +\n tests/qapi-schema/enum-if-invalid.json             |   3 +\n tests/qapi-schema/enum-if-invalid.out              |   0\n tests/qapi-schema/event-case.out                   |   9 +-\n tests/qapi-schema/ident-with-escape.out            |   9 +-\n tests/qapi-schema/include-relpath.out              |  14 +-\n tests/qapi-schema/include-repetition.out           |  14 +-\n tests/qapi-schema/include-simple.out               |  14 +-\n tests/qapi-schema/indented-expr.out                |   9 +-\n tests/qapi-schema/qapi-schema-test.json            |  36 ++\n tests/qapi-schema/qapi-schema-test.out             |  93 +++++-\n tests/qapi-schema/struct-if-invalid.err            |   1 +\n tests/qapi-schema/struct-if-invalid.exit           |   1 +\n tests/qapi-schema/struct-if-invalid.json           |   3 +\n tests/qapi-schema/struct-if-invalid.out            |   0\n tests/qapi-schema/struct-member-type.err           |   0\n tests/qapi-schema/struct-member-type.exit          |   1 +\n tests/qapi-schema/struct-member-type.json          |   2 +\n tests/qapi-schema/struct-member-type.out           |  12 +\n tests/qapi-schema/test-qapi.py                     |  43 ++-\n 99 files changed, 1328 insertions(+), 735 deletions(-)\n create mode 100644 qapi/target.json\n delete mode 100644 stubs/arch-query-cpu-def.c\n delete mode 100644 stubs/arch-query-cpu-model-baseline.c\n delete mode 100644 stubs/arch-query-cpu-model-comparison.c\n delete mode 100644 stubs/arch-query-cpu-model-expansion.c\n create mode 100644 tests/qapi-schema/alternate-dict-invalid.err\n rename tests/qapi-schema/{enum-dict-member.exit => alternate-dict-invalid.exit} (100%)\n create mode 100644 tests/qapi-schema/alternate-dict-invalid.json\n rename tests/qapi-schema/{enum-dict-member.out => alternate-dict-invalid.out} (100%)\n create mode 100644 tests/qapi-schema/bad-if-empty-list.err\n create mode 100644 tests/qapi-schema/bad-if-empty-list.exit\n create mode 100644 tests/qapi-schema/bad-if-empty-list.json\n create mode 100644 tests/qapi-schema/bad-if-empty-list.out\n create mode 100644 tests/qapi-schema/bad-if-empty.err\n create mode 100644 tests/qapi-schema/bad-if-empty.exit\n create mode 100644 tests/qapi-schema/bad-if-empty.json\n create mode 100644 tests/qapi-schema/bad-if-empty.out\n create mode 100644 tests/qapi-schema/bad-if.err\n create mode 100644 tests/qapi-schema/bad-if.exit\n create mode 100644 tests/qapi-schema/bad-if.json\n create mode 100644 tests/qapi-schema/bad-if.out\n create mode 100644 tests/qapi-schema/enum-dict-member-invalid.err\n create mode 100644 tests/qapi-schema/enum-dict-member-invalid.exit\n create mode 100644 tests/qapi-schema/enum-dict-member-invalid.json\n create mode 100644 tests/qapi-schema/enum-dict-member-invalid.out\n create mode 100644 tests/qapi-schema/enum-dict-member-invalid2.err\n create mode 100644 tests/qapi-schema/enum-dict-member-invalid2.exit\n create mode 100644 tests/qapi-schema/enum-dict-member-invalid2.json\n create mode 100644 tests/qapi-schema/enum-dict-member-invalid2.out\n delete mode 100644 tests/qapi-schema/enum-dict-member.err\n delete mode 100644 tests/qapi-schema/enum-dict-member.json\n create mode 100644 tests/qapi-schema/enum-if-invalid.err\n create mode 100644 tests/qapi-schema/enum-if-invalid.exit\n create mode 100644 tests/qapi-schema/enum-if-invalid.json\n create mode 100644 tests/qapi-schema/enum-if-invalid.out\n create mode 100644 tests/qapi-schema/struct-if-invalid.err\n create mode 100644 tests/qapi-schema/struct-if-invalid.exit\n create mode 100644 tests/qapi-schema/struct-if-invalid.json\n create mode 100644 tests/qapi-schema/struct-if-invalid.out\n create mode 100644 tests/qapi-schema/struct-member-type.err\n create mode 100644 tests/qapi-schema/struct-member-type.exit\n create mode 100644 tests/qapi-schema/struct-member-type.json\n create mode 100644 tests/qapi-schema/struct-member-type.out"
}