)]}'
{
  "log": [
    {
      "commit": "a3b9b949c5e29f42862cbc8fd26eb8062253b301",
      "tree": "f45ad49246119f769c39317557f7d13f8268f180",
      "parents": [
        "40505d88804e13754ae2cc97ba460ad98cd72e71"
      ],
      "author": {
        "name": "Mark Molinaro",
        "email": "mmolinaro@pinterest.com",
        "time": "Thu Apr 02 07:11:42 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Apr 09 01:45:44 2026 +0200"
      },
      "message": "Optimize Python C extension readStruct for nested structs\n\nIn this area of code, there already exists an optimization where we skip calling `klass(**kwargs)` on the top-level struct and instead init an empty object then PyObject_SetAttr the properties onto it.\u2028\u2028This was done because Python\u0027s keyword\nargument matching is O(n) string comparisons per argument, making this expensive for structs with many fields.\n\nHowever, nested structs which are decoded within the C extension did not get this same optimization, causing them to go through the slow class initialization path.\n\nIn this change, for mutable nested structs, we create the instance up front with a no-arg constructor (klass()) and set decoded fields directly via PyObject_SetAttr (the same way we fast-path the top-level struct).\n\nImmutable structs (TFrozenBase subclasses) continue to use the kwargs\npath since their generated __setattr__ blocks attribute mutation.\n\nImmutability is detected via PyObject_IsSubclass against TFrozenBase,\nwith the class reference cached in a function-local static.\n\nBenchmarks show up to 3.6x speedup for deeply nested struct hierarchies, with no impact on flat structs. I had Claude generate me some benchmarks to showcase performance in different nested scenarios.\u2028\u2028Note the test change. I asked about potentially changing this to look more like what the codegen produces here https://github.com/apache/thrift/pull/3349/changes#r3026288637. Currently, this fails because its not marked as frozen but has a erroring setattr\n"
    },
    {
      "commit": "a715bdffaa805baae5b0b994231556b566ca326c",
      "tree": "cec57938935b441816402e474c37d1ba1ea25e92",
      "parents": [
        "6f182854d7a5f3cfc110c875d6decd3bafd1689f"
      ],
      "author": {
        "name": "Carel Combrink",
        "email": "carel.combrink@gmail.com",
        "time": "Thu Oct 30 07:44:21 2025 +0100"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Mar 11 22:39:49 2026 +0100"
      },
      "message": "THRIFT-5923: UUID python\nClient: py\nPatch: CJCombrink\n\nThis closes #3330\n"
    },
    {
      "commit": "62ec929629bed63d968a25a16085080a227a8abf",
      "tree": "fe1e5f762936622a1d4f322c3fefcb238715f92b",
      "parents": [
        "dbdb429a8ca338d8b9bb082214a246cc61faca90"
      ],
      "author": {
        "name": "Gregg Donovan",
        "email": "gdonovan@etsy.com",
        "time": "Thu Jan 29 16:51:37 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 29 13:51:37 2026 -0800"
      },
      "message": "Fix Python 3.12 build issues in thrift Python (#3276)\n\n- Add pyproject.toml with setuptools build requirement for PEP 517 compliance\n- Replace distutils imports with setuptools equivalents\n- Use setuptools error names directly (CompileError, ExecError, PlatformError)\n- Fix macOS header collision with ntohll/htonll macros in endian.h\n- Add a matrix of MacOS versions (macos-15-intel, macos-14, macos-15,\n  macos-26)\n- Add a matrix of non-EOL Python versions for testing\n- Remove MSVC2015 from the test matrix (very old).\n- Support MSVC2022, the latest in AppVeyor.\n- Upgrade tornado, twisted, and zope.interface versions to the first\n  that support Python 3.12.\n- Try to make the test_socket, RunClientServer, and TestServer tests less flaky.\n\nThis fixes the ModuleNotFoundError: No module named \u0027distutils\u0027 error\nwhen building thrift with Python 3.12+."
    },
    {
      "commit": "55bc35f5d581f61f8dac816eb17493911ff8e75a",
      "tree": "fea3daf5c7500bd7d99051e11f95609cbb739e86",
      "parents": [
        "a6ee3c0b1d0e7fcbaa439c573e370fa129e3c7b5"
      ],
      "author": {
        "name": "Shaoyu Zhang",
        "email": "zsy056@users.noreply.github.com",
        "time": "Tue Nov 25 13:59:16 2025 -0800"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Fri Nov 28 22:59:13 2025 +0100"
      },
      "message": "fix py ext windows build\n"
    },
    {
      "commit": "c5a371280cc89a927e7278486233b16b189c6e9e",
      "tree": "de3393932b6d7b57eae7283923c700aafe8b6588",
      "parents": [
        "ac3feed1b24389efbc0865b742be1854be0406dc"
      ],
      "author": {
        "name": "Lysandros Nikolaou",
        "email": "lisandrosnik@gmail.com",
        "time": "Fri Jul 25 15:11:44 2025 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Nov 23 14:52:12 2025 +0100"
      },
      "message": "THRIFT-5888 Do not dynamically enable the GIL under free-threaded Python\nClient: py\nPatch: Lysandros Nikolaou\n\nThis closes #3180\n"
    },
    {
      "commit": "1e17c93555b680d4719ba61965c088590a2053dd",
      "tree": "1964a9a00a8c0fa87cf886dbd9aae8fcde92ed82",
      "parents": [
        "5b096a00027582983f1ae141a4bbf4eed806c310"
      ],
      "author": {
        "name": "George Koehler",
        "email": "kernigh@gmail.com",
        "time": "Mon Feb 06 18:08:05 2023 -0500"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Nov 20 22:52:36 2025 +0100"
      },
      "message": "rewrite the endian conversion to fix a big-endian host\nClient: py\n\nChange htolell(dub) to htolell(transfer.t) in compact.h, because the\nconversion takes a long long, not a double.  This matters on a\nbig-endian host, where the conversion must swap bytes.\n\nThe big-endian letohll(n) failed because ntohl(n) is just n, doesn\u0027t\nswap n.  Rewrite ntohll(n) and letohll(n) to use the same code with\nboth big-endian and little-endian hosts.  Expect the compiler to\noptimize away one of ntohll(n) or letohll(n) when it doesn\u0027t swap n.\n"
    },
    {
      "commit": "37c7910072de4bf282f95f7c64f91155d6f2ce7e",
      "tree": "538255b51699481f3a3ea092c882c7c048b758d2",
      "parents": [
        "5501e8f84b7e735f1592b86492ab785a2f401bcf"
      ],
      "author": {
        "name": "Csaba Ringhofer",
        "email": "csringhofer@cloudera.com",
        "time": "Mon Sep 15 14:40:17 2025 +0200"
      },
      "committer": {
        "name": "Yuxuan \u0027fishy\u0027 Wang",
        "email": "fishywang@gmail.com",
        "time": "Tue Sep 16 18:23:18 2025 -0700"
      },
      "message": "THRIFT-5892: Always define PY_SSIZE_T_CLEAN before including Python.h\n\nThe error THRIFT-5488 tried to solve resurfaced in a spefic\nenvironment: Python3.11.13, chainguard based docker image, GCC 15\n\nDefining PY_SSIZE_T_CLEAN in module.cpp fixed the issue in that\nenvironment. Also defined it in types.cpp to consistently define\nit before including Python.h, which seems to be the recommended way:\nhttps://docs.python.org/3.11/c-api/intro.html#include-files\n\nIt is not clear to me why this was a problem in some environments\nand not in others. My guess is that including Python.h with different\ndefines leads to different behavior based on GCC version and options.\n"
    },
    {
      "commit": "50819ce8ef72ad7ccf79c6c3fb3b77a91ab8e540",
      "tree": "90f099118ebed5c25ef0d66fd01db1bc5b4c6f1c",
      "parents": [
        "3cac3204519bbdfe02beb9d863e9b873cdaf9d07"
      ],
      "author": {
        "name": "Jeremiah",
        "email": "4462211+jeremiahpslewis@users.noreply.github.com",
        "time": "Tue Feb 08 12:46:45 2022 +0100"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Tue Feb 08 20:33:32 2022 +0100"
      },
      "message": "Fix winsock capitalization for case sensitive cross-compilation"
    },
    {
      "commit": "b724787d373de99fee2222ab0eb2e052f8c8d3ed",
      "tree": "fe886e30b4d74d6f2595243c0d90b7cd892ecba4",
      "parents": [
        "c6c5a0596ffc441e6cd1ad60130cdcdcb2e319e4"
      ],
      "author": {
        "name": "Ali-Akber Saifee",
        "email": "ali@indydevs.org",
        "time": "Sat Dec 11 08:39:24 2021 -0800"
      },
      "committer": {
        "name": "Yuxuan \u0027fishy\u0027 Wang",
        "email": "fishywang@gmail.com",
        "time": "Thu Dec 16 13:12:44 2021 -0800"
      },
      "message": "Define PY_SSIZE_T_CLEAN to use PyObject_CallFunction\n\nWhen using the building functions for the fallback scenario\nin readBytes, a SystemError is raised in python 3.10 (raised\nas a warning till python 3.9) due to the use of \"#yi\" for the output\nbuffer argument.\n\nExtra test cases are added to cover serialization/deserialization\nboth with compact \u0026 binary protocol both with and without the\nc-extension\n"
    },
    {
      "commit": "05bb55148608b4324a8c91c21cf9a6a0dff282fa",
      "tree": "187c6dcc7e81638746d9e15850ce441adaf290b7",
      "parents": [
        "196254ba393a7e70e91fcf3c35026c82fb64f7fa"
      ],
      "author": {
        "name": "stiga-huang",
        "email": "huangquanlong@gmail.com",
        "time": "Fri Oct 30 20:07:31 2020 +0800"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Nov 01 18:17:18 2020 +0100"
      },
      "message": "THRIFT-5303 Fix missing error handling in using PyUnicode_DecodeUTF8\nClient: py\nPatch: stiga-huang\n\nThis closes #2269\n"
    },
    {
      "commit": "26681fbdb77f6dfaf2f2613d4ad860a224e84b71",
      "tree": "b742ea0959bd5e90e1748323a870291ef8ad8e9f",
      "parents": [
        "3f78c70bbba82c733b1545d39eb5b489ac384e4c"
      ],
      "author": {
        "name": "zeshuai007",
        "email": "51382517@qq.com",
        "time": "Wed Jun 03 17:24:38 2020 +0800"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Jun 14 14:17:11 2020 +0200"
      },
      "message": "THRIFT-5225: Use nullptr instead of NULL\nPatch: Zezeng Wang\n\nThis closes #2168\n"
    },
    {
      "commit": "cf73b66cd83e2e883d00dff518d3c0250bb839cc",
      "tree": "2af7cc603c0fd3b53a3280fcd117414925f9e2e4",
      "parents": [
        "bc75467e4426c76d201c83621f08fa211660b6c3"
      ],
      "author": {
        "name": "Kevin Wojniak",
        "email": "kainjow@users.noreply.github.com",
        "time": "Sat Nov 02 22:01:56 2019 -0700"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Nov 03 18:42:11 2019 +0100"
      },
      "message": "Remove unused exception variable\nClient: Python\nPatch: Kevin Wojniak\n\nThis closes #1912\n\nFixes MSVC warning seen in logs:\n\u003e [00:11:03] src\\ext/protocol.tcc(177): warning C4101: \u0027ex\u0027: unreferenced\n\u003e local variable [C:\\projects\\build\\MSVC2015\\x86\\lib\\py\\python_build.vcxproj]\n"
    },
    {
      "commit": "53bd0e6295547e76ab00913cfd62f8d040bd996c",
      "tree": "b6415302e64a3a275a3e6484bd2e3968c8d1ba19",
      "parents": [
        "2be45e566dd490aabf7a45ec3474545a0817024e"
      ],
      "author": {
        "name": "James E. King III",
        "email": "jking@apache.org",
        "time": "Thu Jan 31 17:11:04 2019 -0500"
      },
      "committer": {
        "name": "James E. King III",
        "email": "jking@apache.org",
        "time": "Fri Feb 01 11:13:49 2019 -0500"
      },
      "message": "THRIFT-4745: fixes compiler warnings\n"
    },
    {
      "commit": "0f43f95b89db01a8c68225824f8aa7fd4522007e",
      "tree": "3a08b4fc6b567a7aa8fde17c2e3ddf72e78e4365",
      "parents": [
        "8cb3b6854818bf63d3208afaf4dc9e70c6137500"
      ],
      "author": {
        "name": "cyy",
        "email": "cyyever@outlook.com",
        "time": "Sat Jan 05 19:27:00 2019 +0800"
      },
      "committer": {
        "name": "James E. King III",
        "email": "jking@apache.org",
        "time": "Mon Jan 07 08:11:37 2019 -0500"
      },
      "message": "revert noexcept changings\n"
    },
    {
      "commit": "316723add4c368ffd144dd5beb55245832e073fa",
      "tree": "4dc5c86e776e4818ba5fb102e33eb62cfeb8382f",
      "parents": [
        "52637b33aba090851436b2031476529423ea3281"
      ],
      "author": {
        "name": "cyy",
        "email": "cyyever@outlook.com",
        "time": "Sat Jan 05 16:35:14 2019 +0800"
      },
      "committer": {
        "name": "James E. King III",
        "email": "jking@apache.org",
        "time": "Mon Jan 07 08:11:37 2019 -0500"
      },
      "message": "remove stdcxx namespace and use std directly\n"
    },
    {
      "commit": "9b75e4fe745a9b08e6ccdc0998ec7a69272f5b4c",
      "tree": "747d56c669ceafbea6dc5955e8622cc39e6fa1cf",
      "parents": [
        "56ac72e74ae354c286c41f5d5a3c0b8723feb587"
      ],
      "author": {
        "name": "James E. King III",
        "email": "jking@apache.org",
        "time": "Mon Dec 17 16:21:14 2018 -0500"
      },
      "committer": {
        "name": "James E. King III",
        "email": "jking@apache.org",
        "time": "Tue Dec 18 10:17:57 2018 -0500"
      },
      "message": "THRIFT-4680: fix up std::min, std::max, and numeric limits min/max on Windows; remove NOMINMAX from cmake build\n"
    },
    {
      "commit": "0ad20bdbfe9abcbb0cc5332ff95651b5c975da91",
      "tree": "7e713c9380844afe41019a7c6ebe4e508eba3464",
      "parents": [
        "8b8a8efea13d1c97f856053af0a5c0e6a8a76354"
      ],
      "author": {
        "name": "James E. King, III",
        "email": "jking@apache.org",
        "time": "Sat Sep 30 15:44:16 2017 -0700"
      },
      "committer": {
        "name": "James E. King, III",
        "email": "jking@apache.org",
        "time": "Thu Oct 19 11:29:04 2017 -0400"
      },
      "message": "THRIFT-4351: use travis build stages to optimize build,\navoiding duplicate rebuilds of the same image, and also\nallow personal docker hub repositories for private fork\nbuilds to be optimized. Move ubsan build to artful image\nbecause it catches more stuff and fix what was found.\n\nTHRIFT-4345: solidify docker build strategy for maximum\ncoverage: trusty, xenial, artful as stock as they can be\n\nTHRIFT-4344: add top level language summary markdown and\nupdate readme with a new image on the layered architecture\n\nTHRIFT-3847: remove VERSION macro from config.h which\nwas causing a conflict on artful builds.\n\nTHRIFT-4359: fix haxe map/set decode when key is binary,\nas a missing break statement caused it to use an int\nduring decode\n\nThis closes #1389\n"
    },
    {
      "commit": "d7142b7e4fe114c13d8235a7c47f58947f916bff",
      "tree": "d1f6ce9e74787245d69c205238211739974b0b24",
      "parents": [
        "f454369198500a90388a4a6f73970e961949c186"
      ],
      "author": {
        "name": "James E. King, III",
        "email": "jking@apache.org",
        "time": "Fri Sep 01 13:00:36 2017 -0700"
      },
      "committer": {
        "name": "James E. King, III",
        "email": "jking@apache.org",
        "time": "Mon Sep 04 18:09:34 2017 -0700"
      },
      "message": "THRIFT-4295: rework the docker build images, updating them and tuning the travis builds\n\nThis closes #1340\n"
    },
    {
      "commit": "c34653f75106fbe20293ddfd5b07f74772891a6d",
      "tree": "2a844527515654b65d8f1bfac9c68a2484c535f9",
      "parents": [
        "49e5103920e75a149d02c7d487496c8c79154a6c"
      ],
      "author": {
        "name": "Eric Conner",
        "email": "eric@pinterest.com",
        "time": "Wed Jun 21 03:34:12 2017 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Jul 06 22:59:10 2017 +0200"
      },
      "message": "THRIFT-2642 Recursive structs don\u0027t work in python\nClient: Python\nPatch: Eric Conner \u003ceric@pinterest.com\u003e\n\nThis closes #1293\n"
    },
    {
      "commit": "07f59971bd11df619709444275298061ee69f707",
      "tree": "197adaaede4f594115899dc409a30d2d842195d3",
      "parents": [
        "9b1544dc21f2d952b91c44e4636e1b9da937002c"
      ],
      "author": {
        "name": "James E. King, III",
        "email": "jking@apache.org",
        "time": "Fri Mar 10 06:18:33 2017 -0500"
      },
      "committer": {
        "name": "James E. King, III",
        "email": "jking@apache.org",
        "time": "Fri Mar 10 06:18:33 2017 -0500"
      },
      "message": "THRIFT-4081: appveyor retooling - added mingw64 build as a second job to the CI build process\n\nThis closes #1205\n"
    },
    {
      "commit": "6657b8337d1aedfd2aed22a8cdcf4b96965ece26",
      "tree": "ac6bb5967a9e3baa8afa96a7d3a50698acc2f00e",
      "parents": [
        "4ab9a88496413087df1ee3256472b19c5b4be500"
      ],
      "author": {
        "name": "Chandler May",
        "email": "cjmay4754@gmail.com",
        "time": "Sun Mar 27 22:47:06 2016 -0400"
      },
      "committer": {
        "name": "Nobuaki Sukegawa",
        "email": "nsuke@apache.org",
        "time": "Tue Mar 29 12:03:34 2016 +0900"
      },
      "message": "THRIFT-3765 fix memory leak in python compact protocol extension\n\nThis closes #970\n"
    },
    {
      "commit": "f7a8d946a0b22d0acce1325d2607c38597b36a58",
      "tree": "281b6db3dfea2ec5552198ed8e51dac52ca66415",
      "parents": [
        "3dd4d8eca8c1d20819fb58fa863b83bd348cf411"
      ],
      "author": {
        "name": "Nobuaki Sukegawa",
        "email": "nsuke@apache.org",
        "time": "Tue Mar 01 01:41:47 2016 +0900"
      },
      "committer": {
        "name": "Nobuaki Sukegawa",
        "email": "nsuke@apache.org",
        "time": "Wed Mar 02 23:44:23 2016 +0900"
      },
      "message": "THRIFT-3699 Fix integer limit symbol includes in Python C extension\n\nThis closes #915\n"
    },
    {
      "commit": "7efa4fb9b10c9c42dcef1143918e308d9dfd6c58",
      "tree": "d1129523200bd4c40a8962da6d6827b201273f5b",
      "parents": [
        "23ffb312900bbbadf49dfee270391803e194a436"
      ],
      "author": {
        "name": "Nobuaki Sukegawa",
        "email": "nsuke@apache.org",
        "time": "Fri Feb 19 00:59:57 2016 +0900"
      },
      "committer": {
        "name": "Nobuaki Sukegawa",
        "email": "nsuke@apache.org",
        "time": "Sat Feb 20 00:45:35 2016 +0900"
      },
      "message": "THRIFT-3646 Fix Python extension build warnings\nClient: Python\nPatch: Nobuaki Sukegawa\n\nThis closes #877\n"
    },
    {
      "commit": "7af189a2366383538bb9aae394fd5f735976f1d5",
      "tree": "9e9fd94cda9dd673250cc6d6c1b279c83f3ae1c1",
      "parents": [
        "6525f6ae8786a2bcb596e471efb1d76ae74aabee"
      ],
      "author": {
        "name": "Nobuaki Sukegawa",
        "email": "nsuke@apache.org",
        "time": "Thu Feb 11 16:21:01 2016 +0900"
      },
      "committer": {
        "name": "Nobuaki Sukegawa",
        "email": "nsuke@apache.org",
        "time": "Sat Feb 13 23:12:34 2016 +0900"
      },
      "message": "THRIFT-3613 Port Python C extension to Python 3\nClient: Python\nPatch: Nobuaki Sukegawa\n\nThis closes #845\n"
    },
    {
      "commit": "6525f6ae8786a2bcb596e471efb1d76ae74aabee",
      "tree": "80c5a5037d166c8ada55d97d4e98d36bff632155",
      "parents": [
        "41e8cbf6866bf9b8ec6d5bbc157a1fb970d8c3cc"
      ],
      "author": {
        "name": "Nobuaki Sukegawa",
        "email": "nsuke@apache.org",
        "time": "Thu Feb 11 13:58:39 2016 +0900"
      },
      "committer": {
        "name": "Nobuaki Sukegawa",
        "email": "nsuke@apache.org",
        "time": "Sat Feb 13 23:12:34 2016 +0900"
      },
      "message": "THRIFT-3612 Add Python C extension for compact protocol\nClient: Python\nPatch: Nobuaki Sukegawa\n\nThis closes #844\n"
    }
  ]
}
